{"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-aa6be4518562516a", "name": "Stray `console.log` in TS/JS \u2014 scripts/load-test-node.js:135", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/load-test-node.js:135"}, "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-b6b30bb43fee9012", "name": "Stray `console.log` in TS/JS \u2014 scripts/math-check.js:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/math-check.js:48"}, "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-d09c8dae099ba972", "name": "Stray `console.log` in TS/JS \u2014 scripts/ws-stability-test.js:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/ws-stability-test.js:54"}, "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-e6e54b92cff363d2", "name": "Stray `console.log` in TS/JS \u2014 lib/liveQuotes.ts:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/liveQuotes.ts:66"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d073b34c077962ae", "name": "Stray `console.log` in TS/JS \u2014 lib/notifications.ts:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/notifications.ts:91"}, "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-5a32ac60613087ac", "name": "Runtime dotenv file present in repo: .env.production", "shortDescription": {"text": "Runtime dotenv file present in repo: .env.production"}, "fullDescription": {"text": "`.env.production` looks like a runtime dotenv file. It contains secret-looking assignments for EXPO_PUBLIC_SUPABASE_ANON_KEY, EXPO_PUBLIC_SENTRY_DSN. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-e735be767e0d9e44", "name": "Possible secret in e2e/smoke.spec.ts", "shortDescription": {"text": "Possible secret in e2e/smoke.spec.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-1dd7c2e1a1e1fd5a", "name": "Possible secret in e2e/limit-order.spec.ts", "shortDescription": {"text": "Possible secret in e2e/limit-order.spec.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-d0a404615f02ab2c", "name": "Possible secret in e2e/quick-mode.spec.ts", "shortDescription": {"text": "Possible secret in e2e/quick-mode.spec.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-31a2d1c35e75f25d", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-65c9bd56493a81d3", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "20 tests / 126 src (ratio 0.16)."}, "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 113 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 41 placeholder/mock markers across 17 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.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-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.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-0836f45a92ddf4c9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 stores/watchlist.ts:4", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 stores/watchlist.ts:4"}, "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-5392d15abe47a881", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/pro/Chart.tsx:582", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/pro/Chart.tsx:582"}, "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-84fade97772d747f", "name": "Commented-code block (5 lines) in components/pro/OrderEntry.tsx:107", "shortDescription": {"text": "Commented-code block (5 lines) in components/pro/OrderEntry.tsx:107"}, "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-06fdbc50eabf5882", "name": "Commented-code block (5 lines) in components/fun/ActiveRounds.tsx:254", "shortDescription": {"text": "Commented-code block (5 lines) in components/fun/ActiveRounds.tsx:254"}, "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-d8433ab7f9767fcb", "name": "Commented-code block (5 lines) in app/_layout.tsx:15", "shortDescription": {"text": "Commented-code block (5 lines) in app/_layout.tsx:15"}, "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-719d37d2cbebaa83", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/kyc.ts:84", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/kyc.ts:84"}, "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-24859e6a31b2892c", "name": "Commented-code block (10 lines) in server/src/ai/robotEngine.ts:133", "shortDescription": {"text": "Commented-code block (10 lines) in server/src/ai/robotEngine.ts:133"}, "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-771b10d680a0eb15", "name": "Commented-code block (6 lines) in server/src/feed/pricefeed.ts:8", "shortDescription": {"text": "Commented-code block (6 lines) in server/src/feed/pricefeed.ts:8"}, "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-0def363b27e3b981", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/feed/pricefeed.ts:288", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/feed/pricefeed.ts:288"}, "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-43b695ce9c67c21e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/lib/supabase.ts:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/lib/supabase.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-6d4fd24ccce854aa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/auth.ts:88", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/auth.ts:88"}, "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-5341669505dc5577", "name": "Commented-code block (6 lines) in server/src/routes/robots.ts:30", "shortDescription": {"text": "Commented-code block (6 lines) in server/src/routes/robots.ts:30"}, "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-a10605dabe3bc354", "name": "Commented-code block (7 lines) in server/src/routes/bars.ts:102", "shortDescription": {"text": "Commented-code block (7 lines) in server/src/routes/bars.ts:102"}, "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-9a7dddc455390cf9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/bars.ts:206", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/bars.ts:206"}, "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-6fa6131b09c0a7be", "name": "Commented-code block (5 lines) in server/src/routes/traders.ts:92", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/routes/traders.ts:92"}, "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-e8578cb0b6260713", "name": "Commented-code block (5 lines) in server/src/routes/orders.ts:223", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/routes/orders.ts:223"}, "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-af10f44af038e4b3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/sessions.ts:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/sessions.ts:20"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5b9a162e668e7ef5", "name": "Commented-code block (5 lines) in server/src/workers/rounds.ts:183", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/workers/rounds.ts:183"}, "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-f808a4ef3e1071fb", "name": "14 env vars used in code but missing from .env.example", "shortDescription": {"text": "14 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `BASE_URL`, `CONCURRENCY`, `DURATION`, `DURATION_S`, `MAX_AGE_HOURS`, `OUT_DIR`, `RAILWAY_ENVIRONMENT`, `SENTRY_DSN` + 6 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-8707577c5df3e420", "name": "Dangling fetch: POST /api/account/init (stores/account.ts:83)", "shortDescription": {"text": "Dangling fetch: POST /api/account/init (stores/account.ts:83)"}, "fullDescription": {"text": "`stores/account.ts:83` calls `POST /api/account/init` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/account/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-40e35ed3bad4adf8", "name": "Dangling fetch: GET /api/traders/me (components/robots/CopyTrading.tsx:44)", "shortDescription": {"text": "Dangling fetch: GET /api/traders/me (components/robots/CopyTrading.tsx:44)"}, "fullDescription": {"text": "`components/robots/CopyTrading.tsx:44` calls `GET /api/traders/me` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/traders/me`\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-9a3c8e74151266fe", "name": "Dangling fetch: PATCH /api/traders/opt-in (components/robots/CopyTrading.tsx:72)", "shortDescription": {"text": "Dangling fetch: PATCH /api/traders/opt-in (components/robots/CopyTrading.tsx:72)"}, "fullDescription": {"text": "`components/robots/CopyTrading.tsx:72` calls `PATCH /api/traders/opt-in` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/traders/opt-in`\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-440d32108ee84193", "name": "Dangling fetch: POST /api/traders/follow (components/robots/CopyTrading.tsx:93)", "shortDescription": {"text": "Dangling fetch: POST /api/traders/follow (components/robots/CopyTrading.tsx:93)"}, "fullDescription": {"text": "`components/robots/CopyTrading.tsx:93` calls `POST /api/traders/follow` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/traders/follow`\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-55efba59e8b2abcc", "name": "Dangling fetch: DELETE /api/traders/follow/${encodeURIComponent(leader.leaderId)} (components/robots/CopyTrading.tsx:112", "shortDescription": {"text": "Dangling fetch: DELETE /api/traders/follow/${encodeURIComponent(leader.leaderId)} (components/robots/CopyTrading.tsx:112)"}, "fullDescription": {"text": "`components/robots/CopyTrading.tsx:112` calls `DELETE /api/traders/follow/${encodeURIComponent(leader.leaderId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/traders/follow/<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-a8afa7f7afd499c3", "name": "Dangling fetch: POST /api/orders/open (lib/api.ts:88)", "shortDescription": {"text": "Dangling fetch: POST /api/orders/open (lib/api.ts:88)"}, "fullDescription": {"text": "`lib/api.ts:88` calls `POST /api/orders/open` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/orders/open`\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-4be0a95ffc806ac0", "name": "Dangling fetch: POST /api/orders/close (lib/api.ts:91)", "shortDescription": {"text": "Dangling fetch: POST /api/orders/close (lib/api.ts:91)"}, "fullDescription": {"text": "`lib/api.ts:91` calls `POST /api/orders/close` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/orders/close`\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-d784c758361b5ce0", "name": "Dangling fetch: DELETE /api/orders/pending/${tradeId} (lib/api.ts:98)", "shortDescription": {"text": "Dangling fetch: DELETE /api/orders/pending/${tradeId} (lib/api.ts:98)"}, "fullDescription": {"text": "`lib/api.ts:98` calls `DELETE /api/orders/pending/${tradeId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/orders/pending/<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-357ab37417bbaa97", "name": "Dangling fetch: PATCH /api/orders/modify/${tradeId} (lib/api.ts:105)", "shortDescription": {"text": "Dangling fetch: PATCH /api/orders/modify/${tradeId} (lib/api.ts:105)"}, "fullDescription": {"text": "`lib/api.ts:105` calls `PATCH /api/orders/modify/${tradeId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/orders/modify/<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-6ab9200a1d2207cb", "name": "Dangling fetch: POST /api/rounds/open (lib/api.ts:116)", "shortDescription": {"text": "Dangling fetch: POST /api/rounds/open (lib/api.ts:116)"}, "fullDescription": {"text": "`lib/api.ts:116` calls `POST /api/rounds/open` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/rounds/open`\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-34f06d3635f8c519", "name": "Dangling fetch: POST /api/robots/compile (lib/api.ts:119)", "shortDescription": {"text": "Dangling fetch: POST /api/robots/compile (lib/api.ts:119)"}, "fullDescription": {"text": "`lib/api.ts:119` calls `POST /api/robots/compile` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/robots/compile`\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-17d0a74cf48b5112", "name": "Dangling fetch: POST /api/robots/save (lib/api.ts:125)", "shortDescription": {"text": "Dangling fetch: POST /api/robots/save (lib/api.ts:125)"}, "fullDescription": {"text": "`lib/api.ts:125` calls `POST /api/robots/save` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/robots/save`\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-9ac5597a30459e8b", "name": "Dangling fetch: GET /api/robots/${id} (lib/api.ts:131)", "shortDescription": {"text": "Dangling fetch: GET /api/robots/${id} (lib/api.ts:131)"}, "fullDescription": {"text": "`lib/api.ts:131` calls `GET /api/robots/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/robots/<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-1cde3df044a63c63", "name": "Dangling fetch: GET /api/robots/${id}/runs (lib/api.ts:134)", "shortDescription": {"text": "Dangling fetch: GET /api/robots/${id}/runs (lib/api.ts:134)"}, "fullDescription": {"text": "`lib/api.ts:134` calls `GET /api/robots/${id}/runs` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/robots/<p>/runs`\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-13a94d5a352df3cb", "name": "Dangling fetch: PATCH /api/robots/${id}/status (lib/api.ts:137)", "shortDescription": {"text": "Dangling fetch: PATCH /api/robots/${id}/status (lib/api.ts:137)"}, "fullDescription": {"text": "`lib/api.ts:137` calls `PATCH /api/robots/${id}/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/robots/<p>/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6b881d4b26d637f7", "name": "Dangling fetch: DELETE /api/robots/${id} (lib/api.ts:143)", "shortDescription": {"text": "Dangling fetch: DELETE /api/robots/${id} (lib/api.ts:143)"}, "fullDescription": {"text": "`lib/api.ts:143` calls `DELETE /api/robots/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/robots/<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-308c1c8a689b5752", "name": "Dangling fetch: GET /api/notifications (lib/api.ts:147)", "shortDescription": {"text": "Dangling fetch: GET /api/notifications (lib/api.ts:147)"}, "fullDescription": {"text": "`lib/api.ts:147` calls `GET /api/notifications` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/notifications`\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-6333c3aae0cf1cb1", "name": "Dangling fetch: GET /api/notifications/unread (lib/api.ts:150)", "shortDescription": {"text": "Dangling fetch: GET /api/notifications/unread (lib/api.ts:150)"}, "fullDescription": {"text": "`lib/api.ts:150` calls `GET /api/notifications/unread` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/notifications/unread`\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-6a836e280c9c2767", "name": "Dangling fetch: POST /api/notifications/read (lib/api.ts:153)", "shortDescription": {"text": "Dangling fetch: POST /api/notifications/read (lib/api.ts:153)"}, "fullDescription": {"text": "`lib/api.ts:153` calls `POST /api/notifications/read` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/notifications/read`\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-28a2019120809c6e", "name": "Dangling fetch: PATCH /api/robots/${id}/visibility (lib/api.ts:159)", "shortDescription": {"text": "Dangling fetch: PATCH /api/robots/${id}/visibility (lib/api.ts:159)"}, "fullDescription": {"text": "`lib/api.ts:159` calls `PATCH /api/robots/${id}/visibility` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/robots/<p>/visibility`\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-e1dc74ffa87a5f63", "name": "Dangling fetch: POST /api/transactions/deposit (lib/api.ts:175)", "shortDescription": {"text": "Dangling fetch: POST /api/transactions/deposit (lib/api.ts:175)"}, "fullDescription": {"text": "`lib/api.ts:175` calls `POST /api/transactions/deposit` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/transactions/deposit`\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-4e8056d446e75ba4", "name": "Dangling fetch: POST /api/transactions/withdraw (lib/api.ts:186)", "shortDescription": {"text": "Dangling fetch: POST /api/transactions/withdraw (lib/api.ts:186)"}, "fullDescription": {"text": "`lib/api.ts:186` calls `POST /api/transactions/withdraw` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/transactions/withdraw`\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-4cb1bcc5b027661a", "name": "Dangling fetch: GET /api/account/profile (lib/api.ts:193)", "shortDescription": {"text": "Dangling fetch: GET /api/account/profile (lib/api.ts:193)"}, "fullDescription": {"text": "`lib/api.ts:193` calls `GET /api/account/profile` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/account/profile`\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-c666d7e8acb09f83", "name": "Dangling fetch: GET /api/account/all (lib/api.ts:198)", "shortDescription": {"text": "Dangling fetch: GET /api/account/all (lib/api.ts:198)"}, "fullDescription": {"text": "`lib/api.ts:198` calls `GET /api/account/all` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/account/all`\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-c54dd1568132793b", "name": "Dangling fetch: POST /api/account/open (lib/api.ts:202)", "shortDescription": {"text": "Dangling fetch: POST /api/account/open (lib/api.ts:202)"}, "fullDescription": {"text": "`lib/api.ts:202` calls `POST /api/account/open` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/account/open`\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-13ca3e2b96d50948", "name": "Dangling fetch: PATCH /api/account/set-primary (lib/api.ts:209)", "shortDescription": {"text": "Dangling fetch: PATCH /api/account/set-primary (lib/api.ts:209)"}, "fullDescription": {"text": "`lib/api.ts:209` calls `PATCH /api/account/set-primary` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/account/set-primary`\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-e244b2077f2ee985", "name": "Dangling fetch: POST /api/account/risk-accept (lib/api.ts:217)", "shortDescription": {"text": "Dangling fetch: POST /api/account/risk-accept (lib/api.ts:217)"}, "fullDescription": {"text": "`lib/api.ts:217` calls `POST /api/account/risk-accept` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/account/risk-accept`\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-07c88a0746559af6", "name": "Dangling fetch: PATCH /api/account/privacy (lib/api.ts:225)", "shortDescription": {"text": "Dangling fetch: PATCH /api/account/privacy (lib/api.ts:225)"}, "fullDescription": {"text": "`lib/api.ts:225` calls `PATCH /api/account/privacy` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/account/privacy`\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-13b26f4b31836597", "name": "Dangling fetch: GET /api/account/profile (lib/api.ts:232)", "shortDescription": {"text": "Dangling fetch: GET /api/account/profile (lib/api.ts:232)"}, "fullDescription": {"text": "`lib/api.ts:232` calls `GET /api/account/profile` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/account/profile`\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-b5abff834b4d2234", "name": "Dangling fetch: PUT /api/account/notification-prefs (lib/api.ts:243)", "shortDescription": {"text": "Dangling fetch: PUT /api/account/notification-prefs (lib/api.ts:243)"}, "fullDescription": {"text": "`lib/api.ts:243` calls `PUT /api/account/notification-prefs` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/account/notification-prefs`\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-c3856d5be8d05360", "name": "Dangling fetch: GET /api/admin/transactions?status=${status} (lib/api.ts:250)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/transactions?status=${status} (lib/api.ts:250)"}, "fullDescription": {"text": "`lib/api.ts:250` calls `GET /api/admin/transactions?status=${status}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/transactions`\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-4526e7dba4428d53", "name": "Dangling fetch: POST /api/admin/transactions/${id}/approve (lib/api.ts:253)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/transactions/${id}/approve (lib/api.ts:253)"}, "fullDescription": {"text": "`lib/api.ts:253` calls `POST /api/admin/transactions/${id}/approve` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/transactions/<p>/approve`\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-e2c9b8e5babe212e", "name": "Dangling fetch: POST /api/admin/transactions/${id}/reject (lib/api.ts:258)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/transactions/${id}/reject (lib/api.ts:258)"}, "fullDescription": {"text": "`lib/api.ts:258` calls `POST /api/admin/transactions/${id}/reject` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/transactions/<p>/reject`\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-72b967032d549326", "name": "Dangling fetch: GET /api/admin/kyc?status=${status} (lib/api.ts:265)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/kyc?status=${status} (lib/api.ts:265)"}, "fullDescription": {"text": "`lib/api.ts:265` calls `GET /api/admin/kyc?status=${status}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/kyc`\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-33b89de701371c5d", "name": "Dangling fetch: GET /api/admin/dashboard (lib/api.ts:268)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/dashboard (lib/api.ts:268)"}, "fullDescription": {"text": "`lib/api.ts:268` calls `GET /api/admin/dashboard` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/dashboard`\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-9ccc01803caee851", "name": "Dangling fetch: POST /api/admin/kyc/${id}/approve (lib/api.ts:279)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/kyc/${id}/approve (lib/api.ts:279)"}, "fullDescription": {"text": "`lib/api.ts:279` calls `POST /api/admin/kyc/${id}/approve` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/kyc/<p>/approve`\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-bc7e46a49b21873e", "name": "Dangling fetch: POST /api/admin/kyc/${id}/reject (lib/api.ts:282)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/kyc/${id}/reject (lib/api.ts:282)"}, "fullDescription": {"text": "`lib/api.ts:282` calls `POST /api/admin/kyc/${id}/reject` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/kyc/<p>/reject`\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-692874c409d78f3e", "name": "Dangling fetch: POST /api/alerts (lib/api.ts:294)", "shortDescription": {"text": "Dangling fetch: POST /api/alerts (lib/api.ts:294)"}, "fullDescription": {"text": "`lib/api.ts:294` calls `POST /api/alerts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/alerts`\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-5a65f83b5661015d", "name": "Dangling fetch: DELETE /api/alerts/${id} (lib/api.ts:300)", "shortDescription": {"text": "Dangling fetch: DELETE /api/alerts/${id} (lib/api.ts:300)"}, "fullDescription": {"text": "`lib/api.ts:300` calls `DELETE /api/alerts/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/alerts/<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-f7b0beb4fd3621f3", "name": "Dangling fetch: GET /api/admin/users/${userId} (lib/api.ts:307)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/users/${userId} (lib/api.ts:307)"}, "fullDescription": {"text": "`lib/api.ts:307` calls `GET /api/admin/users/${userId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/users/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-40bab8adb5f67480", "name": "Dangling fetch: POST /api/admin/users/${userId}/impersonate (lib/api.ts:316)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/users/${userId}/impersonate (lib/api.ts:316)"}, "fullDescription": {"text": "`lib/api.ts:316` calls `POST /api/admin/users/${userId}/impersonate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/users/<p>/impersonate`\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-366e5948ed306ef0", "name": "Dangling fetch: GET /api/admin/risk (lib/api.ts:332)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/risk (lib/api.ts:332)"}, "fullDescription": {"text": "`lib/api.ts:332` calls `GET /api/admin/risk` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/risk`\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-73d3da982a8c3e97", "name": "Dangling fetch: GET /api/auth/sessions (lib/api.ts:444)", "shortDescription": {"text": "Dangling fetch: GET /api/auth/sessions (lib/api.ts:444)"}, "fullDescription": {"text": "`lib/api.ts:444` calls `GET /api/auth/sessions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/sessions`\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-9ea0b9bd0da09ae1", "name": "Dangling fetch: DELETE /api/auth/sessions/${sessionId} (lib/api.ts:449)", "shortDescription": {"text": "Dangling fetch: DELETE /api/auth/sessions/${sessionId} (lib/api.ts:449)"}, "fullDescription": {"text": "`lib/api.ts:449` calls `DELETE /api/auth/sessions/${sessionId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/sessions/<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-56d13371af521ed3", "name": "Dangling fetch: DELETE /api/auth/sessions?currentSessionId=${encodeURIComponent(currentSessionId)} (lib/api.ts:453)", "shortDescription": {"text": "Dangling fetch: DELETE /api/auth/sessions?currentSessionId=${encodeURIComponent(currentSessionId)} (lib/api.ts:453)"}, "fullDescription": {"text": "`lib/api.ts:453` calls `DELETE /api/auth/sessions?currentSessionId=${encodeURIComponent(currentSessionId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/sessions`\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-861e56fd43d507ad", "name": "Dangling fetch: GET /api/achievements (lib/api.ts:479)", "shortDescription": {"text": "Dangling fetch: GET /api/achievements (lib/api.ts:479)"}, "fullDescription": {"text": "`lib/api.ts:479` calls `GET /api/achievements` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/achievements`\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-25ff6aa4dd6ef444", "name": "Dangling fetch: GET /api/watchlist (lib/api.ts:487)", "shortDescription": {"text": "Dangling fetch: GET /api/watchlist (lib/api.ts:487)"}, "fullDescription": {"text": "`lib/api.ts:487` calls `GET /api/watchlist` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/watchlist`\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-bf0e47050f8071b5", "name": "Dangling fetch: POST /api/watchlist (lib/api.ts:493)", "shortDescription": {"text": "Dangling fetch: POST /api/watchlist (lib/api.ts:493)"}, "fullDescription": {"text": "`lib/api.ts:493` calls `POST /api/watchlist` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/watchlist`\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-a594b03ded68d1e8", "name": "Dangling fetch: PATCH /api/account/hedging (lib/api.ts:510)", "shortDescription": {"text": "Dangling fetch: PATCH /api/account/hedging (lib/api.ts:510)"}, "fullDescription": {"text": "`lib/api.ts:510` calls `PATCH /api/account/hedging` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/account/hedging`\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-ea7d6078a2a9d75a", "name": "Dangling fetch: PATCH /api/orders/note/${tradeId} (lib/api.ts:520)", "shortDescription": {"text": "Dangling fetch: PATCH /api/orders/note/${tradeId} (lib/api.ts:520)"}, "fullDescription": {"text": "`lib/api.ts:520` calls `PATCH /api/orders/note/${tradeId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/orders/note/<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-42a3283da55047b8", "name": "Unused endpoint: GET /api/health/workers", "shortDescription": {"text": "Unused endpoint: GET /api/health/workers"}, "fullDescription": {"text": "`server/src/index.ts` declares `GET /api/health/workers` 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-f4f71d4a5c7ce36f", "name": "Unused endpoint: GET /ws/quotes", "shortDescription": {"text": "Unused endpoint: GET /ws/quotes"}, "fullDescription": {"text": "`server/src/feed/pricefeed.ts` declares `GET /ws/quotes` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-304b6f2b403d93f7", "name": "Unused endpoint: POST /register", "shortDescription": {"text": "Unused endpoint: POST /register"}, "fullDescription": {"text": "`server/src/routes/auth.ts` declares `POST /register` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-618721b912bad1c2", "name": "Unused endpoint: POST /login", "shortDescription": {"text": "Unused endpoint: POST /login"}, "fullDescription": {"text": "`server/src/routes/auth.ts` declares `POST /login` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4fe9bb486644f008", "name": "Unused endpoint: POST /change-password", "shortDescription": {"text": "Unused endpoint: POST /change-password"}, "fullDescription": {"text": "`server/src/routes/auth.ts` declares `POST /change-password` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1a38ab4a7eae7f88", "name": "Unused endpoint: GET /:symbol", "shortDescription": {"text": "Unused endpoint: GET /:symbol"}, "fullDescription": {"text": "`server/src/routes/quotes.ts` declares `GET /:symbol` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`server/src/routes/watchlist.ts` declares `POST /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0eae591817480828", "name": "Unused endpoint: DELETE /:symbol", "shortDescription": {"text": "Unused endpoint: DELETE /:symbol"}, "fullDescription": {"text": "`server/src/routes/watchlist.ts` declares `DELETE /:symbol` 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-c521f970e5c0faca", "name": "Unused endpoint: POST /compile", "shortDescription": {"text": "Unused endpoint: POST /compile"}, "fullDescription": {"text": "`server/src/routes/robots.ts` declares `POST /compile` 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-bb86a49414024054", "name": "Unused endpoint: POST /save", "shortDescription": {"text": "Unused endpoint: POST /save"}, "fullDescription": {"text": "`server/src/routes/robots.ts` declares `POST /save` 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-add6dcb6007baef6", "name": "Unused endpoint: GET /leaderboard", "shortDescription": {"text": "Unused endpoint: GET /leaderboard"}, "fullDescription": {"text": "`server/src/routes/robots.ts` declares `GET /leaderboard` 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-be479dac771ccf84", "name": "Unused endpoint: GET /unread", "shortDescription": {"text": "Unused endpoint: GET /unread"}, "fullDescription": {"text": "`server/src/routes/notifications.ts` declares `GET /unread` 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-3dfa27698203a144", "name": "Unused endpoint: POST /read", "shortDescription": {"text": "Unused endpoint: POST /read"}, "fullDescription": {"text": "`server/src/routes/notifications.ts` declares `POST /read` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-29b016c833fc22e8", "name": "Unused endpoint: POST /init", "shortDescription": {"text": "Unused endpoint: POST /init"}, "fullDescription": {"text": "`server/src/routes/account.ts` declares `POST /init` 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-2595b39638e5c045", "name": "Unused endpoint: GET /profile", "shortDescription": {"text": "Unused endpoint: GET /profile"}, "fullDescription": {"text": "`server/src/routes/account.ts` declares `GET /profile` 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-2d1399c6f28e9258", "name": "Unused endpoint: POST /risk-accept", "shortDescription": {"text": "Unused endpoint: POST /risk-accept"}, "fullDescription": {"text": "`server/src/routes/account.ts` declares `POST /risk-accept` 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-b51c7f20fd845be9", "name": "Unused endpoint: PATCH /privacy", "shortDescription": {"text": "Unused endpoint: PATCH /privacy"}, "fullDescription": {"text": "`server/src/routes/account.ts` declares `PATCH /privacy` 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-39e8e9b7b1b7a652", "name": "Unused endpoint: PUT /notification-prefs", "shortDescription": {"text": "Unused endpoint: PUT /notification-prefs"}, "fullDescription": {"text": "`server/src/routes/account.ts` declares `PUT /notification-prefs` 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-0983d7eb1beb779e", "name": "Unused endpoint: PATCH /hedging", "shortDescription": {"text": "Unused endpoint: PATCH /hedging"}, "fullDescription": {"text": "`server/src/routes/account.ts` declares `PATCH /hedging` 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-2c3d1d103b19a7f6", "name": "Unused endpoint: GET /all", "shortDescription": {"text": "Unused endpoint: GET /all"}, "fullDescription": {"text": "`server/src/routes/account.ts` declares `GET /all` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-16ac6fc175366b71", "name": "Unused endpoint: POST /open", "shortDescription": {"text": "Unused endpoint: POST /open"}, "fullDescription": {"text": "`server/src/routes/account.ts` declares `POST /open` 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-2c9abc9c47eb123a", "name": "Unused endpoint: PATCH /set-primary", "shortDescription": {"text": "Unused endpoint: PATCH /set-primary"}, "fullDescription": {"text": "`server/src/routes/account.ts` declares `PATCH /set-primary` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a61c112b611f4bb", "name": "Unused endpoint: DELETE /:id", "shortDescription": {"text": "Unused endpoint: DELETE /:id"}, "fullDescription": {"text": "`server/src/routes/alerts.ts` declares `DELETE /:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0a643a85a883e1e0", "name": "Unused endpoint: PATCH /opt-in", "shortDescription": {"text": "Unused endpoint: PATCH /opt-in"}, "fullDescription": {"text": "`server/src/routes/traders.ts` declares `PATCH /opt-in` 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-2e494a389a6f2b3e", "name": "Unused endpoint: POST /follow", "shortDescription": {"text": "Unused endpoint: POST /follow"}, "fullDescription": {"text": "`server/src/routes/traders.ts` declares `POST /follow` 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-13baf8206df511df", "name": "Unused endpoint: DELETE /follow/:leaderId", "shortDescription": {"text": "Unused endpoint: DELETE /follow/:leaderId"}, "fullDescription": {"text": "`server/src/routes/traders.ts` declares `DELETE /follow/:leaderId` 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-19ce515a427795ee", "name": "Unused endpoint: GET /following", "shortDescription": {"text": "Unused endpoint: GET /following"}, "fullDescription": {"text": "`server/src/routes/traders.ts` declares `GET /following` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd1dc91abf32142d", "name": "Unused endpoint: GET /me", "shortDescription": {"text": "Unused endpoint: GET /me"}, "fullDescription": {"text": "`server/src/routes/traders.ts` declares `GET /me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f77c8639daee1f8", "name": "Unused endpoint: POST /close", "shortDescription": {"text": "Unused endpoint: POST /close"}, "fullDescription": {"text": "`server/src/routes/orders.ts` declares `POST /close` 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-961dc22303a365ea", "name": "Unused endpoint: DELETE /pending/:id", "shortDescription": {"text": "Unused endpoint: DELETE /pending/:id"}, "fullDescription": {"text": "`server/src/routes/orders.ts` declares `DELETE /pending/: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-b570f027b45b6a29", "name": "Unused endpoint: PATCH /modify/:id", "shortDescription": {"text": "Unused endpoint: PATCH /modify/:id"}, "fullDescription": {"text": "`server/src/routes/orders.ts` declares `PATCH /modify/: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-d45e47a902b70944", "name": "Unused endpoint: PATCH /note/:id", "shortDescription": {"text": "Unused endpoint: PATCH /note/:id"}, "fullDescription": {"text": "`server/src/routes/orders.ts` declares `PATCH /note/: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-b15d518d538de57d", "name": "Unused endpoint: GET /sessions", "shortDescription": {"text": "Unused endpoint: GET /sessions"}, "fullDescription": {"text": "`server/src/routes/sessions.ts` declares `GET /sessions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-05b1ac409816dfd9", "name": "Unused endpoint: DELETE /sessions/:sessionId", "shortDescription": {"text": "Unused endpoint: DELETE /sessions/:sessionId"}, "fullDescription": {"text": "`server/src/routes/sessions.ts` declares `DELETE /sessions/:sessionId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7b52fcc22ba5e3d2", "name": "Unused endpoint: DELETE /sessions", "shortDescription": {"text": "Unused endpoint: DELETE /sessions"}, "fullDescription": {"text": "`server/src/routes/sessions.ts` declares `DELETE /sessions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-52f939032aab887f", "name": "Unused endpoint: GET /transactions", "shortDescription": {"text": "Unused endpoint: GET /transactions"}, "fullDescription": {"text": "`server/src/routes/admin.ts` declares `GET /transactions` 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-c04202ca7da8be7b", "name": "Unused endpoint: POST /transactions/:id/approve", "shortDescription": {"text": "Unused endpoint: POST /transactions/:id/approve"}, "fullDescription": {"text": "`server/src/routes/admin.ts` declares `POST /transactions/:id/approve` 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-948546f43f5b034b", "name": "Unused endpoint: POST /transactions/:id/reject", "shortDescription": {"text": "Unused endpoint: POST /transactions/:id/reject"}, "fullDescription": {"text": "`server/src/routes/admin.ts` declares `POST /transactions/:id/reject` 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-bfbe34ab6495750c", "name": "Unused endpoint: GET /kyc", "shortDescription": {"text": "Unused endpoint: GET /kyc"}, "fullDescription": {"text": "`server/src/routes/admin.ts` declares `GET /kyc` 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-789ff26af6d8ad22", "name": "Unused endpoint: POST /kyc/:id/approve", "shortDescription": {"text": "Unused endpoint: POST /kyc/:id/approve"}, "fullDescription": {"text": "`server/src/routes/admin.ts` declares `POST /kyc/:id/approve` 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-e3d8ac251e11b074", "name": "Unused endpoint: POST /kyc/:id/reject", "shortDescription": {"text": "Unused endpoint: POST /kyc/:id/reject"}, "fullDescription": {"text": "`server/src/routes/admin.ts` declares `POST /kyc/:id/reject` 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-d504b80adc9409ec", "name": "Unused endpoint: GET /dashboard", "shortDescription": {"text": "Unused endpoint: GET /dashboard"}, "fullDescription": {"text": "`server/src/routes/admin.ts` declares `GET /dashboard` 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-841e50bf821e4158", "name": "Unused endpoint: GET /users", "shortDescription": {"text": "Unused endpoint: GET /users"}, "fullDescription": {"text": "`server/src/routes/admin.ts` declares `GET /users` 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-61dd05ecafcd2eb2", "name": "Unused endpoint: GET /users/:userId", "shortDescription": {"text": "Unused endpoint: GET /users/:userId"}, "fullDescription": {"text": "`server/src/routes/admin.ts` declares `GET /users/:userId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3b3f2c92de1a396a", "name": "Unused endpoint: POST /users/:userId/impersonate", "shortDescription": {"text": "Unused endpoint: POST /users/:userId/impersonate"}, "fullDescription": {"text": "`server/src/routes/admin.ts` declares `POST /users/:userId/impersonate` 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-428a6e6141b4015d", "name": "Unused endpoint: POST /accounts/:id/adjust", "shortDescription": {"text": "Unused endpoint: POST /accounts/:id/adjust"}, "fullDescription": {"text": "`server/src/routes/admin.ts` declares `POST /accounts/:id/adjust` 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-8898f32c3352cb11", "name": "Unused endpoint: GET /risk", "shortDescription": {"text": "Unused endpoint: GET /risk"}, "fullDescription": {"text": "`server/src/routes/admin.ts` declares `GET /risk` 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-de7ed0a6c3a8a3a7", "name": "Unused endpoint: GET /perf", "shortDescription": {"text": "Unused endpoint: GET /perf"}, "fullDescription": {"text": "`server/src/routes/admin.ts` declares `GET /perf` 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-1c9254d2535e9b7c", "name": "Unused endpoint: POST /deposit", "shortDescription": {"text": "Unused endpoint: POST /deposit"}, "fullDescription": {"text": "`server/src/routes/transactions.ts` declares `POST /deposit` 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-92da9ee5166256ca", "name": "Unused endpoint: POST /withdraw", "shortDescription": {"text": "Unused endpoint: POST /withdraw"}, "fullDescription": {"text": "`server/src/routes/transactions.ts` declares `POST /withdraw` 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/21041"}, "properties": {"repository": "th3ghote-blip/vanta", "repoUrl": "https://github.com/th3ghote-blip/vanta", "branch": "main"}, "results": [{"ruleId": "scanner-aa6be4518562516a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/load-test-node.js:135"}, "properties": {"repobilityId": "4ee2fb1542677f7c", "scanner": "scanner-primary", "fingerprint": "aa6be4518562516a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b6b30bb43fee9012", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/math-check.js:48"}, "properties": {"repobilityId": "eeb847851a3b70af", "scanner": "scanner-primary", "fingerprint": "b6b30bb43fee9012", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d09c8dae099ba972", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/ws-stability-test.js:54"}, "properties": {"repobilityId": "c8f566b95db7d2e5", "scanner": "scanner-primary", "fingerprint": "d09c8dae099ba972", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e6e54b92cff363d2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/liveQuotes.ts:66"}, "properties": {"repobilityId": "49341c7a2453b466", "scanner": "scanner-primary", "fingerprint": "e6e54b92cff363d2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d073b34c077962ae", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/notifications.ts:91"}, "properties": {"repobilityId": "189d04d6c9f98e51", "scanner": "scanner-primary", "fingerprint": "d073b34c077962ae", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5a32ac60613087ac", "level": "error", "message": {"text": "Runtime dotenv file present in repo: .env.production"}, "properties": {"repobilityId": "da3016501941bee3", "scanner": "scanner-primary", "fingerprint": "5a32ac60613087ac", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env", "env_file_with_secret"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".env.production"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e735be767e0d9e44", "level": "error", "message": {"text": "Possible secret in e2e/smoke.spec.ts"}, "properties": {"repobilityId": "0f45bb59ee7780cd", "scanner": "scanner-primary", "fingerprint": "e735be767e0d9e44", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/smoke.spec.ts"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-1dd7c2e1a1e1fd5a", "level": "error", "message": {"text": "Possible secret in e2e/limit-order.spec.ts"}, "properties": {"repobilityId": "a0bb1fb40d64be80", "scanner": "scanner-primary", "fingerprint": "1dd7c2e1a1e1fd5a", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/limit-order.spec.ts"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-d0a404615f02ab2c", "level": "error", "message": {"text": "Possible secret in e2e/quick-mode.spec.ts"}, "properties": {"repobilityId": "53a6aefff4270a22", "scanner": "scanner-primary", "fingerprint": "d0a404615f02ab2c", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/quick-mode.spec.ts"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-31a2d1c35e75f25d", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2668034fad68bdf1", "scanner": "scanner-primary", "fingerprint": "31a2d1c35e75f25d", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backup-check.yml"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-65c9bd56493a81d3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "8e879d8d5d310b9f", "scanner": "scanner-primary", "fingerprint": "65c9bd56493a81d3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e.yml"}, "region": {"startLine": 58}}}]}, {"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": "49c66110e28d6753", "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": "8eda884597713c73", "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": "d1ae6db746413fad", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "f74bb06c727a75b1", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "1d02c7fd1302ce58", "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": "db3d45ce42208ee2", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "a9d3abb7202c3ee4", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "a277c1658006d8f4", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0836f45a92ddf4c9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 stores/watchlist.ts:4"}, "properties": {"repobilityId": "c0da0e302f8a7072", "scanner": "scanner-primary", "fingerprint": "0836f45a92ddf4c9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5392d15abe47a881", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/pro/Chart.tsx:582"}, "properties": {"repobilityId": "5334eaaac23a275c", "scanner": "scanner-primary", "fingerprint": "5392d15abe47a881", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-84fade97772d747f", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/pro/OrderEntry.tsx:107"}, "properties": {"repobilityId": "c5c7aa7c6b9db7aa", "scanner": "scanner-primary", "fingerprint": "84fade97772d747f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-06fdbc50eabf5882", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/fun/ActiveRounds.tsx:254"}, "properties": {"repobilityId": "29e085342eecbc3f", "scanner": "scanner-primary", "fingerprint": "06fdbc50eabf5882", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d8433ab7f9767fcb", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/_layout.tsx:15"}, "properties": {"repobilityId": "c1302a7faba97926", "scanner": "scanner-primary", "fingerprint": "d8433ab7f9767fcb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-719d37d2cbebaa83", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/kyc.ts:84"}, "properties": {"repobilityId": "03ec5ce98800ceb8", "scanner": "scanner-primary", "fingerprint": "719d37d2cbebaa83", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-24859e6a31b2892c", "level": "none", "message": {"text": "Commented-code block (10 lines) in server/src/ai/robotEngine.ts:133"}, "properties": {"repobilityId": "ea9ce302a02b756f", "scanner": "scanner-primary", "fingerprint": "24859e6a31b2892c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-771b10d680a0eb15", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/src/feed/pricefeed.ts:8"}, "properties": {"repobilityId": "e0a6e630ee9d6b18", "scanner": "scanner-primary", "fingerprint": "771b10d680a0eb15", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0def363b27e3b981", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/feed/pricefeed.ts:288"}, "properties": {"repobilityId": "fb448fff99551789", "scanner": "scanner-primary", "fingerprint": "0def363b27e3b981", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-43b695ce9c67c21e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/lib/supabase.ts:42"}, "properties": {"repobilityId": "2757ecdb197fe78b", "scanner": "scanner-primary", "fingerprint": "43b695ce9c67c21e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6d4fd24ccce854aa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/auth.ts:88"}, "properties": {"repobilityId": "344f3e6ac8895233", "scanner": "scanner-primary", "fingerprint": "6d4fd24ccce854aa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5341669505dc5577", "level": "none", "message": {"text": "Commented-code block (6 lines) in server/src/routes/robots.ts:30"}, "properties": {"repobilityId": "8c4cf84eec5c1d80", "scanner": "scanner-primary", "fingerprint": "5341669505dc5577", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a10605dabe3bc354", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/src/routes/bars.ts:102"}, "properties": {"repobilityId": "76ee226b05ad49e0", "scanner": "scanner-primary", "fingerprint": "a10605dabe3bc354", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9a7dddc455390cf9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/bars.ts:206"}, "properties": {"repobilityId": "3eff3d5f90ac4074", "scanner": "scanner-primary", "fingerprint": "9a7dddc455390cf9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6fa6131b09c0a7be", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/routes/traders.ts:92"}, "properties": {"repobilityId": "dfe4f6ac3ce82a25", "scanner": "scanner-primary", "fingerprint": "6fa6131b09c0a7be", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e8578cb0b6260713", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/routes/orders.ts:223"}, "properties": {"repobilityId": "e37d7c196588f98b", "scanner": "scanner-primary", "fingerprint": "e8578cb0b6260713", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af10f44af038e4b3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/src/routes/sessions.ts:20"}, "properties": {"repobilityId": "33b4503a2e038725", "scanner": "scanner-primary", "fingerprint": "af10f44af038e4b3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5b9a162e668e7ef5", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/workers/rounds.ts:183"}, "properties": {"repobilityId": "3cd84388b0e909f1", "scanner": "scanner-primary", "fingerprint": "5b9a162e668e7ef5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f808a4ef3e1071fb", "level": "note", "message": {"text": "14 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "ce6b2ec4be4ec75a", "scanner": "scanner-primary", "fingerprint": "f808a4ef3e1071fb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-8707577c5df3e420", "level": "error", "message": {"text": "Dangling fetch: POST /api/account/init (stores/account.ts:83)"}, "properties": {"repobilityId": "3b51379215b088b3", "scanner": "scanner-primary", "fingerprint": "8707577c5df3e420", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-40e35ed3bad4adf8", "level": "error", "message": {"text": "Dangling fetch: GET /api/traders/me (components/robots/CopyTrading.tsx:44)"}, "properties": {"repobilityId": "6fd20395005d7cc4", "scanner": "scanner-primary", "fingerprint": "40e35ed3bad4adf8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-9a3c8e74151266fe", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/traders/opt-in (components/robots/CopyTrading.tsx:72)"}, "properties": {"repobilityId": "06ffa0cfc81216ee", "scanner": "scanner-primary", "fingerprint": "9a3c8e74151266fe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-440d32108ee84193", "level": "error", "message": {"text": "Dangling fetch: POST /api/traders/follow (components/robots/CopyTrading.tsx:93)"}, "properties": {"repobilityId": "bbeb946435872b1a", "scanner": "scanner-primary", "fingerprint": "440d32108ee84193", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-55efba59e8b2abcc", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/traders/follow/${encodeURIComponent(leader.leaderId)} (components/robots/CopyTrading.tsx:112)"}, "properties": {"repobilityId": "bed5f748923039f2", "scanner": "scanner-primary", "fingerprint": "55efba59e8b2abcc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-a8afa7f7afd499c3", "level": "error", "message": {"text": "Dangling fetch: POST /api/orders/open (lib/api.ts:88)"}, "properties": {"repobilityId": "c377c7f4c7b773b5", "scanner": "scanner-primary", "fingerprint": "a8afa7f7afd499c3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-4be0a95ffc806ac0", "level": "error", "message": {"text": "Dangling fetch: POST /api/orders/close (lib/api.ts:91)"}, "properties": {"repobilityId": "b635891be499084b", "scanner": "scanner-primary", "fingerprint": "4be0a95ffc806ac0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-d784c758361b5ce0", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/orders/pending/${tradeId} (lib/api.ts:98)"}, "properties": {"repobilityId": "f5e559c4fb42ff82", "scanner": "scanner-primary", "fingerprint": "d784c758361b5ce0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-357ab37417bbaa97", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/orders/modify/${tradeId} (lib/api.ts:105)"}, "properties": {"repobilityId": "4b50dedbdfecadb9", "scanner": "scanner-primary", "fingerprint": "357ab37417bbaa97", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-6ab9200a1d2207cb", "level": "error", "message": {"text": "Dangling fetch: POST /api/rounds/open (lib/api.ts:116)"}, "properties": {"repobilityId": "5cd0fe8b820e4f38", "scanner": "scanner-primary", "fingerprint": "6ab9200a1d2207cb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-34f06d3635f8c519", "level": "error", "message": {"text": "Dangling fetch: POST /api/robots/compile (lib/api.ts:119)"}, "properties": {"repobilityId": "2e12a81bbb9f8e4e", "scanner": "scanner-primary", "fingerprint": "34f06d3635f8c519", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-17d0a74cf48b5112", "level": "error", "message": {"text": "Dangling fetch: POST /api/robots/save (lib/api.ts:125)"}, "properties": {"repobilityId": "3ad31be93c64127a", "scanner": "scanner-primary", "fingerprint": "17d0a74cf48b5112", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-9ac5597a30459e8b", "level": "error", "message": {"text": "Dangling fetch: GET /api/robots/${id} (lib/api.ts:131)"}, "properties": {"repobilityId": "b826a1abd1e74e2e", "scanner": "scanner-primary", "fingerprint": "9ac5597a30459e8b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-1cde3df044a63c63", "level": "error", "message": {"text": "Dangling fetch: GET /api/robots/${id}/runs (lib/api.ts:134)"}, "properties": {"repobilityId": "7512749fd9d1fd18", "scanner": "scanner-primary", "fingerprint": "1cde3df044a63c63", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-13a94d5a352df3cb", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/robots/${id}/status (lib/api.ts:137)"}, "properties": {"repobilityId": "7284949f754cc31c", "scanner": "scanner-primary", "fingerprint": "13a94d5a352df3cb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-6b881d4b26d637f7", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/robots/${id} (lib/api.ts:143)"}, "properties": {"repobilityId": "6c6dd3600f8bfa91", "scanner": "scanner-primary", "fingerprint": "6b881d4b26d637f7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-308c1c8a689b5752", "level": "error", "message": {"text": "Dangling fetch: GET /api/notifications (lib/api.ts:147)"}, "properties": {"repobilityId": "7ebc654b830c5a3f", "scanner": "scanner-primary", "fingerprint": "308c1c8a689b5752", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-6333c3aae0cf1cb1", "level": "error", "message": {"text": "Dangling fetch: GET /api/notifications/unread (lib/api.ts:150)"}, "properties": {"repobilityId": "595baa4be8dfc6ed", "scanner": "scanner-primary", "fingerprint": "6333c3aae0cf1cb1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-6a836e280c9c2767", "level": "error", "message": {"text": "Dangling fetch: POST /api/notifications/read (lib/api.ts:153)"}, "properties": {"repobilityId": "ed0ed6cb63e0a10e", "scanner": "scanner-primary", "fingerprint": "6a836e280c9c2767", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-28a2019120809c6e", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/robots/${id}/visibility (lib/api.ts:159)"}, "properties": {"repobilityId": "d008b3d960f6a669", "scanner": "scanner-primary", "fingerprint": "28a2019120809c6e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-e1dc74ffa87a5f63", "level": "error", "message": {"text": "Dangling fetch: POST /api/transactions/deposit (lib/api.ts:175)"}, "properties": {"repobilityId": "71021e9b21d781d7", "scanner": "scanner-primary", "fingerprint": "e1dc74ffa87a5f63", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-4e8056d446e75ba4", "level": "error", "message": {"text": "Dangling fetch: POST /api/transactions/withdraw (lib/api.ts:186)"}, "properties": {"repobilityId": "d9303cadfe348480", "scanner": "scanner-primary", "fingerprint": "4e8056d446e75ba4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-4cb1bcc5b027661a", "level": "error", "message": {"text": "Dangling fetch: GET /api/account/profile (lib/api.ts:193)"}, "properties": {"repobilityId": "8f5cab44e642ee08", "scanner": "scanner-primary", "fingerprint": "4cb1bcc5b027661a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c666d7e8acb09f83", "level": "error", "message": {"text": "Dangling fetch: GET /api/account/all (lib/api.ts:198)"}, "properties": {"repobilityId": "11f26259ba7c0531", "scanner": "scanner-primary", "fingerprint": "c666d7e8acb09f83", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c54dd1568132793b", "level": "error", "message": {"text": "Dangling fetch: POST /api/account/open (lib/api.ts:202)"}, "properties": {"repobilityId": "58b59b6878ba45d3", "scanner": "scanner-primary", "fingerprint": "c54dd1568132793b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-13ca3e2b96d50948", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/account/set-primary (lib/api.ts:209)"}, "properties": {"repobilityId": "1816815f0c6529ba", "scanner": "scanner-primary", "fingerprint": "13ca3e2b96d50948", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-e244b2077f2ee985", "level": "error", "message": {"text": "Dangling fetch: POST /api/account/risk-accept (lib/api.ts:217)"}, "properties": {"repobilityId": "fed2de1ae706b4aa", "scanner": "scanner-primary", "fingerprint": "e244b2077f2ee985", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-07c88a0746559af6", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/account/privacy (lib/api.ts:225)"}, "properties": {"repobilityId": "1b31c49c1de8e58d", "scanner": "scanner-primary", "fingerprint": "07c88a0746559af6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-13b26f4b31836597", "level": "error", "message": {"text": "Dangling fetch: GET /api/account/profile (lib/api.ts:232)"}, "properties": {"repobilityId": "5eb24e7423a85b75", "scanner": "scanner-primary", "fingerprint": "13b26f4b31836597", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-b5abff834b4d2234", "level": "error", "message": {"text": "Dangling fetch: PUT /api/account/notification-prefs (lib/api.ts:243)"}, "properties": {"repobilityId": "ac84d4631e6e7621", "scanner": "scanner-primary", "fingerprint": "b5abff834b4d2234", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c3856d5be8d05360", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/transactions?status=${status} (lib/api.ts:250)"}, "properties": {"repobilityId": "e47c363608a2950a", "scanner": "scanner-primary", "fingerprint": "c3856d5be8d05360", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-4526e7dba4428d53", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/transactions/${id}/approve (lib/api.ts:253)"}, "properties": {"repobilityId": "c00f632f9e0c7364", "scanner": "scanner-primary", "fingerprint": "4526e7dba4428d53", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-e2c9b8e5babe212e", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/transactions/${id}/reject (lib/api.ts:258)"}, "properties": {"repobilityId": "f652872f3d7abf91", "scanner": "scanner-primary", "fingerprint": "e2c9b8e5babe212e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-72b967032d549326", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/kyc?status=${status} (lib/api.ts:265)"}, "properties": {"repobilityId": "b8fc8a71da82a099", "scanner": "scanner-primary", "fingerprint": "72b967032d549326", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-33b89de701371c5d", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/dashboard (lib/api.ts:268)"}, "properties": {"repobilityId": "b80e45d04676c28f", "scanner": "scanner-primary", "fingerprint": "33b89de701371c5d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-9ccc01803caee851", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/kyc/${id}/approve (lib/api.ts:279)"}, "properties": {"repobilityId": "83c85608a7762c9b", "scanner": "scanner-primary", "fingerprint": "9ccc01803caee851", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-bc7e46a49b21873e", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/kyc/${id}/reject (lib/api.ts:282)"}, "properties": {"repobilityId": "d39c11847975d67f", "scanner": "scanner-primary", "fingerprint": "bc7e46a49b21873e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-692874c409d78f3e", "level": "error", "message": {"text": "Dangling fetch: POST /api/alerts (lib/api.ts:294)"}, "properties": {"repobilityId": "95685de8051ef515", "scanner": "scanner-primary", "fingerprint": "692874c409d78f3e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-5a65f83b5661015d", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/alerts/${id} (lib/api.ts:300)"}, "properties": {"repobilityId": "cec53f1bb0c8a6d8", "scanner": "scanner-primary", "fingerprint": "5a65f83b5661015d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-f7b0beb4fd3621f3", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/users/${userId} (lib/api.ts:307)"}, "properties": {"repobilityId": "4e3064540570f513", "scanner": "scanner-primary", "fingerprint": "f7b0beb4fd3621f3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-40bab8adb5f67480", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/users/${userId}/impersonate (lib/api.ts:316)"}, "properties": {"repobilityId": "53e5d29a19739d5b", "scanner": "scanner-primary", "fingerprint": "40bab8adb5f67480", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-366e5948ed306ef0", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/risk (lib/api.ts:332)"}, "properties": {"repobilityId": "31c39fb4661e27f7", "scanner": "scanner-primary", "fingerprint": "366e5948ed306ef0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-73d3da982a8c3e97", "level": "error", "message": {"text": "Dangling fetch: GET /api/auth/sessions (lib/api.ts:444)"}, "properties": {"repobilityId": "a5643881354ccaeb", "scanner": "scanner-primary", "fingerprint": "73d3da982a8c3e97", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-9ea0b9bd0da09ae1", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/auth/sessions/${sessionId} (lib/api.ts:449)"}, "properties": {"repobilityId": "a5ec74a67c29763e", "scanner": "scanner-primary", "fingerprint": "9ea0b9bd0da09ae1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-56d13371af521ed3", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/auth/sessions?currentSessionId=${encodeURIComponent(currentSessionId)} (lib/api.ts:453)"}, "properties": {"repobilityId": "701f3022d021df20", "scanner": "scanner-primary", "fingerprint": "56d13371af521ed3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-861e56fd43d507ad", "level": "error", "message": {"text": "Dangling fetch: GET /api/achievements (lib/api.ts:479)"}, "properties": {"repobilityId": "a110048a51eb9f56", "scanner": "scanner-primary", "fingerprint": "861e56fd43d507ad", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-25ff6aa4dd6ef444", "level": "error", "message": {"text": "Dangling fetch: GET /api/watchlist (lib/api.ts:487)"}, "properties": {"repobilityId": "1880c7253c92676f", "scanner": "scanner-primary", "fingerprint": "25ff6aa4dd6ef444", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-bf0e47050f8071b5", "level": "error", "message": {"text": "Dangling fetch: POST /api/watchlist (lib/api.ts:493)"}, "properties": {"repobilityId": "dc7a446e418e89b6", "scanner": "scanner-primary", "fingerprint": "bf0e47050f8071b5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-a594b03ded68d1e8", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/account/hedging (lib/api.ts:510)"}, "properties": {"repobilityId": "3edfc88be5cd3133", "scanner": "scanner-primary", "fingerprint": "a594b03ded68d1e8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-ea7d6078a2a9d75a", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/orders/note/${tradeId} (lib/api.ts:520)"}, "properties": {"repobilityId": "28bb72c0b9155fc2", "scanner": "scanner-primary", "fingerprint": "ea7d6078a2a9d75a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-42a3283da55047b8", "level": "note", "message": {"text": "Unused endpoint: GET /api/health/workers"}, "properties": {"repobilityId": "0fa617d37085f9f4", "scanner": "scanner-primary", "fingerprint": "42a3283da55047b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f4f71d4a5c7ce36f", "level": "note", "message": {"text": "Unused endpoint: GET /ws/quotes"}, "properties": {"repobilityId": "70ce6d47cd404caa", "scanner": "scanner-primary", "fingerprint": "f4f71d4a5c7ce36f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-304b6f2b403d93f7", "level": "note", "message": {"text": "Unused endpoint: POST /register"}, "properties": {"repobilityId": "daeed64d0588332a", "scanner": "scanner-primary", "fingerprint": "304b6f2b403d93f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-618721b912bad1c2", "level": "note", "message": {"text": "Unused endpoint: POST /login"}, "properties": {"repobilityId": "5121736aa8c77ee5", "scanner": "scanner-primary", "fingerprint": "618721b912bad1c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4fe9bb486644f008", "level": "note", "message": {"text": "Unused endpoint: POST /change-password"}, "properties": {"repobilityId": "c587aaed00338c72", "scanner": "scanner-primary", "fingerprint": "4fe9bb486644f008", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1a38ab4a7eae7f88", "level": "note", "message": {"text": "Unused endpoint: GET /:symbol"}, "properties": {"repobilityId": "00531c67e002e450", "scanner": "scanner-primary", "fingerprint": "1a38ab4a7eae7f88", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "8e77114da45bacab", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0eae591817480828", "level": "note", "message": {"text": "Unused endpoint: DELETE /:symbol"}, "properties": {"repobilityId": "20c5efa586c233f7", "scanner": "scanner-primary", "fingerprint": "0eae591817480828", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c521f970e5c0faca", "level": "note", "message": {"text": "Unused endpoint: POST /compile"}, "properties": {"repobilityId": "97a0a787601ee274", "scanner": "scanner-primary", "fingerprint": "c521f970e5c0faca", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bb86a49414024054", "level": "note", "message": {"text": "Unused endpoint: POST /save"}, "properties": {"repobilityId": "d72f28992064e6a8", "scanner": "scanner-primary", "fingerprint": "bb86a49414024054", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-add6dcb6007baef6", "level": "note", "message": {"text": "Unused endpoint: GET /leaderboard"}, "properties": {"repobilityId": "1f45c10113ce86ae", "scanner": "scanner-primary", "fingerprint": "add6dcb6007baef6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-be479dac771ccf84", "level": "note", "message": {"text": "Unused endpoint: GET /unread"}, "properties": {"repobilityId": "1851f9f4f5474b12", "scanner": "scanner-primary", "fingerprint": "be479dac771ccf84", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3dfa27698203a144", "level": "note", "message": {"text": "Unused endpoint: POST /read"}, "properties": {"repobilityId": "128cc3b9b3517212", "scanner": "scanner-primary", "fingerprint": "3dfa27698203a144", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-29b016c833fc22e8", "level": "note", "message": {"text": "Unused endpoint: POST /init"}, "properties": {"repobilityId": "18db74759027e735", "scanner": "scanner-primary", "fingerprint": "29b016c833fc22e8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2595b39638e5c045", "level": "note", "message": {"text": "Unused endpoint: GET /profile"}, "properties": {"repobilityId": "cce5b46a232423fc", "scanner": "scanner-primary", "fingerprint": "2595b39638e5c045", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2d1399c6f28e9258", "level": "note", "message": {"text": "Unused endpoint: POST /risk-accept"}, "properties": {"repobilityId": "a6a70efd24bac6ec", "scanner": "scanner-primary", "fingerprint": "2d1399c6f28e9258", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b51c7f20fd845be9", "level": "note", "message": {"text": "Unused endpoint: PATCH /privacy"}, "properties": {"repobilityId": "a4300066304fe918", "scanner": "scanner-primary", "fingerprint": "b51c7f20fd845be9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-39e8e9b7b1b7a652", "level": "note", "message": {"text": "Unused endpoint: PUT /notification-prefs"}, "properties": {"repobilityId": "0fb9b13f5013b419", "scanner": "scanner-primary", "fingerprint": "39e8e9b7b1b7a652", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0983d7eb1beb779e", "level": "note", "message": {"text": "Unused endpoint: PATCH /hedging"}, "properties": {"repobilityId": "da17a67a672240b9", "scanner": "scanner-primary", "fingerprint": "0983d7eb1beb779e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2c3d1d103b19a7f6", "level": "note", "message": {"text": "Unused endpoint: GET /all"}, "properties": {"repobilityId": "62ec3d3033662f0b", "scanner": "scanner-primary", "fingerprint": "2c3d1d103b19a7f6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-16ac6fc175366b71", "level": "note", "message": {"text": "Unused endpoint: POST /open"}, "properties": {"repobilityId": "055d93dd4f68ca67", "scanner": "scanner-primary", "fingerprint": "16ac6fc175366b71", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2c9abc9c47eb123a", "level": "note", "message": {"text": "Unused endpoint: PATCH /set-primary"}, "properties": {"repobilityId": "22a98c92797398d5", "scanner": "scanner-primary", "fingerprint": "2c9abc9c47eb123a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a61c112b611f4bb", "level": "note", "message": {"text": "Unused endpoint: DELETE /:id"}, "properties": {"repobilityId": "07f160a7120fc458", "scanner": "scanner-primary", "fingerprint": "7a61c112b611f4bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0a643a85a883e1e0", "level": "note", "message": {"text": "Unused endpoint: PATCH /opt-in"}, "properties": {"repobilityId": "0ae5bf17a98bb48e", "scanner": "scanner-primary", "fingerprint": "0a643a85a883e1e0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2e494a389a6f2b3e", "level": "note", "message": {"text": "Unused endpoint: POST /follow"}, "properties": {"repobilityId": "3d791db9d92ff885", "scanner": "scanner-primary", "fingerprint": "2e494a389a6f2b3e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-13baf8206df511df", "level": "note", "message": {"text": "Unused endpoint: DELETE /follow/:leaderId"}, "properties": {"repobilityId": "4bc4d5754f79c0d0", "scanner": "scanner-primary", "fingerprint": "13baf8206df511df", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-19ce515a427795ee", "level": "note", "message": {"text": "Unused endpoint: GET /following"}, "properties": {"repobilityId": "51dcbfe7e2293d7c", "scanner": "scanner-primary", "fingerprint": "19ce515a427795ee", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "b03f8d09e682922c", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1f77c8639daee1f8", "level": "note", "message": {"text": "Unused endpoint: POST /close"}, "properties": {"repobilityId": "4d7c2473f5305496", "scanner": "scanner-primary", "fingerprint": "1f77c8639daee1f8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-961dc22303a365ea", "level": "note", "message": {"text": "Unused endpoint: DELETE /pending/:id"}, "properties": {"repobilityId": "c2bb6eef7b735283", "scanner": "scanner-primary", "fingerprint": "961dc22303a365ea", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b570f027b45b6a29", "level": "note", "message": {"text": "Unused endpoint: PATCH /modify/:id"}, "properties": {"repobilityId": "0a2574f730a502cd", "scanner": "scanner-primary", "fingerprint": "b570f027b45b6a29", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d45e47a902b70944", "level": "note", "message": {"text": "Unused endpoint: PATCH /note/:id"}, "properties": {"repobilityId": "04af98a0246bdedd", "scanner": "scanner-primary", "fingerprint": "d45e47a902b70944", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b15d518d538de57d", "level": "note", "message": {"text": "Unused endpoint: GET /sessions"}, "properties": {"repobilityId": "8c83ddec451559ba", "scanner": "scanner-primary", "fingerprint": "b15d518d538de57d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-05b1ac409816dfd9", "level": "note", "message": {"text": "Unused endpoint: DELETE /sessions/:sessionId"}, "properties": {"repobilityId": "be5d030722b5513f", "scanner": "scanner-primary", "fingerprint": "05b1ac409816dfd9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7b52fcc22ba5e3d2", "level": "note", "message": {"text": "Unused endpoint: DELETE /sessions"}, "properties": {"repobilityId": "c698c39eea4717af", "scanner": "scanner-primary", "fingerprint": "7b52fcc22ba5e3d2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-52f939032aab887f", "level": "note", "message": {"text": "Unused endpoint: GET /transactions"}, "properties": {"repobilityId": "e65b920c9894125c", "scanner": "scanner-primary", "fingerprint": "52f939032aab887f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c04202ca7da8be7b", "level": "note", "message": {"text": "Unused endpoint: POST /transactions/:id/approve"}, "properties": {"repobilityId": "97a68d1f6c417880", "scanner": "scanner-primary", "fingerprint": "c04202ca7da8be7b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-948546f43f5b034b", "level": "note", "message": {"text": "Unused endpoint: POST /transactions/:id/reject"}, "properties": {"repobilityId": "693fad16bc7b6c1f", "scanner": "scanner-primary", "fingerprint": "948546f43f5b034b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bfbe34ab6495750c", "level": "note", "message": {"text": "Unused endpoint: GET /kyc"}, "properties": {"repobilityId": "a74363163c24deee", "scanner": "scanner-primary", "fingerprint": "bfbe34ab6495750c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-789ff26af6d8ad22", "level": "note", "message": {"text": "Unused endpoint: POST /kyc/:id/approve"}, "properties": {"repobilityId": "3f90826f3571bfdd", "scanner": "scanner-primary", "fingerprint": "789ff26af6d8ad22", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e3d8ac251e11b074", "level": "note", "message": {"text": "Unused endpoint: POST /kyc/:id/reject"}, "properties": {"repobilityId": "ad3b61d245949ca7", "scanner": "scanner-primary", "fingerprint": "e3d8ac251e11b074", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d504b80adc9409ec", "level": "note", "message": {"text": "Unused endpoint: GET /dashboard"}, "properties": {"repobilityId": "914496725cb78367", "scanner": "scanner-primary", "fingerprint": "d504b80adc9409ec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-841e50bf821e4158", "level": "note", "message": {"text": "Unused endpoint: GET /users"}, "properties": {"repobilityId": "0d6c86fc1c3946a7", "scanner": "scanner-primary", "fingerprint": "841e50bf821e4158", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-61dd05ecafcd2eb2", "level": "note", "message": {"text": "Unused endpoint: GET /users/:userId"}, "properties": {"repobilityId": "11ea6488591f4f4c", "scanner": "scanner-primary", "fingerprint": "61dd05ecafcd2eb2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3b3f2c92de1a396a", "level": "note", "message": {"text": "Unused endpoint: POST /users/:userId/impersonate"}, "properties": {"repobilityId": "3c7027dfb3c90f10", "scanner": "scanner-primary", "fingerprint": "3b3f2c92de1a396a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-428a6e6141b4015d", "level": "note", "message": {"text": "Unused endpoint: POST /accounts/:id/adjust"}, "properties": {"repobilityId": "04edfc73a587ef56", "scanner": "scanner-primary", "fingerprint": "428a6e6141b4015d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8898f32c3352cb11", "level": "note", "message": {"text": "Unused endpoint: GET /risk"}, "properties": {"repobilityId": "0eab737446868edc", "scanner": "scanner-primary", "fingerprint": "8898f32c3352cb11", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-de7ed0a6c3a8a3a7", "level": "note", "message": {"text": "Unused endpoint: GET /perf"}, "properties": {"repobilityId": "ca72fb8c782e32ee", "scanner": "scanner-primary", "fingerprint": "de7ed0a6c3a8a3a7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1c9254d2535e9b7c", "level": "note", "message": {"text": "Unused endpoint: POST /deposit"}, "properties": {"repobilityId": "d5ec46dc6dc9ef29", "scanner": "scanner-primary", "fingerprint": "1c9254d2535e9b7c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-92da9ee5166256ca", "level": "note", "message": {"text": "Unused endpoint: POST /withdraw"}, "properties": {"repobilityId": "a3190bdbfada1f3d", "scanner": "scanner-primary", "fingerprint": "92da9ee5166256ca", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}