{"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-878ba1bccf506b0d", "name": "Stray `console.log` in TS/JS \u2014 server.js:197", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server.js:197"}, "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-59b5e3860c418a47", "name": "Stray `console.log` in TS/JS \u2014 scripts/render-preview.js:126", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/render-preview.js:126"}, "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-57ad5c1838201eb7", "name": "Stray `console.log` in TS/JS \u2014 scripts/sprite-sheet.js:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sprite-sheet.js:40"}, "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-4670a677a496818d", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-building-sprites.js:115", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-building-sprites.js:115"}, "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-2372d768aad81359", "name": "Stray `console.log` in TS/JS \u2014 scripts/trim-sprites.js:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/trim-sprites.js:40"}, "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-5b8ca5f32720d2a7", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-farm-texture.js:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-farm-texture.js:42"}, "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-96266b102fddc8fd", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-road-tiles.js:78", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-road-tiles.js:78"}, "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-c2d74f21d63a8e99", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-terrain-tiles.js:142", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-terrain-tiles.js:142"}, "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-7167b065903b15e1", "name": "Stray `console.log` in TS/JS \u2014 scripts/extract-assets.js:531", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/extract-assets.js:531"}, "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-88f1104361e0c944", "name": "Stray `console.log` in TS/JS \u2014 scripts/register-static-assets.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/register-static-assets.js:5"}, "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-7beab496838fb159", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-terrain-features.js:63", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-terrain-features.js:63"}, "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-3ac241adcb543c79", "name": "Stray `console.log` in TS/JS \u2014 server/PlayerManager.js:123", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/PlayerManager.js:123"}, "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-3162468a7889a7a0", "name": "Stray `console.log` in TS/JS \u2014 server/GameEngine.js:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/GameEngine.js:17"}, "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-c03fddcb351dad5b", "name": "Stray `console.log` in TS/JS \u2014 server/StaticAssets.js:101", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/StaticAssets.js:101"}, "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-f79d7010d345983b", "name": "Stray `console.log` in TS/JS \u2014 server/WarManager.js:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/WarManager.js:89"}, "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-10596863700ef27a", "name": "Stray `console.log` in TS/JS \u2014 server/AuthManager.js:101", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/AuthManager.js:101"}, "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-a5580f1ff3027833", "name": "Stray `console.log` in TS/JS \u2014 public/js/socket-client.js:73", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 public/js/socket-client.js:73"}, "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-993aa09c712ffd3a", "name": "Stray `console.log` in TS/JS \u2014 public/js/asset-loader.js:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 public/js/asset-loader.js:42"}, "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-9710c8d059e53154", "name": "No frontend routes/components detected", "shortDescription": {"text": "No frontend routes/components detected"}, "fullDescription": {"text": "No React/Vue/Next routes were found. This is fine for backend-only repos."}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b2a2cf85a4831a4a", "name": "Insecure pattern 'cors_wildcard' in server.js:25", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in server.js:25"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-25ce2a1335918554", "name": "Insecure pattern 'local_storage_auth_token' in public/login.html:89", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in public/login.html:89"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-25b1b9ad85050e48", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/admin.html:227", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin.html:227"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea6d6f61de735fa6", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/js/ui.js:65", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/js/ui.js:65"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-392e31d0e2e516f9", "name": "Insecure pattern 'local_storage_auth_token' in public/js/main.js:50", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in public/js/main.js:50"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 39 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 52 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-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-36b027a466b2e1ee", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-building-sprites.js:108", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-building-sprites.js:108"}, "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-617303fd075f85a7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-farm-texture.js:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-farm-texture.js:27"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-04dc170728d53e17", "name": "Commented-code block (5 lines) in scripts/extract-assets.js:238", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/extract-assets.js:238"}, "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-b5a5c4961a7edd65", "name": "Commented-code block (5 lines) in scripts/import-kenney-assets.py:102", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/import-kenney-assets.py: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-8cae08fa79bb54bd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-terrain-features.js:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-terrain-features.js:56"}, "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-175928de610c9752", "name": "Legacy-named symbol `ticksOld` in server/NeedsEngine.js:186", "shortDescription": {"text": "Legacy-named symbol `ticksOld` in server/NeedsEngine.js:186"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-604b7094fe0215cf", "name": "Commented-code block (5 lines) in server/WalkerEngine.js:11", "shortDescription": {"text": "Commented-code block (5 lines) in server/WalkerEngine.js:11"}, "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-01ba08b32836ecbc", "name": "Legacy-named symbol `ticksOld` in server/PlayerManager.js:41", "shortDescription": {"text": "Legacy-named symbol `ticksOld` in server/PlayerManager.js:41"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-190748db8bb72f85", "name": "Legacy-named symbol `ticksOld` in server/CityManager.js:210", "shortDescription": {"text": "Legacy-named symbol `ticksOld` in server/CityManager.js:210"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e0f60dddddcea839", "name": "Commented-code block (11 lines) in server/constants.js:36", "shortDescription": {"text": "Commented-code block (11 lines) in server/constants.js:36"}, "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-b52f236d61bb244e", "name": "Commented-code block (7 lines) in public/js/renderer.js:130", "shortDescription": {"text": "Commented-code block (7 lines) in public/js/renderer.js:130"}, "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-d32bdac5855a5b69", "name": "Dangling fetch: POST https://api.openai.com/v1/images/edits (scripts/generate-building-sprites.js:108)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/edits (scripts/generate-building-sprites.js:108)"}, "fullDescription": {"text": "`scripts/generate-building-sprites.js:108` calls `POST https://api.openai.com/v1/images/edits` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/images/edits`\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-0b4190a13769add4", "name": "Dangling fetch: POST https://api.openai.com/v1/images/generations (scripts/generate-farm-texture.js:27)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/generations (scripts/generate-farm-texture.js:27)"}, "fullDescription": {"text": "`scripts/generate-farm-texture.js:27` calls `POST https://api.openai.com/v1/images/generations` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/images/generations`\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-23eac8a6578ea9db", "name": "Dangling fetch: POST https://api.openai.com/v1/images/edits (scripts/generate-terrain-features.js:56)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/edits (scripts/generate-terrain-features.js:56)"}, "fullDescription": {"text": "`scripts/generate-terrain-features.js:56` calls `POST https://api.openai.com/v1/images/edits` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/images/edits`\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-1bc898b3b7565990", "name": "Unused endpoint: USE /uploads", "shortDescription": {"text": "Unused endpoint: USE /uploads"}, "fullDescription": {"text": "`server.js` declares `USE /uploads` 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-a5b3437e64c8f7b4", "name": "Unused endpoint: POST /api/auth/register", "shortDescription": {"text": "Unused endpoint: POST /api/auth/register"}, "fullDescription": {"text": "`server.js` declares `POST /api/auth/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-fd55aa0818a7c897", "name": "Unused endpoint: POST /api/auth/login", "shortDescription": {"text": "Unused endpoint: POST /api/auth/login"}, "fullDescription": {"text": "`server.js` declares `POST /api/auth/login` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-33a5daa01dd022c8", "name": "Unused endpoint: GET /api/auth/verify", "shortDescription": {"text": "Unused endpoint: GET /api/auth/verify"}, "fullDescription": {"text": "`server.js` declares `GET /api/auth/verify` 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-b4d87f54d62a1386", "name": "Unused endpoint: GET /api/admin/users", "shortDescription": {"text": "Unused endpoint: GET /api/admin/users"}, "fullDescription": {"text": "`server.js` declares `GET /api/admin/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-e06e49ceb68aa299", "name": "Unused endpoint: GET /api/admin/users/pending", "shortDescription": {"text": "Unused endpoint: GET /api/admin/users/pending"}, "fullDescription": {"text": "`server.js` declares `GET /api/admin/users/pending` 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-111f2f9f59ab2d0a", "name": "Unused endpoint: POST /api/admin/users/:id/approve", "shortDescription": {"text": "Unused endpoint: POST /api/admin/users/:id/approve"}, "fullDescription": {"text": "`server.js` declares `POST /api/admin/users/: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-58f93b3558b9308f", "name": "Unused endpoint: DELETE /api/admin/users/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/admin/users/:id"}, "fullDescription": {"text": "`server.js` declares `DELETE /api/admin/users/: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-5111f98e265a5b6c", "name": "Unused endpoint: GET /api/admin/assets", "shortDescription": {"text": "Unused endpoint: GET /api/admin/assets"}, "fullDescription": {"text": "`server.js` declares `GET /api/admin/assets` 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-a7b35d25856d56e2", "name": "Unused endpoint: POST /api/admin/assets/upload", "shortDescription": {"text": "Unused endpoint: POST /api/admin/assets/upload"}, "fullDescription": {"text": "`server.js` declares `POST /api/admin/assets/upload` 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-78c7a30b38c53a64", "name": "Unused endpoint: DELETE /api/admin/assets/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/admin/assets/:id"}, "fullDescription": {"text": "`server.js` declares `DELETE /api/admin/assets/: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-d25630bc340ff3b6", "name": "Unused endpoint: GET /api/assets/list", "shortDescription": {"text": "Unused endpoint: GET /api/assets/list"}, "fullDescription": {"text": "`server.js` declares `GET /api/assets/list` 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.js` 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-116af7a4d6d51330", "name": "Unused endpoint: GET /game", "shortDescription": {"text": "Unused endpoint: GET /game"}, "fullDescription": {"text": "`server.js` declares `GET /game` 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/20394"}, "properties": {"repository": "stu24801/web-game", "repoUrl": "https://github.com/stu24801/web-game", "branch": "main"}, "results": [{"ruleId": "scanner-878ba1bccf506b0d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server.js:197"}, "properties": {"repobilityId": "a9deebb5fdc93edc", "scanner": "scanner-primary", "fingerprint": "878ba1bccf506b0d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-59b5e3860c418a47", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/render-preview.js:126"}, "properties": {"repobilityId": "6c75e559f1e9e794", "scanner": "scanner-primary", "fingerprint": "59b5e3860c418a47", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-57ad5c1838201eb7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sprite-sheet.js:40"}, "properties": {"repobilityId": "b14f9a0daf23f5a8", "scanner": "scanner-primary", "fingerprint": "57ad5c1838201eb7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4670a677a496818d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-building-sprites.js:115"}, "properties": {"repobilityId": "6a4f1a55587c5874", "scanner": "scanner-primary", "fingerprint": "4670a677a496818d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2372d768aad81359", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/trim-sprites.js:40"}, "properties": {"repobilityId": "0046c4dff7af3f41", "scanner": "scanner-primary", "fingerprint": "2372d768aad81359", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5b8ca5f32720d2a7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-farm-texture.js:42"}, "properties": {"repobilityId": "e5a0e70063add9ad", "scanner": "scanner-primary", "fingerprint": "5b8ca5f32720d2a7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-96266b102fddc8fd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-road-tiles.js:78"}, "properties": {"repobilityId": "acc0deab6bda4e11", "scanner": "scanner-primary", "fingerprint": "96266b102fddc8fd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c2d74f21d63a8e99", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-terrain-tiles.js:142"}, "properties": {"repobilityId": "7b1654f269989b52", "scanner": "scanner-primary", "fingerprint": "c2d74f21d63a8e99", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7167b065903b15e1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/extract-assets.js:531"}, "properties": {"repobilityId": "368041e443f804ea", "scanner": "scanner-primary", "fingerprint": "7167b065903b15e1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-88f1104361e0c944", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/register-static-assets.js:5"}, "properties": {"repobilityId": "44b0f97656fd997b", "scanner": "scanner-primary", "fingerprint": "88f1104361e0c944", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7beab496838fb159", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-terrain-features.js:63"}, "properties": {"repobilityId": "0775d6158d2ad7de", "scanner": "scanner-primary", "fingerprint": "7beab496838fb159", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3ac241adcb543c79", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/PlayerManager.js:123"}, "properties": {"repobilityId": "87a9130d24ff06b7", "scanner": "scanner-primary", "fingerprint": "3ac241adcb543c79", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3162468a7889a7a0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/GameEngine.js:17"}, "properties": {"repobilityId": "511ca03a26a6dbd4", "scanner": "scanner-primary", "fingerprint": "3162468a7889a7a0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c03fddcb351dad5b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/StaticAssets.js:101"}, "properties": {"repobilityId": "9d0a6a70be9e0b12", "scanner": "scanner-primary", "fingerprint": "c03fddcb351dad5b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f79d7010d345983b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/WarManager.js:89"}, "properties": {"repobilityId": "12bb4f2bd3408443", "scanner": "scanner-primary", "fingerprint": "f79d7010d345983b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-10596863700ef27a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/AuthManager.js:101"}, "properties": {"repobilityId": "60cd7dcd389f3cf1", "scanner": "scanner-primary", "fingerprint": "10596863700ef27a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a5580f1ff3027833", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 public/js/socket-client.js:73"}, "properties": {"repobilityId": "c50ae5a7106ff377", "scanner": "scanner-primary", "fingerprint": "a5580f1ff3027833", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-993aa09c712ffd3a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 public/js/asset-loader.js:42"}, "properties": {"repobilityId": "0058714357fc7062", "scanner": "scanner-primary", "fingerprint": "993aa09c712ffd3a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9710c8d059e53154", "level": "none", "message": {"text": "No frontend routes/components detected"}, "properties": {"repobilityId": "44ca61485762e494", "scanner": "scanner-primary", "fingerprint": "9710c8d059e53154", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-b2a2cf85a4831a4a", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in server.js:25"}, "properties": {"repobilityId": "0d9bca6c0839725e", "scanner": "scanner-primary", "fingerprint": "b2a2cf85a4831a4a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server.js"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-25ce2a1335918554", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in public/login.html:89"}, "properties": {"repobilityId": "534339f7f4c6c0ad", "scanner": "scanner-primary", "fingerprint": "25ce2a1335918554", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/login.html"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-25b1b9ad85050e48", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin.html:227"}, "properties": {"repobilityId": "df5203f722eec321", "scanner": "scanner-primary", "fingerprint": "25b1b9ad85050e48", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin.html"}, "region": {"startLine": 227}}}]}, {"ruleId": "scanner-ea6d6f61de735fa6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/js/ui.js:65"}, "properties": {"repobilityId": "366affff0a02103b", "scanner": "scanner-primary", "fingerprint": "ea6d6f61de735fa6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/js/ui.js"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-392e31d0e2e516f9", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in public/js/main.js:50"}, "properties": {"repobilityId": "09fa1cd94b80da8d", "scanner": "scanner-primary", "fingerprint": "392e31d0e2e516f9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/js/main.js"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "299ecbab3a5e26db", "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": "09d39b13a68a5f27", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "188ec097150a1da5", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "519c1785f23b970e", "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": "276ca6505747ffad", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-36b027a466b2e1ee", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-building-sprites.js:108"}, "properties": {"repobilityId": "93e7cc6f422dfecc", "scanner": "scanner-primary", "fingerprint": "36b027a466b2e1ee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-617303fd075f85a7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-farm-texture.js:27"}, "properties": {"repobilityId": "17e3060fbdefb8f9", "scanner": "scanner-primary", "fingerprint": "617303fd075f85a7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-04dc170728d53e17", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/extract-assets.js:238"}, "properties": {"repobilityId": "6e60f46cdcfc30eb", "scanner": "scanner-primary", "fingerprint": "04dc170728d53e17", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b5a5c4961a7edd65", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/import-kenney-assets.py:102"}, "properties": {"repobilityId": "1a9a3d3eb3859730", "scanner": "scanner-primary", "fingerprint": "b5a5c4961a7edd65", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8cae08fa79bb54bd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-terrain-features.js:56"}, "properties": {"repobilityId": "b544b791d6f93975", "scanner": "scanner-primary", "fingerprint": "8cae08fa79bb54bd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-175928de610c9752", "level": "note", "message": {"text": "Legacy-named symbol `ticksOld` in server/NeedsEngine.js:186"}, "properties": {"repobilityId": "4c61e0bf252d58a8", "scanner": "scanner-primary", "fingerprint": "175928de610c9752", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-604b7094fe0215cf", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/WalkerEngine.js:11"}, "properties": {"repobilityId": "2f3fe56465606c02", "scanner": "scanner-primary", "fingerprint": "604b7094fe0215cf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-01ba08b32836ecbc", "level": "note", "message": {"text": "Legacy-named symbol `ticksOld` in server/PlayerManager.js:41"}, "properties": {"repobilityId": "eaf138b4ff8ec45c", "scanner": "scanner-primary", "fingerprint": "01ba08b32836ecbc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-190748db8bb72f85", "level": "note", "message": {"text": "Legacy-named symbol `ticksOld` in server/CityManager.js:210"}, "properties": {"repobilityId": "7db66389380835bc", "scanner": "scanner-primary", "fingerprint": "190748db8bb72f85", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e0f60dddddcea839", "level": "none", "message": {"text": "Commented-code block (11 lines) in server/constants.js:36"}, "properties": {"repobilityId": "7d56f313edc3d355", "scanner": "scanner-primary", "fingerprint": "e0f60dddddcea839", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b52f236d61bb244e", "level": "none", "message": {"text": "Commented-code block (7 lines) in public/js/renderer.js:130"}, "properties": {"repobilityId": "b6d13f2a70e8c142", "scanner": "scanner-primary", "fingerprint": "b52f236d61bb244e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d32bdac5855a5b69", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/edits (scripts/generate-building-sprites.js:108)"}, "properties": {"repobilityId": "6f657cb229ea47e9", "scanner": "scanner-primary", "fingerprint": "d32bdac5855a5b69", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0b4190a13769add4", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/generations (scripts/generate-farm-texture.js:27)"}, "properties": {"repobilityId": "e0fd665b25261acd", "scanner": "scanner-primary", "fingerprint": "0b4190a13769add4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-23eac8a6578ea9db", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/edits (scripts/generate-terrain-features.js:56)"}, "properties": {"repobilityId": "4f02df55e36a869f", "scanner": "scanner-primary", "fingerprint": "23eac8a6578ea9db", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1bc898b3b7565990", "level": "note", "message": {"text": "Unused endpoint: USE /uploads"}, "properties": {"repobilityId": "ff548f29fd0f83df", "scanner": "scanner-primary", "fingerprint": "1bc898b3b7565990", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a5b3437e64c8f7b4", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/register"}, "properties": {"repobilityId": "137491329da076fe", "scanner": "scanner-primary", "fingerprint": "a5b3437e64c8f7b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd55aa0818a7c897", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/login"}, "properties": {"repobilityId": "4b2c3310a7f2d8f2", "scanner": "scanner-primary", "fingerprint": "fd55aa0818a7c897", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-33a5daa01dd022c8", "level": "note", "message": {"text": "Unused endpoint: GET /api/auth/verify"}, "properties": {"repobilityId": "24a88a701363fd25", "scanner": "scanner-primary", "fingerprint": "33a5daa01dd022c8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b4d87f54d62a1386", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/users"}, "properties": {"repobilityId": "cdd56bf6fa5be168", "scanner": "scanner-primary", "fingerprint": "b4d87f54d62a1386", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e06e49ceb68aa299", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/users/pending"}, "properties": {"repobilityId": "86cb28076551ddda", "scanner": "scanner-primary", "fingerprint": "e06e49ceb68aa299", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-111f2f9f59ab2d0a", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/users/:id/approve"}, "properties": {"repobilityId": "72f9417a998fe1e2", "scanner": "scanner-primary", "fingerprint": "111f2f9f59ab2d0a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-58f93b3558b9308f", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/admin/users/:id"}, "properties": {"repobilityId": "69e2808c6c48126e", "scanner": "scanner-primary", "fingerprint": "58f93b3558b9308f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5111f98e265a5b6c", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/assets"}, "properties": {"repobilityId": "9c0d54db2901e480", "scanner": "scanner-primary", "fingerprint": "5111f98e265a5b6c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a7b35d25856d56e2", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/assets/upload"}, "properties": {"repobilityId": "938a5497ca8ddc78", "scanner": "scanner-primary", "fingerprint": "a7b35d25856d56e2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-78c7a30b38c53a64", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/admin/assets/:id"}, "properties": {"repobilityId": "bc0ed5c112f7ebee", "scanner": "scanner-primary", "fingerprint": "78c7a30b38c53a64", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d25630bc340ff3b6", "level": "note", "message": {"text": "Unused endpoint: GET /api/assets/list"}, "properties": {"repobilityId": "80afa44d640e1911", "scanner": "scanner-primary", "fingerprint": "d25630bc340ff3b6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d504b80adc9409ec", "level": "note", "message": {"text": "Unused endpoint: GET /dashboard"}, "properties": {"repobilityId": "05aba64b1e6eae6f", "scanner": "scanner-primary", "fingerprint": "d504b80adc9409ec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-116af7a4d6d51330", "level": "note", "message": {"text": "Unused endpoint: GET /game"}, "properties": {"repobilityId": "5551c431ff669da7", "scanner": "scanner-primary", "fingerprint": "116af7a4d6d51330", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}