{"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": "foundry_unresolved_feedback", "name": "Foundry mined unresolved feedback: Timehue/ShinobiX", "shortDescription": {"text": "Foundry mined unresolved feedback: Timehue/ShinobiX"}, "fullDescription": {"text": "Graph query export: Human feedback without linked fix evidence\nQuery id: unresolved_feedback\nQuery type: motif_query\nIntent: Negative/unresolved examples that should not be hallucinated into fixes.\nMotif: unlinked_feedback_needs_evidence\nTraining usage: negative_or_unresolved\nGraph gold label: supported_by_verification_signal\nRepo: Timehue/ShinobiX\nThread: Timehue/ShinobiX#2\nEvidence:\nGraph motif: Human feedback exists without a linked fix\nMotif id: unlinked_feedback_needs_evidence\nPolarity: bad\nTraining usage: negative_or_unresolved\nSeverity: medium\nRepo: Timehue/ShinobiX\nThread: Timehue/ShinobiX#2\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: Timehue/ShinobiX#2\nRepo: Timehue/ShinobiX\nIssue/PR number: 2\nGraph consistency label: supported_by_verification_signal\nNodes: 120\nEdges: 162\nNode types: {'pr_file': 100, 'link_quality': 6, 'comment': 2, 'comment_chain': 2, 'commit': 2, 'alignment': 2, 'blueprint_finding': 2, '"}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "medium", "confidence": 0.7, "cwe": "", "owasp": ""}}, {"id": "foundry_blueprint_gap", "name": "Foundry mined blueprint gap alignment: Timehue/ShinobiX", "shortDescription": {"text": "Foundry mined blueprint gap alignment: Timehue/ShinobiX"}, "fullDescription": {"text": "Graph query export: Human feedback aligned with blueprint or architecture gaps\nQuery id: blueprint_gap_alignment\nQuery type: motif_query\nIntent: Curriculum-gap examples connecting issue threads to helicopter-view gaps.\nMotif: blueprint_gap_alignment\nTraining usage: curriculum_gap\nGraph gold label: supported_by_verification_signal\nRepo: Timehue/ShinobiX\nThread: Timehue/ShinobiX#2\nEvidence:\nGraph motif: Human feedback aligns with blueprint or architecture gaps\nMotif id: blueprint_gap_alignment\nPolarity: mixed\nTraining usage: curriculum_gap\nSeverity: medium\nRepo: Timehue/ShinobiX\nThread: Timehue/ShinobiX#2\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: Timehue/ShinobiX#2\nRepo: Timehue/ShinobiX\nIssue/PR number: 2\nGraph consistency label: supported_by_verification_signal\nNodes: 120\nEdges: 162\nNode types: {'pr_file': 100, 'link_quality': 6, 'comment': 2, 'comment_chain': 2, 'commit': 2, 'alignment': 2, 'blueprint_finding': "}, "properties": {"scanner": "foundry_dataset", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "cwe": "", "owasp": ""}}, {"id": "foundry_assumption_check", "name": "Foundry mined assumption checks: Timehue/ShinobiX", "shortDescription": {"text": "Foundry mined assumption checks: Timehue/ShinobiX"}, "fullDescription": {"text": "Comment chain pattern product: assumption_checks\nRepo: Timehue/ShinobiX\nThread: Timehue/ShinobiX#1\nOutcome: ambiguous_needs_more_evidence\nThread label: thread_has_human_issue_and_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_weak_supervision, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: Timehue/ShinobiX#1\nRepo: Timehue/ShinobiX\nThread label: thread_has_human_issue_and_fix_context\nOutcome: ambiguous_needs_more_evidence\nComment count: 2\nLinked commit count: 1\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 3\nLabels: {'build_install_failure': 1, 'api_integration_gap': 1}\nPolarities: {'bad': 2}\nChanged file labels: {'dependency_or_build': 2, 'ui_or_frontend': 1}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-1a2bb5071e92b331\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"build_install_failu"}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "medium", "confidence": 0.62, "cwe": "", "owasp": ""}}, {"id": "scanner-9f2399db84d64f38", "name": "Possibly dead Python function: apply_dots", "shortDescription": {"text": "Possibly dead Python function: apply_dots"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bb7d664f6ff7c356", "name": "Possibly dead Python function: ignition", "shortDescription": {"text": "Possibly dead Python function: ignition"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1807b72cd3e24fc0", "name": "Possibly dead Python function: wound_S", "shortDescription": {"text": "Possibly dead Python function: wound_S"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-35e8ad13debc44ce", "name": "Possibly dead Python function: basic_atk", "shortDescription": {"text": "Possibly dead Python function: basic_atk"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-79a6888050b7e9ca", "name": "Possibly dead Python function: buff_prev", "shortDescription": {"text": "Possibly dead Python function: buff_prev"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-03d212e895513f85", "name": "Stray `console.log` in TS/JS \u2014 app.js:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app.js:30"}, "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-db892b711117b5f9", "name": "Stray `console.log` in TS/JS \u2014 server.ts:161", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server.ts:161"}, "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-fe1855e94a84ee5e", "name": "Stray `console.log` in TS/JS \u2014 shinobij.client/server.ts:164", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 shinobij.client/server.ts:164"}, "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-7f5a469b4c5b6ebf", "name": "Stray `console.log` in TS/JS \u2014 shinobij.client/src/lib/world-state.ts:1044", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 shinobij.client/src/lib/world-state.ts:1044"}, "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-e7cd92527c237b70", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 api/images.ts:67", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 api/images.ts:67"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8c052bd3ea74c486", "name": "Stray `console.log` in TS/JS \u2014 api/_storage.ts:830", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 api/_storage.ts:830"}, "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-77954d5f96dceffa", "name": "Stray `console.log` in TS/JS \u2014 api/_force-ipv4.ts:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 api/_force-ipv4.ts:30"}, "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-8519d3b7e66dbc77", "name": "Stray `console.log` in TS/JS \u2014 api/perf-beacon.ts:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 api/perf-beacon.ts: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-f75003519ad17ddf", "name": "Stray `console.log` in TS/JS \u2014 api/cron/_scheduler.ts:43", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 api/cron/_scheduler.ts:43"}, "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-51ddbcf194cd38ee", "name": "Stray `console.log` in TS/JS \u2014 api/_realtime/socket.ts:86", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 api/_realtime/socket.ts:86"}, "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-e587407dd1c4e560", "name": "Stray `console.log` in TS/JS \u2014 api/_realtime/game-loop.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 api/_realtime/game-loop.ts: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-08f3e9e9922e909e", "name": "Stray `console.log` in TS/JS \u2014 scripts/arena-ai-stats.ts:77", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/arena-ai-stats.ts:77"}, "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-d558da41811951c2", "name": "Stray `console.log` in TS/JS \u2014 scripts/pvp-formula-sim.ts:781", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/pvp-formula-sim.ts:781"}, "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-674e355548f729bd", "name": "Stray `console.log` in TS/JS \u2014 scripts/pet-duel-balance.ts:102", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/pet-duel-balance.ts:102"}, "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-c51c5501508bb395", "name": "Stray `console.log` in TS/JS \u2014 scripts/pet-role-balance.ts:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/pet-role-balance.ts:46"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d63da3583b14afc0", "name": "Dockerfile runs as root: Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-59cbf6e36a0e3777", "name": "Docker base image is tag-pinned but not digest-pinned: node:22-bookworm-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-bookworm-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-544067b28b78dbeb", "name": "Insecure pattern 'cors_wildcard' in CLAUDE.md:86", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in CLAUDE.md:86"}, "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-2f9a5de91fb9e0d4", "name": "Insecure pattern 'node_child_process' in shinobij.client/vite.config.ts:8", "shortDescription": {"text": "Insecure pattern 'node_child_process' in shinobij.client/vite.config.ts:8"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-56302c88a6486e52", "name": "Insecure pattern 'cors_wildcard' in shinobij.client/server.ts:7", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in shinobij.client/server.ts:7"}, "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-8c99e4f0f92cbd8d", "name": "Insecure pattern 'node_child_process' in shinobij.client/scripts/gen-all-pet-runs.mjs:14", "shortDescription": {"text": "Insecure pattern 'node_child_process' in shinobij.client/scripts/gen-all-pet-runs.mjs:14"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0d5f94370dc73e26", "name": "Insecure pattern 'node_child_process' in shinobij.client/scripts/gen-all-pet-poses.mjs:16", "shortDescription": {"text": "Insecure pattern 'node_child_process' in shinobij.client/scripts/gen-all-pet-poses.mjs:16"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "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-66d8ceede29113a9", "name": "Very large file: shinobij.client/src/App.tsx (10451 lines)", "shortDescription": {"text": "Very large file: shinobij.client/src/App.tsx (10451 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-59c8f066d0ef312e", "name": "Very large file: shinobij.client/src/screens/PvpBattleScreen.tsx (1680 lines)", "shortDescription": {"text": "Very large file: shinobij.client/src/screens/PvpBattleScreen.tsx (1680 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-92deb0d28b7b5018", "name": "Very large file: shinobij.client/src/screens/PetYard.tsx (1051 lines)", "shortDescription": {"text": "Very large file: shinobij.client/src/screens/PetYard.tsx (1051 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a7eb32982dedba63", "name": "Very large file: shinobij.client/src/screens/Arena.tsx (4913 lines)", "shortDescription": {"text": "Very large file: shinobij.client/src/screens/Arena.tsx (4913 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2279665eb71e2816", "name": "Very large file: shinobij.client/src/screens/PetArena.tsx (1453 lines)", "shortDescription": {"text": "Very large file: shinobij.client/src/screens/PetArena.tsx (1453 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e01c3d26b0a78f26", "name": "Very large file: shinobij.client/src/screens/CentralHub.tsx (1621 lines)", "shortDescription": {"text": "Very large file: shinobij.client/src/screens/CentralHub.tsx (1621 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-074ccabea8889749", "name": "Very large file: shinobij.client/src/screens/AdminPanel.tsx (5567 lines)", "shortDescription": {"text": "Very large file: shinobij.client/src/screens/AdminPanel.tsx (5567 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c6498b75868d7c65", "name": "Very large file: shinobij.client/src/screens/WorldMap.tsx (1934 lines)", "shortDescription": {"text": "Very large file: shinobij.client/src/screens/WorldMap.tsx (1934 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f098951095858c4f", "name": "Very large file: shinobij.client/src/components/PetColiseum.tsx (2640 lines)", "shortDescription": {"text": "Very large file: shinobij.client/src/components/PetColiseum.tsx (2640 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b141785680ffc85a", "name": "Very large file: shinobij.client/src/lib/pet-arena-sim.ts (1072 lines)", "shortDescription": {"text": "Very large file: shinobij.client/src/lib/pet-arena-sim.ts (1072 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0647d79f5a9ab90a", "name": "Very large file: shinobij.client/src/lib/pet-battle-sim.ts (2780 lines)", "shortDescription": {"text": "Very large file: shinobij.client/src/lib/pet-battle-sim.ts (2780 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fa9b6c58480d546c", "name": "Very large file: shinobij.client/src/lib/world-state.ts (1165 lines)", "shortDescription": {"text": "Very large file: shinobij.client/src/lib/world-state.ts (1165 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2cf47f989aed0568", "name": "Very large file: api/world-state.ts (882 lines)", "shortDescription": {"text": "Very large file: api/world-state.ts (882 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-609ebd81aa68ec34", "name": "Very large file: api/save/[name].ts (1332 lines)", "shortDescription": {"text": "Very large file: api/save/[name].ts (1332 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-37c007a88a86b509", "name": "Very large file: api/pvp/move.ts (1520 lines)", "shortDescription": {"text": "Very large file: api/pvp/move.ts (1520 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb8fbd1c781b5f19", "name": "Very large file: scripts/pvp-formula-sim.ts (944 lines)", "shortDescription": {"text": "Very large file: scripts/pvp-formula-sim.ts (944 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "67 tests / 371 src (ratio 0.18)."}, "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-b3ed68815bca2f8c", "name": "Node manifest has dependencies but no lockfile: package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 231 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 106 placeholder/mock markers across 38 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-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, lockfile. 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-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, ci, lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fbecdd0f890d254a", "name": "Commented-code block (8 lines) in server.ts:142", "shortDescription": {"text": "Commented-code block (8 lines) in server.ts:142"}, "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-f9dcfc7c9e31c959", "name": "Commented-code block (5 lines) in server-routes.test.ts:70", "shortDescription": {"text": "Commented-code block (5 lines) in server-routes.test.ts:70"}, "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-bd588a71dd0ea77a", "name": "Commented-code block (6 lines) in shinobij.client/vite.config.ts:167", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/vite.config.ts:167"}, "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-0d68d2ad88a8f011", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/vite.config.ts:388", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/vite.config.ts:388"}, "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-76432f75e7b25f31", "name": "Commented-code block (5 lines) in shinobij.client/scripts/gen-walkmask.mjs:1", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/scripts/gen-walkmask.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6d82dc0561b7def7", "name": "Commented-code block (7 lines) in shinobij.client/scripts/finalize-evo-poses.mjs:3", "shortDescription": {"text": "Commented-code block (7 lines) in shinobij.client/scripts/finalize-evo-poses.mjs:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-85a038ac23e8b34d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-bg.mjs:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-bg.mjs:60"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d8edadb6db17eaa8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-map-flux.mjs:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-map-flux.mjs:33"}, "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-997fefad89e750ea", "name": "Commented-code block (5 lines) in shinobij.client/scripts/gen-asset.mjs:6", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/scripts/gen-asset.mjs:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-03b30c0d0078ec2a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-asset.mjs:189", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-asset.mjs:189"}, "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-c85ff3ed70e4ddb3", "name": "Commented-code block (6 lines) in shinobij.client/scripts/to-webp.mjs:8", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/scripts/to-webp.mjs: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-5a0f75e1dc112988", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-sector-depth.mjs:62", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-sector-depth.mjs:62"}, "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-df13fb35888c7878", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-pet-anim.mjs:64", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-pet-anim.mjs:64"}, "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-fed110f18498ca99", "name": "Commented-code block (8 lines) in shinobij.client/scripts/normalize-petbody-facing.mjs:3", "shortDescription": {"text": "Commented-code block (8 lines) in shinobij.client/scripts/normalize-petbody-facing.mjs:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-72cb16795993c2d9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/normalize-petbody-facing.mjs:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/normalize-petbody-facing.mjs:60"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ed7b69ae7d2aba87", "name": "Commented-code block (5 lines) in shinobij.client/scripts/gen-pet-run.mjs:1", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/scripts/gen-pet-run.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ff2f29112a7b6adc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-pet-run.mjs:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-pet-run.mjs:47"}, "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-7544023807809fc6", "name": "Commented-code block (5 lines) in shinobij.client/scripts/gen-pet-3d.mjs:5", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/scripts/gen-pet-3d.mjs:5"}, "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-030605f215c10045", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-pet-3d.mjs:61", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-pet-3d.mjs:61"}, "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-02b4be6e2f2eda21", "name": "Commented-code block (5 lines) in shinobij.client/scripts/gen-sector-props.mjs:5", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/scripts/gen-sector-props.mjs:5"}, "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-0ad0c4b74c054f38", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-sector-props.mjs:91", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-sector-props.mjs:91"}, "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-394af19f23cea8c2", "name": "Commented-code block (6 lines) in shinobij.client/scripts/gen-pet-battle-sprites.mjs:3", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/scripts/gen-pet-battle-sprites.mjs:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1abf82ec995f6388", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-pet-battle-sprites.mjs:90", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-pet-battle-sprites.mjs:90"}, "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-91dadfe36e360e34", "name": "Commented-code block (5 lines) in shinobij.client/scripts/gen-sector-foreground.mjs:5", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/scripts/gen-sector-foreground.mjs:5"}, "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-c92c02ad03d7f404", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-sector-foreground.mjs:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-sector-foreground.mjs:71"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-55d503b3f0591917", "name": "Commented-code block (5 lines) in shinobij.client/scripts/gen-ai-opponent-art.mjs:1", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/scripts/gen-ai-opponent-art.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e189e52929ba4408", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-ai-opponent-art.mjs:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-ai-opponent-art.mjs:68"}, "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-6581ef176f620eaa", "name": "Commented-code block (5 lines) in shinobij.client/src/petvfx.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/petvfx.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a6ac2657166f87e2", "name": "Commented-code block (10 lines) in shinobij.client/src/professionLogic.ts:63", "shortDescription": {"text": "Commented-code block (10 lines) in shinobij.client/src/professionLogic.ts:63"}, "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-50ff16103687eb2f", "name": "Commented-code block (8 lines) in shinobij.client/src/authFetch.ts:117", "shortDescription": {"text": "Commented-code block (8 lines) in shinobij.client/src/authFetch.ts:117"}, "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-29a585e3d96c7800", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/authFetch.ts:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/authFetch.ts:9"}, "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-108d13f3e0600ab8", "name": "Commented-code block (5 lines) in shinobij.client/src/App.tsx:168", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/App.tsx:168"}, "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-c8ea40c8171c7603", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/App.tsx:98", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/App.tsx:98"}, "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-d0bc18a157e9ba7b", "name": "Commented-code block (7 lines) in shinobij.client/src/App.size.test.ts:15", "shortDescription": {"text": "Commented-code block (7 lines) in shinobij.client/src/App.size.test.ts: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-49178cb5df7ad6c1", "name": "Commented-code block (6 lines) in shinobij.client/src/types/pet.ts:32", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/src/types/pet.ts:32"}, "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-e8ea818f2eee2180", "name": "Commented-code block (5 lines) in shinobij.client/src/types/combat.ts:54", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/types/combat.ts:54"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-adf8b2ebfa43aa9a", "name": "Commented-code block (7 lines) in shinobij.client/src/types/character.ts:147", "shortDescription": {"text": "Commented-code block (7 lines) in shinobij.client/src/types/character.ts:147"}, "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-bc979265e018abde", "name": "Commented-code block (5 lines) in shinobij.client/src/screens/PvpBattleScreen.tsx:33", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/screens/PvpBattleScreen.tsx:33"}, "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-06dca73f5895dfe2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/PvpBattleScreen.tsx:650", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/PvpBattleScreen.tsx:650"}, "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-b8b831497f7bcb83", "name": "Commented-code block (12 lines) in shinobij.client/src/screens/ShinobiCouncilHall.tsx:239", "shortDescription": {"text": "Commented-code block (12 lines) in shinobij.client/src/screens/ShinobiCouncilHall.tsx:239"}, "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-a2a682ecd271b74a", "name": "Commented-code block (5 lines) in shinobij.client/src/screens/ClanHall.tsx:284", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/screens/ClanHall.tsx:284"}, "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-a3911710b3f88eb2", "name": "Commented-code block (6 lines) in shinobij.client/src/screens/ProfessionPicker.tsx:80", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/src/screens/ProfessionPicker.tsx:80"}, "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-00678fd3c2e2307f", "name": "Commented-code block (8 lines) in shinobij.client/src/screens/AdminDiagnosticsPanel.tsx:7", "shortDescription": {"text": "Commented-code block (8 lines) in shinobij.client/src/screens/AdminDiagnosticsPanel.tsx:7"}, "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-a6d1dfdcdd39ad35", "name": "Commented-code block (7 lines) in shinobij.client/src/screens/PetYard.tsx:106", "shortDescription": {"text": "Commented-code block (7 lines) in shinobij.client/src/screens/PetYard.tsx:106"}, "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-b06f7e96b95bcc34", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/PetYard.tsx:206", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/PetYard.tsx: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-6934688f55974ab4", "name": "Commented-code block (5 lines) in shinobij.client/src/screens/AdminLogin.tsx:41", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/screens/AdminLogin.tsx:41"}, "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-ede8064ec7122199", "name": "Commented-code block (6 lines) in shinobij.client/src/screens/Arena.tsx:237", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/src/screens/Arena.tsx:237"}, "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-8cd2d786c1658b6d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/Arena.tsx:352", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/Arena.tsx:352"}, "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-f76bb2318b0f9a5d", "name": "Commented-code block (6 lines) in shinobij.client/src/screens/VillageWarScreen.tsx:127", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/src/screens/VillageWarScreen.tsx:127"}, "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-1f1f60f906de4cf9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/VillageWarScreen.tsx:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/VillageWarScreen.tsx:35"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4ee8255da7d71673", "name": "Commented-code block (6 lines) in shinobij.client/src/screens/Bank.tsx:38", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/src/screens/Bank.tsx:38"}, "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-8fcccc149b5a4d5b", "name": "Commented-code block (6 lines) in shinobij.client/src/screens/PetArena.tsx:244", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/src/screens/PetArena.tsx:244"}, "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-d1f67f0cf7e861d7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/PetArena.tsx:719", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/PetArena.tsx:719"}, "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-252a87d617b4556b", "name": "Commented-code block (6 lines) in shinobij.client/src/screens/Profile.tsx:69", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/src/screens/Profile.tsx:69"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e2861ce0617bdba4", "name": "Commented-code block (7 lines) in shinobij.client/src/screens/DailyProfessionMissions.tsx:47", "shortDescription": {"text": "Commented-code block (7 lines) in shinobij.client/src/screens/DailyProfessionMissions.tsx:47"}, "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-0f647b0370d33e39", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/Messages.tsx:5", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/Messages.tsx:5"}, "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-ae58ac0ef6fbc49e", "name": "Commented-code block (6 lines) in shinobij.client/src/screens/Hospital.tsx:56", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/src/screens/Hospital.tsx:56"}, "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-93daa12f552c84ee", "name": "Commented-code block (5 lines) in shinobij.client/src/screens/Training.tsx:54", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/screens/Training.tsx:54"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-30af589236d4c6ee", "name": "Commented-code block (5 lines) in shinobij.client/src/screens/TownHall.tsx:75", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/screens/TownHall.tsx:75"}, "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-6e038ef784e15ec9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/TownHall.tsx:115", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/TownHall.tsx:115"}, "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-cd5a761416f309fd", "name": "Commented-code block (5 lines) in shinobij.client/src/screens/Dungeon.tsx:71", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/screens/Dungeon.tsx:71"}, "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-2615d24bc2973981", "name": "Commented-code block (6 lines) in shinobij.client/src/screens/WeeklyBossArena.tsx:7", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/src/screens/WeeklyBossArena.tsx:7"}, "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-3f5e03d5507dc5f1", "name": "Commented-code block (8 lines) in shinobij.client/src/screens/Missions.tsx:48", "shortDescription": {"text": "Commented-code block (8 lines) in shinobij.client/src/screens/Missions.tsx:48"}, "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-099f595258b13101", "name": "Commented-code block (9 lines) in shinobij.client/src/screens/StartScreen.tsx:53", "shortDescription": {"text": "Commented-code block (9 lines) in shinobij.client/src/screens/StartScreen.tsx:53"}, "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-d91eff581e9a1f7f", "name": "Commented-code block (6 lines) in shinobij.client/src/screens/CentralHub.tsx:73", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/src/screens/CentralHub.tsx:73"}, "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-863410ea125e0b72", "name": "Commented-code block (8 lines) in shinobij.client/src/screens/AdminPanel.tsx:178", "shortDescription": {"text": "Commented-code block (8 lines) in shinobij.client/src/screens/AdminPanel.tsx:178"}, "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-3f29246933f5b831", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/AdminPanel.tsx:787", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/AdminPanel.tsx:787"}, "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-cfb7cd8c02d79c5b", "name": "Commented-code block (5 lines) in shinobij.client/src/screens/ClanBattlesTab.tsx:72", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/screens/ClanBattlesTab.tsx:72"}, "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-44f77d6cfc165e0e", "name": "Commented-code block (5 lines) in shinobij.client/src/screens/WorldMap.tsx:112", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/screens/WorldMap.tsx:112"}, "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-8bbb362eb0abe8ca", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/WorldMap.tsx:425", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/WorldMap.tsx:425"}, "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-88f9da2eaf14f07d", "name": "Commented-code block (5 lines) in shinobij.client/src/screens/BloodlineMaker.tsx:222", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/screens/BloodlineMaker.tsx:222"}, "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-1e489d53fff1aa55", "name": "Commented-code block (5 lines) in shinobij.client/src/constants/pet-arena.ts:13", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/constants/pet-arena.ts:13"}, "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-60051b665052bcf6", "name": "Commented-code block (8 lines) in shinobij.client/src/components/PetBattleAvatar.tsx:10", "shortDescription": {"text": "Commented-code block (8 lines) in shinobij.client/src/components/PetBattleAvatar.tsx:10"}, "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-ee30a8f769911cc9", "name": "Commented-code block (5 lines) in shinobij.client/src/components/CombatSideHud.tsx:154", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/components/CombatSideHud.tsx:154"}, "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-5ade97cc3776157f", "name": "Commented-code block (7 lines) in shinobij.client/src/components/SectorScene3D.tsx:26", "shortDescription": {"text": "Commented-code block (7 lines) in shinobij.client/src/components/SectorScene3D.tsx:26"}, "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-b1fbd520b1ae51b8", "name": "Commented-code block (5 lines) in shinobij.client/src/components/GameAlert.tsx:109", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/components/GameAlert.tsx:109"}, "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-54aa8a6bb7bb4225", "name": "Commented-code block (6 lines) in shinobij.client/src/components/LeftProfileCard.tsx:34", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/src/components/LeftProfileCard.tsx:34"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d2bf00c820ecda56", "name": "Commented-code block (7 lines) in shinobij.client/src/components/PetColiseum.tsx:72", "shortDescription": {"text": "Commented-code block (7 lines) in shinobij.client/src/components/PetColiseum.tsx:72"}, "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-0575496af0ce896c", "name": "Commented-code block (6 lines) in shinobij.client/src/components/SectorScene3DScene.tsx:41", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/src/components/SectorScene3DScene.tsx:41"}, "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-54f632f1880fb864", "name": "Commented-code block (6 lines) in shinobij.client/src/components/BattleLockKeeper.tsx:5", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/src/components/BattleLockKeeper.tsx:5"}, "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-0f7231d96a1ec49f", "name": "Commented-code block (7 lines) in shinobij.client/src/lib/pet-arena-sim.ts:26", "shortDescription": {"text": "Commented-code block (7 lines) in shinobij.client/src/lib/pet-arena-sim.ts:26"}, "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-90f943d204e3a027", "name": "Commented-code block (5 lines) in shinobij.client/src/lib/pet-battle-sim.ts:45", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/pet-battle-sim.ts:45"}, "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-081c8ed82b471f2f", "name": "Commented-code block (5 lines) in shinobij.client/src/lib/pet-arena-sim.test.ts:88", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/pet-arena-sim.test.ts:88"}, "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-da63e2e33973273c", "name": "Commented-code block (6 lines) in shinobij.client/src/lib/shared-images.ts:57", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/src/lib/shared-images.ts:57"}, "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-281aba6fa8c9eb77", "name": "Commented-code block (9 lines) in shinobij.client/src/lib/pet-balance.ts:56", "shortDescription": {"text": "Commented-code block (9 lines) in shinobij.client/src/lib/pet-balance.ts:56"}, "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-99573248f6be70bb", "name": "Commented-code block (5 lines) in shinobij.client/src/lib/pet.ts:63", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/pet.ts:63"}, "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-39141d1c3080a96a", "name": "Commented-code block (5 lines) in shinobij.client/src/lib/tags.ts:151", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/tags.ts:151"}, "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-7fb5739f6c186cd4", "name": "Commented-code block (5 lines) in shinobij.client/src/lib/clan-upgrades.ts:41", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/clan-upgrades.ts:41"}, "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-8affa5e355e32a44", "name": "Commented-code block (5 lines) in shinobij.client/src/lib/jutsu-effects.ts:24", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/jutsu-effects.ts:24"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5db6931b23fc9754", "name": "Commented-code block (7 lines) in shinobij.client/src/lib/pet-duel-sim.ts:4", "shortDescription": {"text": "Commented-code block (7 lines) in shinobij.client/src/lib/pet-duel-sim.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5ec699ac84a4f3cd", "name": "Commented-code block (5 lines) in shinobij.client/src/lib/equipment.ts:21", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/equipment.ts:21"}, "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-e020575ba420d81c", "name": "Commented-code block (8 lines) in shinobij.client/src/lib/jutsu-scaling.ts:53", "shortDescription": {"text": "Commented-code block (8 lines) in shinobij.client/src/lib/jutsu-scaling.ts:53"}, "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-8f588ac0b77acf17", "name": "Commented-code block (6 lines) in shinobij.client/src/lib/progression.ts:49", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/src/lib/progression.ts:49"}, "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-42cbc4ca86fd0ea1", "name": "Commented-code block (5 lines) in shinobij.client/src/lib/pet-tactics.ts:61", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/pet-tactics.ts:61"}, "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-aa95c4270ddc35ac", "name": "Commented-code block (5 lines) in shinobij.client/src/lib/clan-api.ts:20", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/clan-api.ts:20"}, "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-88af7c377917fb2e", "name": "Commented-code block (8 lines) in shinobij.client/src/lib/battle-save.ts:8", "shortDescription": {"text": "Commented-code block (8 lines) in shinobij.client/src/lib/battle-save.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-d9ff0dcbcd899e69", "name": "Commented-code block (7 lines) in shinobij.client/src/lib/pet-battle-anim.ts:284", "shortDescription": {"text": "Commented-code block (7 lines) in shinobij.client/src/lib/pet-battle-anim.ts:284"}, "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-23b8fb6d33db4322", "name": "Commented-code block (9 lines) in shinobij.client/src/lib/clan-math.ts:59", "shortDescription": {"text": "Commented-code block (9 lines) in shinobij.client/src/lib/clan-math.ts:59"}, "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-655cc50707e3ae5c", "name": "Commented-code block (6 lines) in shinobij.client/src/lib/pet-sfx.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/src/lib/pet-sfx.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4a226246f25cf756", "name": "Commented-code block (6 lines) in shinobij.client/src/lib/utils.ts:47", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/src/lib/utils.ts:47"}, "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-874fcffa015ff7c6", "name": "Commented-code block (8 lines) in shinobij.client/src/lib/jutsu-vfx.ts:66", "shortDescription": {"text": "Commented-code block (8 lines) in shinobij.client/src/lib/jutsu-vfx.ts:66"}, "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-4071a87437f785d5", "name": "Commented-code block (7 lines) in shinobij.client/src/lib/hex-path.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in shinobij.client/src/lib/hex-path.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-819a6e5e76038744", "name": "Commented-code block (5 lines) in shinobij.client/src/lib/jutsu.ts:18", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/jutsu.ts:18"}, "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-3ed1afb2d957c6d6", "name": "Commented-code block (10 lines) in shinobij.client/src/lib/endless-tower.ts:34", "shortDescription": {"text": "Commented-code block (10 lines) in shinobij.client/src/lib/endless-tower.ts:34"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-454bf18cc5726cae", "name": "Commented-code block (5 lines) in shinobij.client/src/lib/screen-guards.ts:76", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/screen-guards.ts:76"}, "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-c4f611144b618840", "name": "Commented-code block (5 lines) in shinobij.client/src/lib/pet-roles.ts:64", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/pet-roles.ts:64"}, "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-c9e1500272c35ced", "name": "Commented-code block (6 lines) in shinobij.client/src/lib/pet-coliseum-scene.ts:53", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/src/lib/pet-coliseum-scene.ts:53"}, "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-796edcfcbb4462e6", "name": "Commented-code block (7 lines) in shinobij.client/src/lib/onboarding-step.ts:8", "shortDescription": {"text": "Commented-code block (7 lines) in shinobij.client/src/lib/onboarding-step.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-744ac9dd5799594e", "name": "Commented-code block (6 lines) in shinobij.client/src/lib/combat-math.ts:96", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/src/lib/combat-math.ts:96"}, "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-1e0c204b521f0a05", "name": "Commented-code block (13 lines) in shinobij.client/src/lib/hollow-gate-dungeon.ts:25", "shortDescription": {"text": "Commented-code block (13 lines) in shinobij.client/src/lib/hollow-gate-dungeon.ts:25"}, "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-c69fcf189d5eecb3", "name": "Commented-code block (7 lines) in shinobij.client/src/lib/perfTelemetry.ts:4", "shortDescription": {"text": "Commented-code block (7 lines) in shinobij.client/src/lib/perfTelemetry.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b4dd37e8392da704", "name": "Commented-code block (9 lines) in shinobij.client/src/lib/realtime.ts:13", "shortDescription": {"text": "Commented-code block (9 lines) in shinobij.client/src/lib/realtime.ts:13"}, "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-b6905ddea70c697e", "name": "Commented-code block (5 lines) in shinobij.client/src/lib/player-api.ts:45", "shortDescription": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/player-api.ts:45"}, "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-034a8c9c73d64de9", "name": "Commented-code block (6 lines) in shinobij.client/src/lib/world-state.ts:247", "shortDescription": {"text": "Commented-code block (6 lines) in shinobij.client/src/lib/world-state.ts:247"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b8368d18fa407bd0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/lib/world-state.ts:703", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/lib/world-state.ts:703"}, "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-185bab902edca94a", "name": "Commented-code block (10 lines) in shinobij.client/src/lib/pvp-session.ts:14", "shortDescription": {"text": "Commented-code block (10 lines) in shinobij.client/src/lib/pvp-session.ts:14"}, "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-c012f4adb76cee7b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/lib/pvp-session.ts:2", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/lib/pvp-session.ts:2"}, "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-46cc222791d9b312", "name": "Commented-code block (9 lines) in api/weekly-boss.ts:7", "shortDescription": {"text": "Commented-code block (9 lines) in api/weekly-boss.ts:7"}, "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-5636874aed0e012e", "name": "Commented-code block (5 lines) in api/_map-control-reward.test.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in api/_map-control-reward.test.ts:5"}, "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-45d4e835be4d8a56", "name": "Commented-code block (5 lines) in api/generate-image.ts:68", "shortDescription": {"text": "Commented-code block (5 lines) in api/generate-image.ts:68"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ed0a1998311c4ecd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/generate-image.ts:126", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/generate-image.ts:126"}, "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-9142368253d7ad7d", "name": "Commented-code block (9 lines) in api/_xp-engine.ts:6", "shortDescription": {"text": "Commented-code block (9 lines) in api/_xp-engine.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8aaafa68947d19c2", "name": "Commented-code block (6 lines) in api/_territory-supply.ts:6", "shortDescription": {"text": "Commented-code block (6 lines) in api/_territory-supply.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2e644d33e4ab41cc", "name": "Commented-code block (8 lines) in api/images.ts:13", "shortDescription": {"text": "Commented-code block (8 lines) in api/images.ts:13"}, "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-24a707b6bb12d8ec", "name": "Commented-code block (8 lines) in api/_ratelimit.ts:86", "shortDescription": {"text": "Commented-code block (8 lines) in api/_ratelimit.ts:86"}, "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-9e2f2e7c29194a64", "name": "Commented-code block (5 lines) in api/admin-auth.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in api/admin-auth.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-e24ed855dabf929b", "name": "Commented-code block (5 lines) in api/_lock.test.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in api/_lock.test.ts:5"}, "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-3a1b53ede464baf3", "name": "Commented-code block (11 lines) in api/_bank-interest.ts:6", "shortDescription": {"text": "Commented-code block (11 lines) in api/_bank-interest.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bda50601681a6c88", "name": "Commented-code block (5 lines) in api/_treasury-donate.test.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in api/_treasury-donate.test.ts:5"}, "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-a29922b3b7eb6464", "name": "Commented-code block (7 lines) in api/_map-control-reward.ts:10", "shortDescription": {"text": "Commented-code block (7 lines) in api/_map-control-reward.ts:10"}, "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-1c9514fa6812e7da", "name": "Commented-code block (6 lines) in api/_ranked-match-token.test.ts:5", "shortDescription": {"text": "Commented-code block (6 lines) in api/_ranked-match-token.test.ts:5"}, "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-f9b27a41a2ebeada", "name": "Commented-code block (7 lines) in api/_clan-save-validate.test.ts:5", "shortDescription": {"text": "Commented-code block (7 lines) in api/_clan-save-validate.test.ts:5"}, "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-b168ac13fc1de2d5", "name": "Commented-code block (6 lines) in api/_village-state-validate.ts:10", "shortDescription": {"text": "Commented-code block (6 lines) in api/_village-state-validate.ts:10"}, "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-30ebea5d2916a015", "name": "Commented-code block (6 lines) in api/_xp-engine.test.ts:10", "shortDescription": {"text": "Commented-code block (6 lines) in api/_xp-engine.test.ts:10"}, "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-5642a22f0308e9e3", "name": "Commented-code block (7 lines) in api/_lock.ts:90", "shortDescription": {"text": "Commented-code block (7 lines) in api/_lock.ts:90"}, "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-7c8facf7de59a47c", "name": "Commented-code block (5 lines) in api/_clan-save-validate.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in api/_clan-save-validate.ts:7"}, "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-e9a84657c1118638", "name": "Commented-code block (7 lines) in api/_vercel.d.ts:3", "shortDescription": {"text": "Commented-code block (7 lines) in api/_vercel.d.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-85325be8215ce506", "name": "Commented-code block (6 lines) in api/img.ts:14", "shortDescription": {"text": "Commented-code block (6 lines) in api/img.ts:14"}, "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-62fd442929108e0d", "name": "Commented-code block (7 lines) in api/_storage.test.ts:5", "shortDescription": {"text": "Commented-code block (7 lines) in api/_storage.test.ts:5"}, "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-7c83c22ced02def1", "name": "Commented-code block (8 lines) in api/_treasury-donate.ts:4", "shortDescription": {"text": "Commented-code block (8 lines) in api/_treasury-donate.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3b6f30d661936789", "name": "Commented-code block (6 lines) in api/_receipts.ts:7", "shortDescription": {"text": "Commented-code block (6 lines) in api/_receipts.ts:7"}, "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-dcd112a6538ae86d", "name": "Commented-code block (5 lines) in api/_auth.ts:41", "shortDescription": {"text": "Commented-code block (5 lines) in api/_auth.ts:41"}, "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-b30a1839a3910b35", "name": "Commented-code block (7 lines) in api/_asset-registry.ts:7", "shortDescription": {"text": "Commented-code block (7 lines) in api/_asset-registry.ts:7"}, "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-ab5d132ed96ff243", "name": "Legacy-named symbol `hashLegacy` in api/player-auth.ts:71", "shortDescription": {"text": "Legacy-named symbol `hashLegacy` in api/player-auth.ts:71"}, "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-ea0fc4e68f0642fd", "name": "Commented-code block (6 lines) in api/player-auth.ts:9", "shortDescription": {"text": "Commented-code block (6 lines) in api/player-auth.ts:9"}, "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-b903df1dc2cdf8b3", "name": "Commented-code block (6 lines) in api/_storage.ts:23", "shortDescription": {"text": "Commented-code block (6 lines) in api/_storage.ts:23"}, "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-98c4319b9c92a1b9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/_storage.ts:300", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_storage.ts:300"}, "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-f9e159e78a6dd832", "name": "Commented-code block (6 lines) in api/game-state.ts:26", "shortDescription": {"text": "Commented-code block (6 lines) in api/game-state.ts:26"}, "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-6702e988cc910827", "name": "Commented-code block (5 lines) in api/_combat-formula-parity.test.ts:98", "shortDescription": {"text": "Commented-code block (5 lines) in api/_combat-formula-parity.test.ts:98"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eac99827be2732a7", "name": "Commented-code block (5 lines) in api/_text-moderation.ts:82", "shortDescription": {"text": "Commented-code block (5 lines) in api/_text-moderation.ts:82"}, "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-16abbcbe830b06f8", "name": "Commented-code block (7 lines) in api/perf-beacon.ts:8", "shortDescription": {"text": "Commented-code block (7 lines) in api/perf-beacon.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-f52db7f3f334bd03", "name": "Commented-code block (5 lines) in api/_village-state-validate.test.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in api/_village-state-validate.test.ts:5"}, "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-1828f7953d2268ee", "name": "Commented-code block (8 lines) in api/world-state.ts:21", "shortDescription": {"text": "Commented-code block (8 lines) in api/world-state.ts:21"}, "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-ec017b81806c4bcf", "name": "Commented-code block (5 lines) in api/_utils.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in api/_utils.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-249cb5fb1c0e3160", "name": "Commented-code block (5 lines) in api/player/heal.ts:52", "shortDescription": {"text": "Commented-code block (5 lines) in api/player/heal.ts:52"}, "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-a6bba676974504e4", "name": "Commented-code block (7 lines) in api/player/roster.ts:8", "shortDescription": {"text": "Commented-code block (7 lines) in api/player/roster.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-1f8d4c66a608fb0d", "name": "Commented-code block (6 lines) in api/player/attack.ts:19", "shortDescription": {"text": "Commented-code block (6 lines) in api/player/attack.ts:19"}, "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-9aad3e6eb9496844", "name": "Commented-code block (5 lines) in api/player/heartbeat.ts:11", "shortDescription": {"text": "Commented-code block (5 lines) in api/player/heartbeat.ts: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-e15be3893272a5fd", "name": "Commented-code block (7 lines) in api/player/challenge.ts:12", "shortDescription": {"text": "Commented-code block (7 lines) in api/player/challenge.ts:12"}, "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-5a5b9f4115ff753b", "name": "Commented-code block (6 lines) in api/player/friends.ts:8", "shortDescription": {"text": "Commented-code block (6 lines) in api/player/friends.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-a2217d1cbd33ebc8", "name": "Commented-code block (5 lines) in api/bloodlines/list.ts:40", "shortDescription": {"text": "Commented-code block (5 lines) in api/bloodlines/list.ts:40"}, "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-b5ea2fa90cbad455", "name": "Commented-code block (5 lines) in api/clans/list.ts:11", "shortDescription": {"text": "Commented-code block (5 lines) in api/clans/list.ts: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-1da511e55df7056e", "name": "Commented-code block (5 lines) in api/missions/daily.ts:52", "shortDescription": {"text": "Commented-code block (5 lines) in api/missions/daily.ts:52"}, "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-38a3120809d00993", "name": "Commented-code block (7 lines) in api/missions/_mission-catalog.test.ts:13", "shortDescription": {"text": "Commented-code block (7 lines) in api/missions/_mission-catalog.test.ts:13"}, "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-701c1943daebd1c8", "name": "Commented-code block (6 lines) in api/missions/report-raid.ts:38", "shortDescription": {"text": "Commented-code block (6 lines) in api/missions/report-raid.ts:38"}, "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-99e13374e01cc2d4", "name": "Commented-code block (7 lines) in api/missions/report-pvp-win.ts:89", "shortDescription": {"text": "Commented-code block (7 lines) in api/missions/report-pvp-win.ts:89"}, "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-64b9fe46990f3295", "name": "Commented-code block (6 lines) in api/missions/report-pet-event.ts:35", "shortDescription": {"text": "Commented-code block (6 lines) in api/missions/report-pet-event.ts:35"}, "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-619fe278d7fdd223", "name": "Commented-code block (10 lines) in api/missions/_mission-catalog.ts:5", "shortDescription": {"text": "Commented-code block (10 lines) in api/missions/_mission-catalog.ts:5"}, "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-68b9b9ae156c99b8", "name": "Commented-code block (7 lines) in api/missions/claim-mission.ts:28", "shortDescription": {"text": "Commented-code block (7 lines) in api/missions/claim-mission.ts:28"}, "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-a2c5bd53b02f4d2b", "name": "Commented-code block (5 lines) in api/missions/_progress.ts:102", "shortDescription": {"text": "Commented-code block (5 lines) in api/missions/_progress.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-0e01ef5d5cc33b42", "name": "Commented-code block (7 lines) in api/missions/_pool.ts:118", "shortDescription": {"text": "Commented-code block (7 lines) in api/missions/_pool.ts:118"}, "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-6117b1891cc2e7a8", "name": "Commented-code block (6 lines) in api/missions/expedition-start.ts:97", "shortDescription": {"text": "Commented-code block (6 lines) in api/missions/expedition-start.ts:97"}, "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-85f9def94c1d521e", "name": "Commented-code block (5 lines) in api/save/[name].ts:54", "shortDescription": {"text": "Commented-code block (5 lines) in api/save/[name].ts:54"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-76a39f498bafad3c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/save/[name].ts:891", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/save/[name].ts:891"}, "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-d97251d5e512b280", "name": "Commented-code block (6 lines) in api/admin/battle-receipts.ts:9", "shortDescription": {"text": "Commented-code block (6 lines) in api/admin/battle-receipts.ts:9"}, "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-93f6cb0735698259", "name": "Commented-code block (6 lines) in api/admin/asset-report.ts:9", "shortDescription": {"text": "Commented-code block (6 lines) in api/admin/asset-report.ts:9"}, "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-63ca6f446f6f16ff", "name": "Commented-code block (12 lines) in api/admin/server-reset.ts:20", "shortDescription": {"text": "Commented-code block (12 lines) in api/admin/server-reset.ts:20"}, "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-fa3ad27c3ea16cdc", "name": "Commented-code block (5 lines) in api/admin/bloodline-review.ts:18", "shortDescription": {"text": "Commented-code block (5 lines) in api/admin/bloodline-review.ts:18"}, "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-7d06297fa8fcf65e", "name": "Commented-code block (5 lines) in api/admin/moderation.ts:11", "shortDescription": {"text": "Commented-code block (5 lines) in api/admin/moderation.ts: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-3307298a842c6d37", "name": "Commented-code block (8 lines) in api/admin/players.ts:18", "shortDescription": {"text": "Commented-code block (8 lines) in api/admin/players.ts:18"}, "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-8c74a545f39faf71", "name": "Commented-code block (5 lines) in api/profession/choose.ts:26", "shortDescription": {"text": "Commented-code block (5 lines) in api/profession/choose.ts:26"}, "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-76001986814ed9a4", "name": "Commented-code block (10 lines) in api/battle/lock.ts:140", "shortDescription": {"text": "Commented-code block (10 lines) in api/battle/lock.ts:140"}, "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-ce2ea586d899b06c", "name": "Commented-code block (5 lines) in api/clan/seal-pool/get.ts:11", "shortDescription": {"text": "Commented-code block (5 lines) in api/clan/seal-pool/get.ts: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-e8ec7bdb710b1420", "name": "Commented-code block (5 lines) in api/clan/seal-pool/donate.ts:47", "shortDescription": {"text": "Commented-code block (5 lines) in api/clan/seal-pool/donate.ts:47"}, "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-c4649193578e801b", "name": "Commented-code block (7 lines) in api/clan/seal-pool/distribute.ts:91", "shortDescription": {"text": "Commented-code block (7 lines) in api/clan/seal-pool/distribute.ts:91"}, "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-f6be09568c353023", "name": "Commented-code block (6 lines) in api/clan/war/tilecards.ts:40", "shortDescription": {"text": "Commented-code block (6 lines) in api/clan/war/tilecards.ts:40"}, "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-68a44223f07caf20", "name": "Commented-code block (16 lines) in api/clan/war/report.ts:55", "shortDescription": {"text": "Commented-code block (16 lines) in api/clan/war/report.ts:55"}, "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-06801d001439c277", "name": "Commented-code block (10 lines) in api/clan/war/challenge.ts:20", "shortDescription": {"text": "Commented-code block (10 lines) in api/clan/war/challenge.ts:20"}, "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-df5919bbb71ee75a", "name": "Commented-code block (16 lines) in api/clan/war/declare.ts:22", "shortDescription": {"text": "Commented-code block (16 lines) in api/clan/war/declare.ts:22"}, "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-2b7033b8bb1f4899", "name": "Commented-code block (5 lines) in api/clan/war/_storage.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in api/clan/war/_storage.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9ec2799779b0a815", "name": "Commented-code block (7 lines) in api/clan/territory/collect-supply.ts:124", "shortDescription": {"text": "Commented-code block (7 lines) in api/clan/territory/collect-supply.ts:124"}, "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-54018d6a6ff5835f", "name": "Commented-code block (6 lines) in api/clan/pet-escort/offer.ts:39", "shortDescription": {"text": "Commented-code block (6 lines) in api/clan/pet-escort/offer.ts:39"}, "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-0f9a004f41d0fa2b", "name": "Commented-code block (5 lines) in api/clan/treasury/donate.ts:37", "shortDescription": {"text": "Commented-code block (5 lines) in api/clan/treasury/donate.ts:37"}, "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-41033d1c97596445", "name": "Commented-code block (6 lines) in api/cron/snapshot-saves.ts:120", "shortDescription": {"text": "Commented-code block (6 lines) in api/cron/snapshot-saves.ts:120"}, "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-fcee60f24ccd50b7", "name": "Commented-code block (5 lines) in api/jutsu/train-with-seals.ts:73", "shortDescription": {"text": "Commented-code block (5 lines) in api/jutsu/train-with-seals.ts:73"}, "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-a09618e20ada80b1", "name": "Commented-code block (6 lines) in api/jutsu/speedup.ts:53", "shortDescription": {"text": "Commented-code block (6 lines) in api/jutsu/speedup.ts:53"}, "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-8f327c355d747a0f", "name": "Commented-code block (7 lines) in api/village-guard/challenge.ts:138", "shortDescription": {"text": "Commented-code block (7 lines) in api/village-guard/challenge.ts:138"}, "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-467593de7748a4a7", "name": "Commented-code block (7 lines) in api/pvp/ranked-queue.ts:25", "shortDescription": {"text": "Commented-code block (7 lines) in api/pvp/ranked-queue.ts:25"}, "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-a5e14b18be23940b", "name": "Commented-code block (6 lines) in api/pvp/pet-ranked-queue.ts:154", "shortDescription": {"text": "Commented-code block (6 lines) in api/pvp/pet-ranked-queue.ts:154"}, "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-a005062a5bf7ee1d", "name": "Commented-code block (9 lines) in api/pvp/_aoe.ts:4", "shortDescription": {"text": "Commented-code block (9 lines) in api/pvp/_aoe.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e05537885ff6021e", "name": "Commented-code block (5 lines) in api/pvp/move.ts:20", "shortDescription": {"text": "Commented-code block (5 lines) in api/pvp/move.ts:20"}, "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-66ee82cb793ff2f4", "name": "Commented-code block (6 lines) in api/pvp/_reward-farm.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in api/pvp/_reward-farm.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-74da0a7884b4c1a9", "name": "Commented-code block (6 lines) in api/pvp/stream.ts:9", "shortDescription": {"text": "Commented-code block (6 lines) in api/pvp/stream.ts:9"}, "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-1527b6caca0f1c63", "name": "Commented-code block (5 lines) in api/pvp/session.ts:22", "shortDescription": {"text": "Commented-code block (5 lines) in api/pvp/session.ts:22"}, "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-1815d873b50ff6a9", "name": "Commented-code block (5 lines) in api/pvp/combat-log.ts:11", "shortDescription": {"text": "Commented-code block (5 lines) in api/pvp/combat-log.ts: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-013eb674bbdea895", "name": "Commented-code block (5 lines) in api/pvp/claim-rewards.ts:14", "shortDescription": {"text": "Commented-code block (5 lines) in api/pvp/claim-rewards.ts:14"}, "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-30d4f7eca9198fc2", "name": "Commented-code block (7 lines) in api/pvp/chat.ts:36", "shortDescription": {"text": "Commented-code block (7 lines) in api/pvp/chat.ts: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-28f00982bad215a2", "name": "Commented-code block (5 lines) in api/pvp/_vanguard-rewards.ts:78", "shortDescription": {"text": "Commented-code block (5 lines) in api/pvp/_vanguard-rewards.ts:78"}, "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-e38a9ee2c6a87603", "name": "Commented-code block (5 lines) in api/pvp/_tags.ts:78", "shortDescription": {"text": "Commented-code block (5 lines) in api/pvp/_tags.ts:78"}, "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-27374974bca4a291", "name": "Commented-code block (5 lines) in api/village/claim-daily-agenda.ts:41", "shortDescription": {"text": "Commented-code block (5 lines) in api/village/claim-daily-agenda.ts:41"}, "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-273450939787f137", "name": "Commented-code block (5 lines) in api/village/chat.ts:114", "shortDescription": {"text": "Commented-code block (5 lines) in api/village/chat.ts:114"}, "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-d72cc664043b2b92", "name": "Commented-code block (5 lines) in api/village/claim-map-control.ts:86", "shortDescription": {"text": "Commented-code block (5 lines) in api/village/claim-map-control.ts:86"}, "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-07caab6c62eb1f6a", "name": "Commented-code block (9 lines) in api/village/kage.ts:62", "shortDescription": {"text": "Commented-code block (9 lines) in api/village/kage.ts:62"}, "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-3f9e1eacc0ab2b25", "name": "Commented-code block (5 lines) in api/village/treasury/donate.ts:96", "shortDescription": {"text": "Commented-code block (5 lines) in api/village/treasury/donate.ts:96"}, "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-ee0b6c9ae70300ec", "name": "Commented-code block (8 lines) in api/village/treasury/transfer.ts:183", "shortDescription": {"text": "Commented-code block (8 lines) in api/village/treasury/transfer.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-5146f57fdd387389", "name": "Commented-code block (9 lines) in api/pet/battle-result.ts:12", "shortDescription": {"text": "Commented-code block (9 lines) in api/pet/battle-result.ts:12"}, "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-8f77534366b8c8e9", "name": "Commented-code block (7 lines) in api/pet/evolve.ts:11", "shortDescription": {"text": "Commented-code block (7 lines) in api/pet/evolve.ts: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-8a57df12d7784023", "name": "Commented-code block (5 lines) in api/_realtime/presence-gating.ts:18", "shortDescription": {"text": "Commented-code block (5 lines) in api/_realtime/presence-gating.ts:18"}, "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-c91492ff35d55af5", "name": "Commented-code block (5 lines) in api/_realtime/socket.ts:30", "shortDescription": {"text": "Commented-code block (5 lines) in api/_realtime/socket.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-ccb85b8c041c2cfb", "name": "Commented-code block (9 lines) in api/_realtime/presence-input.ts:33", "shortDescription": {"text": "Commented-code block (9 lines) in api/_realtime/presence-input.ts:33"}, "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-94f83edf5c75ef64", "name": "Commented-code block (8 lines) in scripts/pvp-formula-sim.ts:586", "shortDescription": {"text": "Commented-code block (8 lines) in scripts/pvp-formula-sim.ts:586"}, "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-23243ba8e2944e8f", "name": "Commented-code block (5 lines) in scripts/backfill-asset-meta.mjs:3", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/backfill-asset-meta.mjs:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f2e190065b8670bf", "name": "Commented-code block (5 lines) in scripts/derive-pet-battle-sprites.mjs:134", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/derive-pet-battle-sprites.mjs:134"}, "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-f3f102042c75dc12", "name": "Commented-code block (5 lines) in scripts/slice-battle-vfx.mjs:11", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/slice-battle-vfx.mjs: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-8a2e5e001070876a", "name": "Commented-code block (6 lines) in scripts/jutsu-catalog-gen.mjs:32", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/jutsu-catalog-gen.mjs:32"}, "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-04d3728096f6c81a", "name": "Commented-code block (5 lines) in scripts/slice-badges.mjs:3", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/slice-badges.mjs:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e4aea50f19646895", "name": "Commented-code block (5 lines) in scripts/check-images.mjs:4", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/check-images.mjs:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-64bc033a45ab26f1", "name": "34 env vars used in code but missing from .env.example", "shortDescription": {"text": "34 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `API_PORT`, `DISABLE_ASSET_META`, `DISABLE_COMBAT_RECEIPTS`, `DISABLE_REALTIME`, `DISABLE_SNAPSHOT_CRON`, `DISK_KV_DIR`, `EXTRA_ALLOWED_ORIGINS`, `FAL_KEY` + 26 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-5dd5f1c6598d4007", "name": "Dangling fetch: POST https://fal.run/${model} (shinobij.client/scripts/gen-bg.mjs:60)", "shortDescription": {"text": "Dangling fetch: POST https://fal.run/${model} (shinobij.client/scripts/gen-bg.mjs:60)"}, "fullDescription": {"text": "`shinobij.client/scripts/gen-bg.mjs:60` calls `POST https://fal.run/${model}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/fal.run/<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-5cf81c25c9aab5cc", "name": "Dangling fetch: POST https://api.openai.com/v1/images/generations (shinobij.client/scripts/gen-bg.mjs:76)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/generations (shinobij.client/scripts/gen-bg.mjs:76)"}, "fullDescription": {"text": "`shinobij.client/scripts/gen-bg.mjs:76` 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-c12941afe79c9843", "name": "Dangling fetch: POST https://fal.run/${model} (shinobij.client/scripts/gen-map-flux.mjs:33)", "shortDescription": {"text": "Dangling fetch: POST https://fal.run/${model} (shinobij.client/scripts/gen-map-flux.mjs:33)"}, "fullDescription": {"text": "`shinobij.client/scripts/gen-map-flux.mjs:33` calls `POST https://fal.run/${model}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/fal.run/<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-33e5a0cffef634c3", "name": "Dangling fetch: POST https://api.openai.com/v1/images/generations (shinobij.client/scripts/gen-asset.mjs:189)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/generations (shinobij.client/scripts/gen-asset.mjs:189)"}, "fullDescription": {"text": "`shinobij.client/scripts/gen-asset.mjs:189` 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-21e0e7e5ace0a661", "name": "Dangling fetch: POST https://fal.run/fal-ai/image-preprocessors/depth-anything/v2 (shinobij.client/scripts/gen-sector-de", "shortDescription": {"text": "Dangling fetch: POST https://fal.run/fal-ai/image-preprocessors/depth-anything/v2 (shinobij.client/scripts/gen-sector-depth.mjs:62)"}, "fullDescription": {"text": "`shinobij.client/scripts/gen-sector-depth.mjs:62` calls `POST https://fal.run/fal-ai/image-preprocessors/depth-anything/v2` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/fal.run/fal-ai/image-preprocessors/depth-anything/v2`\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-e447b418ea64af28", "name": "Dangling fetch: POST https://fal.run/fal-ai/nano-banana/edit (shinobij.client/scripts/gen-pet-anim.mjs:64)", "shortDescription": {"text": "Dangling fetch: POST https://fal.run/fal-ai/nano-banana/edit (shinobij.client/scripts/gen-pet-anim.mjs:64)"}, "fullDescription": {"text": "`shinobij.client/scripts/gen-pet-anim.mjs:64` calls `POST https://fal.run/fal-ai/nano-banana/edit` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/fal.run/fal-ai/nano-banana/edit`\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-ffcc11c052fb8578", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (shinobij.client/scripts/normalize-petbody-facing.mjs:60", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (shinobij.client/scripts/normalize-petbody-facing.mjs:60)"}, "fullDescription": {"text": "`shinobij.client/scripts/normalize-petbody-facing.mjs:60` calls `POST https://api.openai.com/v1/chat/completions` 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/chat/completions`\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-bd9e638f5b0e0058", "name": "Dangling fetch: POST https://fal.run/fal-ai/nano-banana/edit (shinobij.client/scripts/gen-pet-run.mjs:47)", "shortDescription": {"text": "Dangling fetch: POST https://fal.run/fal-ai/nano-banana/edit (shinobij.client/scripts/gen-pet-run.mjs:47)"}, "fullDescription": {"text": "`shinobij.client/scripts/gen-pet-run.mjs:47` calls `POST https://fal.run/fal-ai/nano-banana/edit` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/fal.run/fal-ai/nano-banana/edit`\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-5a4857acb248076a", "name": "Dangling fetch: POST https://fal.run/fal-ai/hunyuan3d/v2 (shinobij.client/scripts/gen-pet-3d.mjs:61)", "shortDescription": {"text": "Dangling fetch: POST https://fal.run/fal-ai/hunyuan3d/v2 (shinobij.client/scripts/gen-pet-3d.mjs:61)"}, "fullDescription": {"text": "`shinobij.client/scripts/gen-pet-3d.mjs:61` calls `POST https://fal.run/fal-ai/hunyuan3d/v2` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/fal.run/fal-ai/hunyuan3d/v2`\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-7833be5cfe674199", "name": "Dangling fetch: POST https://api.openai.com/v1/images/generations (shinobij.client/scripts/gen-sector-props.mjs:91)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/generations (shinobij.client/scripts/gen-sector-props.mjs:91)"}, "fullDescription": {"text": "`shinobij.client/scripts/gen-sector-props.mjs:91` 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-88ca4b383cc72ec5", "name": "Dangling fetch: POST https://api.openai.com/v1/images/edits (shinobij.client/scripts/gen-pet-battle-sprites.mjs:121)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/edits (shinobij.client/scripts/gen-pet-battle-sprites.mjs:121)"}, "fullDescription": {"text": "`shinobij.client/scripts/gen-pet-battle-sprites.mjs:121` 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-16ccd2c5374d203f", "name": "Dangling fetch: POST https://api.openai.com/v1/images/generations (shinobij.client/scripts/gen-sector-foreground.mjs:71)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/generations (shinobij.client/scripts/gen-sector-foreground.mjs:71)"}, "fullDescription": {"text": "`shinobij.client/scripts/gen-sector-foreground.mjs:71` 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-e12e7cfe226a224b", "name": "Dangling fetch: POST https://api.openai.com/v1/images/generations (shinobij.client/scripts/gen-ai-opponent-art.mjs:74)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/generations (shinobij.client/scripts/gen-ai-opponent-art.mjs:74)"}, "fullDescription": {"text": "`shinobij.client/scripts/gen-ai-opponent-art.mjs:74` 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-4c33832dff1c1022", "name": "Dangling fetch: POST https://api.openai.com/v1/images/generations (shinobij.client/vite.config.ts:388)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/generations (shinobij.client/vite.config.ts:388)"}, "fullDescription": {"text": "`shinobij.client/vite.config.ts:388` 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-3198a945ca70f3d6", "name": "Dangling fetch: GET /api/save/... (shinobij.client/src/authFetch.ts:30)", "shortDescription": {"text": "Dangling fetch: GET /api/save/... (shinobij.client/src/authFetch.ts:30)"}, "fullDescription": {"text": "`shinobij.client/src/authFetch.ts:30` calls `GET /api/save/...` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-d024539a70ce4275", "name": "Dangling fetch: GET /api/... (shinobij.client/src/App.tsx:98)", "shortDescription": {"text": "Dangling fetch: GET /api/... (shinobij.client/src/App.tsx:98)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:98` calls `GET /api/...` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/...`\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-d1a1af17f2263405", "name": "Dangling fetch: POST /api/missions/raid-start (shinobij.client/src/App.tsx:2412)", "shortDescription": {"text": "Dangling fetch: POST /api/missions/raid-start (shinobij.client/src/App.tsx:2412)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:2412` calls `POST /api/missions/raid-start` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/missions/raid-start`\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-dc9ecd0b40852d87", "name": "Dangling fetch: POST /api/clan/war/report (shinobij.client/src/App.tsx:2561)", "shortDescription": {"text": "Dangling fetch: POST /api/clan/war/report (shinobij.client/src/App.tsx:2561)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:2561` calls `POST /api/clan/war/report` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/clan/war/report`\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-6168a87ad459425a", "name": "Dangling fetch: POST /api/clan/war/tilecards (shinobij.client/src/App.tsx:2654)", "shortDescription": {"text": "Dangling fetch: POST /api/clan/war/tilecards (shinobij.client/src/App.tsx:2654)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:2654` calls `POST /api/clan/war/tilecards` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/clan/war/tilecards`\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-8efe329ea4ab4b20", "name": "Dangling fetch: POST /api/save/${encodeURIComponent(accountName)}?ack=1 (shinobij.client/src/App.tsx:2861)", "shortDescription": {"text": "Dangling fetch: POST /api/save/${encodeURIComponent(accountName)}?ack=1 (shinobij.client/src/App.tsx:2861)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:2861` calls `POST /api/save/${encodeURIComponent(accountName)}?ack=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-8b46bd5a5277d686", "name": "Dangling fetch: GET /api/save/${encodeURIComponent(accountName)} (shinobij.client/src/App.tsx:2864)", "shortDescription": {"text": "Dangling fetch: GET /api/save/${encodeURIComponent(accountName)} (shinobij.client/src/App.tsx:2864)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:2864` calls `GET /api/save/${encodeURIComponent(accountName)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-661d3ee53ee63334", "name": "Dangling fetch: POST /api/save/${encodeURIComponent(accountName)}?ack=1 (shinobij.client/src/App.tsx:2870)", "shortDescription": {"text": "Dangling fetch: POST /api/save/${encodeURIComponent(accountName)}?ack=1 (shinobij.client/src/App.tsx:2870)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:2870` calls `POST /api/save/${encodeURIComponent(accountName)}?ack=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-334a00635ffe7b89", "name": "Dangling fetch: POST /api/save/${encodeURIComponent(accountName)}?ack=1 (shinobij.client/src/App.tsx:2883)", "shortDescription": {"text": "Dangling fetch: POST /api/save/${encodeURIComponent(accountName)}?ack=1 (shinobij.client/src/App.tsx:2883)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:2883` calls `POST /api/save/${encodeURIComponent(accountName)}?ack=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-2b3484c4518aeaf0", "name": "Dangling fetch: DELETE /api/player/challenge (shinobij.client/src/App.tsx:3008)", "shortDescription": {"text": "Dangling fetch: DELETE /api/player/challenge (shinobij.client/src/App.tsx:3008)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:3008` calls `DELETE /api/player/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/challenge`\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-36af2cb4df6cf78a", "name": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/App.tsx:3022)", "shortDescription": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/App.tsx:3022)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:3022` calls `POST /api/player/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/challenge`\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-3437c15db746028c", "name": "Dangling fetch: GET /api/player/roster (shinobij.client/src/App.tsx:3149)", "shortDescription": {"text": "Dangling fetch: GET /api/player/roster (shinobij.client/src/App.tsx:3149)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:3149` calls `GET /api/player/roster` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/roster`\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-a6cbae11a14ca6dc", "name": "Dangling fetch: GET /api/bloodlines/list (shinobij.client/src/App.tsx:3198)", "shortDescription": {"text": "Dangling fetch: GET /api/bloodlines/list (shinobij.client/src/App.tsx:3198)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:3198` calls `GET /api/bloodlines/list` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/bloodlines/list`\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-c21ae7846a147b9b", "name": "Dangling fetch: POST /api/pvp/session (shinobij.client/src/App.tsx:3351)", "shortDescription": {"text": "Dangling fetch: POST /api/pvp/session (shinobij.client/src/App.tsx:3351)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:3351` calls `POST /api/pvp/session` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pvp/session`\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-e689c7a0c8dc4bd4", "name": "Dangling fetch: GET /api/pvp/session?id=${encodeURIComponent(parsed.pvpBattleId)} (shinobij.client/src/App.tsx:3511)", "shortDescription": {"text": "Dangling fetch: GET /api/pvp/session?id=${encodeURIComponent(parsed.pvpBattleId)} (shinobij.client/src/App.tsx:3511)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:3511` calls `GET /api/pvp/session?id=${encodeURIComponent(parsed.pvpBattleId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pvp/session`\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-3147ea4bd5592e1d", "name": "Dangling fetch: POST /api/save/${encodeURIComponent(name.toLowerCase())} (shinobij.client/src/App.tsx:3916)", "shortDescription": {"text": "Dangling fetch: POST /api/save/${encodeURIComponent(name.toLowerCase())} (shinobij.client/src/App.tsx:3916)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:3916` calls `POST /api/save/${encodeURIComponent(name.toLowerCase())}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-eefad1ad16803946", "name": "Dangling fetch: POST /api/player-auth (shinobij.client/src/App.tsx:3951)", "shortDescription": {"text": "Dangling fetch: POST /api/player-auth (shinobij.client/src/App.tsx:3951)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:3951` calls `POST /api/player-auth` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player-auth`\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-139058d4e6eff18c", "name": "Dangling fetch: GET /api/save/${encodeURIComponent(name.toLowerCase())} (shinobij.client/src/App.tsx:4009)", "shortDescription": {"text": "Dangling fetch: GET /api/save/${encodeURIComponent(name.toLowerCase())} (shinobij.client/src/App.tsx:4009)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:4009` calls `GET /api/save/${encodeURIComponent(name.toLowerCase())}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-b32244cb92ed4128", "name": "Dangling fetch: GET /api/images?cat=${encodeURIComponent(cat)}&ids=1&cb=${cb} (shinobij.client/src/App.tsx:4527)", "shortDescription": {"text": "Dangling fetch: GET /api/images?cat=${encodeURIComponent(cat)}&ids=1&cb=${cb} (shinobij.client/src/App.tsx:4527)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:4527` calls `GET /api/images?cat=${encodeURIComponent(cat)}&ids=1&cb=${cb}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/images`\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-d1b74d3437393dbc", "name": "Dangling fetch: GET /api/images?cat=${encodeURIComponent(cat)}&cb=${cb} (shinobij.client/src/App.tsx:4536)", "shortDescription": {"text": "Dangling fetch: GET /api/images?cat=${encodeURIComponent(cat)}&cb=${cb} (shinobij.client/src/App.tsx:4536)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:4536` calls `GET /api/images?cat=${encodeURIComponent(cat)}&cb=${cb}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/images`\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-8e4448b823e0f86d", "name": "Dangling fetch: GET /api/save/${encodeURIComponent(accountName.toLowerCase())} (shinobij.client/src/App.tsx:4777)", "shortDescription": {"text": "Dangling fetch: GET /api/save/${encodeURIComponent(accountName.toLowerCase())} (shinobij.client/src/App.tsx:4777)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:4777` calls `GET /api/save/${encodeURIComponent(accountName.toLowerCase())}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-f3e35ea66f1b8dbe", "name": "Dangling fetch: POST /api/save/${encodeURIComponent(accountName.toLowerCase())} (shinobij.client/src/App.tsx:4802)", "shortDescription": {"text": "Dangling fetch: POST /api/save/${encodeURIComponent(accountName.toLowerCase())} (shinobij.client/src/App.tsx:4802)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:4802` calls `POST /api/save/${encodeURIComponent(accountName.toLowerCase())}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-45c20dbb721539ba", "name": "Dangling fetch: POST /api/save/${encodeURIComponent(snap.name.toLowerCase())} (shinobij.client/src/App.tsx:4954)", "shortDescription": {"text": "Dangling fetch: POST /api/save/${encodeURIComponent(snap.name.toLowerCase())} (shinobij.client/src/App.tsx:4954)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:4954` calls `POST /api/save/${encodeURIComponent(snap.name.toLowerCase())}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-f05854db650a9ece", "name": "Dangling fetch: POST /api/player-auth (shinobij.client/src/App.tsx:4969)", "shortDescription": {"text": "Dangling fetch: POST /api/player-auth (shinobij.client/src/App.tsx:4969)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:4969` calls `POST /api/player-auth` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player-auth`\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-3ccb51b5aba16433", "name": "Dangling fetch: POST /api/player-auth (shinobij.client/src/App.tsx:5182)", "shortDescription": {"text": "Dangling fetch: POST /api/player-auth (shinobij.client/src/App.tsx:5182)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:5182` calls `POST /api/player-auth` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player-auth`\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-b547dff2635782e3", "name": "Dangling fetch: POST /api/player-auth (shinobij.client/src/App.tsx:5247)", "shortDescription": {"text": "Dangling fetch: POST /api/player-auth (shinobij.client/src/App.tsx:5247)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:5247` calls `POST /api/player-auth` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player-auth`\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-f673f825c2292fbc", "name": "Dangling fetch: DELETE /api/save/${encodeURIComponent(accountName.toLowerCase())} (shinobij.client/src/App.tsx:5273)", "shortDescription": {"text": "Dangling fetch: DELETE /api/save/${encodeURIComponent(accountName.toLowerCase())} (shinobij.client/src/App.tsx:5273)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:5273` calls `DELETE /api/save/${encodeURIComponent(accountName.toLowerCase())}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-3b3f2c0bea05f920", "name": "Dangling fetch: POST /api/player-auth (shinobij.client/src/App.tsx:5278)", "shortDescription": {"text": "Dangling fetch: POST /api/player-auth (shinobij.client/src/App.tsx:5278)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:5278` calls `POST /api/player-auth` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player-auth`\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-da137a81b61e135c", "name": "Dangling fetch: POST /api/missions/report-raid (shinobij.client/src/App.tsx:5406)", "shortDescription": {"text": "Dangling fetch: POST /api/missions/report-raid (shinobij.client/src/App.tsx:5406)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:5406` calls `POST /api/missions/report-raid` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/missions/report-raid`\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-1c49d79bded97cb4", "name": "Dangling fetch: POST /api/weekly-boss (shinobij.client/src/App.tsx:5955)", "shortDescription": {"text": "Dangling fetch: POST /api/weekly-boss (shinobij.client/src/App.tsx:5955)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:5955` calls `POST /api/weekly-boss` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/weekly-boss`\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-ba41c2021edfe084", "name": "Dangling fetch: POST /api/pvp/session (shinobij.client/src/App.tsx:8690)", "shortDescription": {"text": "Dangling fetch: POST /api/pvp/session (shinobij.client/src/App.tsx:8690)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:8690` calls `POST /api/pvp/session` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pvp/session`\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-1325d30a0a5ed8ab", "name": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/App.tsx:8758)", "shortDescription": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/App.tsx:8758)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:8758` calls `POST /api/player/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/challenge`\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-6da86a1ed913f086", "name": "Dangling fetch: POST /api/village/kage (shinobij.client/src/App.tsx:9046)", "shortDescription": {"text": "Dangling fetch: POST /api/village/kage (shinobij.client/src/App.tsx:9046)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:9046` calls `POST /api/village/kage` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/village/kage`\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-34784e4c414affa8", "name": "Dangling fetch: GET /api/save/${encodeURIComponent(character.name)} (shinobij.client/src/App.tsx:9112)", "shortDescription": {"text": "Dangling fetch: GET /api/save/${encodeURIComponent(character.name)} (shinobij.client/src/App.tsx:9112)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:9112` calls `GET /api/save/${encodeURIComponent(character.name)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-08ca877bc5efa3d7", "name": "Dangling fetch: POST /api/missions/report-pvp-win (shinobij.client/src/App.tsx:9151)", "shortDescription": {"text": "Dangling fetch: POST /api/missions/report-pvp-win (shinobij.client/src/App.tsx:9151)"}, "fullDescription": {"text": "`shinobij.client/src/App.tsx:9151` calls `POST /api/missions/report-pvp-win` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/missions/report-pvp-win`\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-3edd16c9b6e3722d", "name": "Dangling fetch: GET /api/pvp/session?id=${encodeURIComponent(battleId)} (shinobij.client/src/screens/PvpBattleScreen.tsx", "shortDescription": {"text": "Dangling fetch: GET /api/pvp/session?id=${encodeURIComponent(battleId)} (shinobij.client/src/screens/PvpBattleScreen.tsx:235)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PvpBattleScreen.tsx:235` calls `GET /api/pvp/session?id=${encodeURIComponent(battleId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pvp/session`\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-2fe45e19f2501c7b", "name": "Dangling fetch: GET /api/pvp/session?id=${encodeURIComponent(battleId)} (shinobij.client/src/screens/PvpBattleScreen.tsx", "shortDescription": {"text": "Dangling fetch: GET /api/pvp/session?id=${encodeURIComponent(battleId)} (shinobij.client/src/screens/PvpBattleScreen.tsx:254)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PvpBattleScreen.tsx:254` calls `GET /api/pvp/session?id=${encodeURIComponent(battleId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pvp/session`\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-a4166406098e22ba", "name": "Dangling fetch: POST /api/pvp/claim-rewards (shinobij.client/src/screens/PvpBattleScreen.tsx:497)", "shortDescription": {"text": "Dangling fetch: POST /api/pvp/claim-rewards (shinobij.client/src/screens/PvpBattleScreen.tsx:497)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PvpBattleScreen.tsx:497` calls `POST /api/pvp/claim-rewards` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pvp/claim-rewards`\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-748b66a9090cd9fa", "name": "Dangling fetch: GET /api/pvp/chat?id=${encodeURIComponent(battleId)} (shinobij.client/src/screens/PvpBattleScreen.tsx:62", "shortDescription": {"text": "Dangling fetch: GET /api/pvp/chat?id=${encodeURIComponent(battleId)} (shinobij.client/src/screens/PvpBattleScreen.tsx:627)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PvpBattleScreen.tsx:627` calls `GET /api/pvp/chat?id=${encodeURIComponent(battleId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pvp/chat`\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-dca54bca73e8a4e5", "name": "Dangling fetch: POST /api/pvp/chat?id=${encodeURIComponent(battleId)} (shinobij.client/src/screens/PvpBattleScreen.tsx:6", "shortDescription": {"text": "Dangling fetch: POST /api/pvp/chat?id=${encodeURIComponent(battleId)} (shinobij.client/src/screens/PvpBattleScreen.tsx:650)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PvpBattleScreen.tsx:650` calls `POST /api/pvp/chat?id=${encodeURIComponent(battleId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pvp/chat`\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-a9041f484061f67c", "name": "Dangling fetch: GET /api/pvp/spectate?id=${encodeURIComponent(battleId)} (shinobij.client/src/screens/PvpBattleScreen.ts", "shortDescription": {"text": "Dangling fetch: GET /api/pvp/spectate?id=${encodeURIComponent(battleId)} (shinobij.client/src/screens/PvpBattleScreen.tsx:672)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PvpBattleScreen.tsx:672` calls `GET /api/pvp/spectate?id=${encodeURIComponent(battleId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pvp/spectate`\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-3f5ea79a80ad840b", "name": "Dangling fetch: POST /api/pvp/move (shinobij.client/src/screens/PvpBattleScreen.tsx:921)", "shortDescription": {"text": "Dangling fetch: POST /api/pvp/move (shinobij.client/src/screens/PvpBattleScreen.tsx:921)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PvpBattleScreen.tsx:921` calls `POST /api/pvp/move` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pvp/move`\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-11e77e5455edd6e1", "name": "Dangling fetch: GET /api/clans/list (shinobij.client/src/screens/ClanHall.tsx:77)", "shortDescription": {"text": "Dangling fetch: GET /api/clans/list (shinobij.client/src/screens/ClanHall.tsx:77)"}, "fullDescription": {"text": "`shinobij.client/src/screens/ClanHall.tsx:77` calls `GET /api/clans/list` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/clans/list`\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-865fb14a9b787e34", "name": "Dangling fetch: POST /api/village-guard/list (shinobij.client/src/screens/ClanHall.tsx:139)", "shortDescription": {"text": "Dangling fetch: POST /api/village-guard/list (shinobij.client/src/screens/ClanHall.tsx:139)"}, "fullDescription": {"text": "`shinobij.client/src/screens/ClanHall.tsx:139` calls `POST /api/village-guard/list` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/village-guard/list`\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-0c9dad094eb54ba0", "name": "Dangling fetch: DELETE /api/save/${clanSlug(character.clan)} (shinobij.client/src/screens/ClanHall.tsx:235)", "shortDescription": {"text": "Dangling fetch: DELETE /api/save/${clanSlug(character.clan)} (shinobij.client/src/screens/ClanHall.tsx:235)"}, "fullDescription": {"text": "`shinobij.client/src/screens/ClanHall.tsx:235` calls `DELETE /api/save/${clanSlug(character.clan)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-d6d688bf507bc4e3", "name": "Dangling fetch: POST /api/clan/treasury/transfer (shinobij.client/src/screens/ClanHall.tsx:290)", "shortDescription": {"text": "Dangling fetch: POST /api/clan/treasury/transfer (shinobij.client/src/screens/ClanHall.tsx:290)"}, "fullDescription": {"text": "`shinobij.client/src/screens/ClanHall.tsx:290` calls `POST /api/clan/treasury/transfer` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/clan/treasury/transfer`\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-b4dda806607b8c2a", "name": "Dangling fetch: POST /api/clan/treasury/transfer (shinobij.client/src/screens/ClanHall.tsx:318)", "shortDescription": {"text": "Dangling fetch: POST /api/clan/treasury/transfer (shinobij.client/src/screens/ClanHall.tsx:318)"}, "fullDescription": {"text": "`shinobij.client/src/screens/ClanHall.tsx:318` calls `POST /api/clan/treasury/transfer` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/clan/treasury/transfer`\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-0345f972d41e8519", "name": "Dangling fetch: POST /api/clan/territory/collect-supply (shinobij.client/src/screens/ClanHall.tsx:362)", "shortDescription": {"text": "Dangling fetch: POST /api/clan/territory/collect-supply (shinobij.client/src/screens/ClanHall.tsx:362)"}, "fullDescription": {"text": "`shinobij.client/src/screens/ClanHall.tsx:362` calls `POST /api/clan/territory/collect-supply` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/clan/territory/collect-supply`\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-6e8c5ed7da79cca8", "name": "Dangling fetch: POST /api/profession/choose (shinobij.client/src/screens/ProfessionPicker.tsx:97)", "shortDescription": {"text": "Dangling fetch: POST /api/profession/choose (shinobij.client/src/screens/ProfessionPicker.tsx:97)"}, "fullDescription": {"text": "`shinobij.client/src/screens/ProfessionPicker.tsx:97` calls `POST /api/profession/choose` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/profession/choose`\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-8e95968230272b43", "name": "Dangling fetch: GET /api/admin/battle-receipts?battleId=${encodeURIComponent(id)} (shinobij.client/src/screens/AdminDiag", "shortDescription": {"text": "Dangling fetch: GET /api/admin/battle-receipts?battleId=${encodeURIComponent(id)} (shinobij.client/src/screens/AdminDiagnosticsPanel.tsx:75)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminDiagnosticsPanel.tsx:75` calls `GET /api/admin/battle-receipts?battleId=${encodeURIComponent(id)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/battle-receipts`\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-928542d1a11c1cc3", "name": "Dangling fetch: GET /api/admin/asset-report (shinobij.client/src/screens/AdminDiagnosticsPanel.tsx:95)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/asset-report (shinobij.client/src/screens/AdminDiagnosticsPanel.tsx:95)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminDiagnosticsPanel.tsx:95` calls `GET /api/admin/asset-report` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/asset-report`\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-635794cb08646493", "name": "Dangling fetch: GET /api/images?cat=${s.cat}&ids=1 (shinobij.client/src/screens/AdminDiagnosticsPanel.tsx:104)", "shortDescription": {"text": "Dangling fetch: GET /api/images?cat=${s.cat}&ids=1 (shinobij.client/src/screens/AdminDiagnosticsPanel.tsx:104)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminDiagnosticsPanel.tsx:104` calls `GET /api/images?cat=${s.cat}&ids=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/images`\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-d9850c315e21692e", "name": "Dangling fetch: GET /api/admin/audit-log?domain=${domain}&limit=200 (shinobij.client/src/screens/AdminDiagnosticsPanel.t", "shortDescription": {"text": "Dangling fetch: GET /api/admin/audit-log?domain=${domain}&limit=200 (shinobij.client/src/screens/AdminDiagnosticsPanel.tsx:135)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminDiagnosticsPanel.tsx:135` calls `GET /api/admin/audit-log?domain=${domain}&limit=200` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/audit-log`\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-1ead5d0fed0682fa", "name": "Dangling fetch: POST /api/missions/expedition-start (shinobij.client/src/screens/PetYard.tsx:117)", "shortDescription": {"text": "Dangling fetch: POST /api/missions/expedition-start (shinobij.client/src/screens/PetYard.tsx:117)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PetYard.tsx:117` calls `POST /api/missions/expedition-start` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/missions/expedition-start`\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-4f962ba0ad617a9d", "name": "Dangling fetch: POST /api/missions/report-pet-event (shinobij.client/src/screens/PetYard.tsx:206)", "shortDescription": {"text": "Dangling fetch: POST /api/missions/report-pet-event (shinobij.client/src/screens/PetYard.tsx:206)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PetYard.tsx:206` calls `POST /api/missions/report-pet-event` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/missions/report-pet-event`\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-964287dc87b20685", "name": "Dangling fetch: POST /api/missions/report-pet-event (shinobij.client/src/screens/PetYard.tsx:270)", "shortDescription": {"text": "Dangling fetch: POST /api/missions/report-pet-event (shinobij.client/src/screens/PetYard.tsx:270)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PetYard.tsx:270` calls `POST /api/missions/report-pet-event` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/missions/report-pet-event`\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-5861ec4494440998", "name": "Dangling fetch: POST /api/pet/evolve (shinobij.client/src/screens/PetYard.tsx:421)", "shortDescription": {"text": "Dangling fetch: POST /api/pet/evolve (shinobij.client/src/screens/PetYard.tsx:421)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PetYard.tsx:421` calls `POST /api/pet/evolve` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pet/evolve`\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-0dfc289f435618e1", "name": "Dangling fetch: POST /api/admin-auth (shinobij.client/src/screens/AdminLogin.tsx:29)", "shortDescription": {"text": "Dangling fetch: POST /api/admin-auth (shinobij.client/src/screens/AdminLogin.tsx:29)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminLogin.tsx:29` calls `POST /api/admin-auth` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin-auth`\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-9e54e8f9ca3e76af", "name": "Dangling fetch: POST /api/player-auth (shinobij.client/src/screens/AdminLogin.tsx:110)", "shortDescription": {"text": "Dangling fetch: POST /api/player-auth (shinobij.client/src/screens/AdminLogin.tsx:110)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminLogin.tsx:110` calls `POST /api/player-auth` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player-auth`\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-685d815a58868740", "name": "Dangling fetch: POST /api/player-auth (shinobij.client/src/screens/AdminLogin.tsx:148)", "shortDescription": {"text": "Dangling fetch: POST /api/player-auth (shinobij.client/src/screens/AdminLogin.tsx:148)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminLogin.tsx:148` calls `POST /api/player-auth` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player-auth`\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-9629237a68a04514", "name": "Dangling fetch: POST /api/pvp/ranked-queue (shinobij.client/src/screens/Arena.tsx:352)", "shortDescription": {"text": "Dangling fetch: POST /api/pvp/ranked-queue (shinobij.client/src/screens/Arena.tsx:352)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Arena.tsx:352` calls `POST /api/pvp/ranked-queue` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pvp/ranked-queue`\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-54ca0b83f350568d", "name": "Dangling fetch: POST /api/pvp/ranked-queue (shinobij.client/src/screens/Arena.tsx:388)", "shortDescription": {"text": "Dangling fetch: POST /api/pvp/ranked-queue (shinobij.client/src/screens/Arena.tsx:388)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Arena.tsx:388` calls `POST /api/pvp/ranked-queue` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pvp/ranked-queue`\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-89b5e3d69996e306", "name": "Dangling fetch: POST /api/pvp/ranked-queue (shinobij.client/src/screens/Arena.tsx:409)", "shortDescription": {"text": "Dangling fetch: POST /api/pvp/ranked-queue (shinobij.client/src/screens/Arena.tsx:409)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Arena.tsx:409` calls `POST /api/pvp/ranked-queue` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pvp/ranked-queue`\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-3e1d6eb84beac0a7", "name": "Dangling fetch: POST /api/pvp/pet-ranked-queue (shinobij.client/src/screens/Arena.tsx:428)", "shortDescription": {"text": "Dangling fetch: POST /api/pvp/pet-ranked-queue (shinobij.client/src/screens/Arena.tsx:428)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Arena.tsx:428` calls `POST /api/pvp/pet-ranked-queue` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pvp/pet-ranked-queue`\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-b3a5893962b0c649", "name": "Dangling fetch: POST /api/pvp/pet-ranked-queue (shinobij.client/src/screens/Arena.tsx:466)", "shortDescription": {"text": "Dangling fetch: POST /api/pvp/pet-ranked-queue (shinobij.client/src/screens/Arena.tsx:466)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Arena.tsx:466` calls `POST /api/pvp/pet-ranked-queue` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pvp/pet-ranked-queue`\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-ed42424128956237", "name": "Dangling fetch: POST /api/pvp/pet-ranked-queue (shinobij.client/src/screens/Arena.tsx:478)", "shortDescription": {"text": "Dangling fetch: POST /api/pvp/pet-ranked-queue (shinobij.client/src/screens/Arena.tsx:478)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Arena.tsx:478` calls `POST /api/pvp/pet-ranked-queue` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pvp/pet-ranked-queue`\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-a47d40de10a5422e", "name": "Dangling fetch: POST /api/pet/ranked-start (shinobij.client/src/screens/Arena.tsx:871)", "shortDescription": {"text": "Dangling fetch: POST /api/pet/ranked-start (shinobij.client/src/screens/Arena.tsx:871)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Arena.tsx:871` calls `POST /api/pet/ranked-start` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pet/ranked-start`\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-ce4b8bf279559e66", "name": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/Arena.tsx:897)", "shortDescription": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/Arena.tsx:897)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Arena.tsx:897` calls `POST /api/player/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/challenge`\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-50e9fdd95573e84f", "name": "Dangling fetch: DELETE /api/player/challenge (shinobij.client/src/screens/Arena.tsx:928)", "shortDescription": {"text": "Dangling fetch: DELETE /api/player/challenge (shinobij.client/src/screens/Arena.tsx:928)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Arena.tsx:928` calls `DELETE /api/player/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/challenge`\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-ce85c80b056e78d1", "name": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/Arena.tsx:933)", "shortDescription": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/Arena.tsx:933)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Arena.tsx:933` calls `POST /api/player/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/challenge`\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-6896742635d94144", "name": "Dangling fetch: POST /api/pvp/session (shinobij.client/src/screens/Arena.tsx:966)", "shortDescription": {"text": "Dangling fetch: POST /api/pvp/session (shinobij.client/src/screens/Arena.tsx:966)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Arena.tsx:966` calls `POST /api/pvp/session` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pvp/session`\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-6c133308542c40c9", "name": "Dangling fetch: DELETE /api/player/challenge (shinobij.client/src/screens/Arena.tsx:3862)", "shortDescription": {"text": "Dangling fetch: DELETE /api/player/challenge (shinobij.client/src/screens/Arena.tsx:3862)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Arena.tsx:3862` calls `DELETE /api/player/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/challenge`\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-f1b05129d8bf4c44", "name": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/Arena.tsx:3867)", "shortDescription": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/Arena.tsx:3867)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Arena.tsx:3867` calls `POST /api/player/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/challenge`\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-1fcb31f9a5bdbad2", "name": "Dangling fetch: POST /api/pvp/spectate?id=${encodeURIComponent(fight.battleId)} (shinobij.client/src/screens/Arena.tsx:3", "shortDescription": {"text": "Dangling fetch: POST /api/pvp/spectate?id=${encodeURIComponent(fight.battleId)} (shinobij.client/src/screens/Arena.tsx:3948)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Arena.tsx:3948` calls `POST /api/pvp/spectate?id=${encodeURIComponent(fight.battleId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pvp/spectate`\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-0f0d29c626069511", "name": "Dangling fetch: GET /api/game-state (shinobij.client/src/screens/VillageWarScreen.tsx:35)", "shortDescription": {"text": "Dangling fetch: GET /api/game-state (shinobij.client/src/screens/VillageWarScreen.tsx:35)"}, "fullDescription": {"text": "`shinobij.client/src/screens/VillageWarScreen.tsx:35` calls `GET /api/game-state` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/game-state`\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-37caa671b8fc80eb", "name": "Dangling fetch: GET /api/world-state (shinobij.client/src/screens/VillageWarScreen.tsx:46)", "shortDescription": {"text": "Dangling fetch: GET /api/world-state (shinobij.client/src/screens/VillageWarScreen.tsx:46)"}, "fullDescription": {"text": "`shinobij.client/src/screens/VillageWarScreen.tsx:46` calls `GET /api/world-state` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/world-state`\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-550edec6d8204d82", "name": "Dangling fetch: POST /api/world-state (shinobij.client/src/screens/VillageWarScreen.tsx:69)", "shortDescription": {"text": "Dangling fetch: POST /api/world-state (shinobij.client/src/screens/VillageWarScreen.tsx:69)"}, "fullDescription": {"text": "`shinobij.client/src/screens/VillageWarScreen.tsx:69` calls `POST /api/world-state` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/world-state`\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-ebf65527803258eb", "name": "Dangling fetch: POST /api/world-state (shinobij.client/src/screens/VillageWarScreen.tsx:94)", "shortDescription": {"text": "Dangling fetch: POST /api/world-state (shinobij.client/src/screens/VillageWarScreen.tsx:94)"}, "fullDescription": {"text": "`shinobij.client/src/screens/VillageWarScreen.tsx:94` calls `POST /api/world-state` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/world-state`\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-e371e6ce4fd116fc", "name": "Dangling fetch: POST /api/world-state (shinobij.client/src/screens/VillageWarScreen.tsx:141)", "shortDescription": {"text": "Dangling fetch: POST /api/world-state (shinobij.client/src/screens/VillageWarScreen.tsx:141)"}, "fullDescription": {"text": "`shinobij.client/src/screens/VillageWarScreen.tsx:141` calls `POST /api/world-state` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/world-state`\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-4babda8bdd21c61e", "name": "Dangling fetch: POST /api/world-state (shinobij.client/src/screens/VillageWarScreen.tsx:154)", "shortDescription": {"text": "Dangling fetch: POST /api/world-state (shinobij.client/src/screens/VillageWarScreen.tsx:154)"}, "fullDescription": {"text": "`shinobij.client/src/screens/VillageWarScreen.tsx:154` calls `POST /api/world-state` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/world-state`\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-fac670368cfc5557", "name": "Dangling fetch: POST /api/bank/claim-interest (shinobij.client/src/screens/Bank.tsx:46)", "shortDescription": {"text": "Dangling fetch: POST /api/bank/claim-interest (shinobij.client/src/screens/Bank.tsx:46)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Bank.tsx:46` calls `POST /api/bank/claim-interest` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/bank/claim-interest`\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-e0b75a60a8d2b6a1", "name": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:238)", "shortDescription": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:238)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PetArena.tsx:238` calls `POST /api/player/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/challenge`\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-6a5dbc7f5ead2815", "name": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:303)", "shortDescription": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:303)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PetArena.tsx:303` calls `POST /api/player/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/challenge`\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-cc4b44cb94db4c19", "name": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:331)", "shortDescription": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:331)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PetArena.tsx:331` calls `POST /api/player/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/challenge`\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-0cc5b52fa34b3358", "name": "Dangling fetch: POST /api/pet/battle-result (shinobij.client/src/screens/PetArena.tsx:555)", "shortDescription": {"text": "Dangling fetch: POST /api/pet/battle-result (shinobij.client/src/screens/PetArena.tsx:555)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PetArena.tsx:555` calls `POST /api/pet/battle-result` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pet/battle-result`\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-e48b2f904f2c8588", "name": "Dangling fetch: POST /api/pet/battle-result (shinobij.client/src/screens/PetArena.tsx:629)", "shortDescription": {"text": "Dangling fetch: POST /api/pet/battle-result (shinobij.client/src/screens/PetArena.tsx:629)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PetArena.tsx:629` calls `POST /api/pet/battle-result` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pet/battle-result`\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-dc79041c8aa9f1f8", "name": "Dangling fetch: POST /api/pet/battle-result (shinobij.client/src/screens/PetArena.tsx:719)", "shortDescription": {"text": "Dangling fetch: POST /api/pet/battle-result (shinobij.client/src/screens/PetArena.tsx:719)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PetArena.tsx:719` calls `POST /api/pet/battle-result` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pet/battle-result`\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-72bf4695aacf4895", "name": "Dangling fetch: DELETE /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:942)", "shortDescription": {"text": "Dangling fetch: DELETE /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:942)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PetArena.tsx:942` calls `DELETE /api/player/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/challenge`\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-874c5400a559e737", "name": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:947)", "shortDescription": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:947)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PetArena.tsx:947` calls `POST /api/player/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/challenge`\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-b1f3b3dc8e3fdbd8", "name": "Dangling fetch: DELETE /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:975)", "shortDescription": {"text": "Dangling fetch: DELETE /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:975)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PetArena.tsx:975` calls `DELETE /api/player/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/challenge`\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-6f11fd04ac21c69f", "name": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:980)", "shortDescription": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:980)"}, "fullDescription": {"text": "`shinobij.client/src/screens/PetArena.tsx:980` calls `POST /api/player/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/challenge`\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-4f727549a09d7398", "name": "Dangling fetch: GET /api/clan/seal-pool/get?clanName=${encodeURIComponent(character.clan)} (shinobij.client/src/screens/", "shortDescription": {"text": "Dangling fetch: GET /api/clan/seal-pool/get?clanName=${encodeURIComponent(character.clan)} (shinobij.client/src/screens/ClanSealPool.tsx:50)"}, "fullDescription": {"text": "`shinobij.client/src/screens/ClanSealPool.tsx:50` calls `GET /api/clan/seal-pool/get?clanName=${encodeURIComponent(character.clan)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/clan/seal-pool/get`\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-be3375fa845db26f", "name": "Dangling fetch: GET /api/clan/pet-escort/list?clanName=${encodeURIComponent(character.clan)} (shinobij.client/src/screen", "shortDescription": {"text": "Dangling fetch: GET /api/clan/pet-escort/list?clanName=${encodeURIComponent(character.clan)} (shinobij.client/src/screens/ClanSealPool.tsx:58)"}, "fullDescription": {"text": "`shinobij.client/src/screens/ClanSealPool.tsx:58` calls `GET /api/clan/pet-escort/list?clanName=${encodeURIComponent(character.clan)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/clan/pet-escort/list`\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-97f003e9bc55e15c", "name": "Dangling fetch: POST /api/clan/seal-pool/donate (shinobij.client/src/screens/ClanSealPool.tsx:96)", "shortDescription": {"text": "Dangling fetch: POST /api/clan/seal-pool/donate (shinobij.client/src/screens/ClanSealPool.tsx:96)"}, "fullDescription": {"text": "`shinobij.client/src/screens/ClanSealPool.tsx:96` calls `POST /api/clan/seal-pool/donate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/clan/seal-pool/donate`\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-1acc07063887dde5", "name": "Dangling fetch: POST /api/clan/seal-pool/distribute (shinobij.client/src/screens/ClanSealPool.tsx:117)", "shortDescription": {"text": "Dangling fetch: POST /api/clan/seal-pool/distribute (shinobij.client/src/screens/ClanSealPool.tsx:117)"}, "fullDescription": {"text": "`shinobij.client/src/screens/ClanSealPool.tsx:117` calls `POST /api/clan/seal-pool/distribute` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/clan/seal-pool/distribute`\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-3c2b48bc4090fcb9", "name": "Dangling fetch: GET /api/missions/daily?playerName=${encodeURIComponent(character.name)} (shinobij.client/src/screens/Da", "shortDescription": {"text": "Dangling fetch: GET /api/missions/daily?playerName=${encodeURIComponent(character.name)} (shinobij.client/src/screens/DailyProfessionMissions.tsx:58)"}, "fullDescription": {"text": "`shinobij.client/src/screens/DailyProfessionMissions.tsx:58` calls `GET /api/missions/daily?playerName=${encodeURIComponent(character.name)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/missions/daily`\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-bc42b37970268371", "name": "Dangling fetch: GET /api/messages (shinobij.client/src/screens/Messages.tsx:39)", "shortDescription": {"text": "Dangling fetch: GET /api/messages (shinobij.client/src/screens/Messages.tsx:39)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Messages.tsx:39` calls `GET /api/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/messages`\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-79db0a0e847d4886", "name": "Dangling fetch: GET /api/messages?with=${encodeURIComponent(withName)} (shinobij.client/src/screens/Messages.tsx:43)", "shortDescription": {"text": "Dangling fetch: GET /api/messages?with=${encodeURIComponent(withName)} (shinobij.client/src/screens/Messages.tsx:43)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Messages.tsx:43` calls `GET /api/messages?with=${encodeURIComponent(withName)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/messages`\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-695854b130512a07", "name": "Dangling fetch: POST /api/messages (shinobij.client/src/screens/Messages.tsx:70)", "shortDescription": {"text": "Dangling fetch: POST /api/messages (shinobij.client/src/screens/Messages.tsx:70)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Messages.tsx:70` calls `POST /api/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/messages`\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-6a2c11fc8c2e211a", "name": "Dangling fetch: GET /api/player/injured-villagers?healerName=${encodeURIComponent(character.name)} (shinobij.client/src/", "shortDescription": {"text": "Dangling fetch: GET /api/player/injured-villagers?healerName=${encodeURIComponent(character.name)} (shinobij.client/src/screens/Hospital.tsx:36)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Hospital.tsx:36` calls `GET /api/player/injured-villagers?healerName=${encodeURIComponent(character.name)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/injured-villagers`\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-ce948e44f5c8bf1d", "name": "Dangling fetch: POST /api/player/heal (shinobij.client/src/screens/Hospital.tsx:65)", "shortDescription": {"text": "Dangling fetch: POST /api/player/heal (shinobij.client/src/screens/Hospital.tsx:65)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Hospital.tsx:65` calls `POST /api/player/heal` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/heal`\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-88eb636bdd88b3e3", "name": "Dangling fetch: POST /api/player/heal (shinobij.client/src/screens/Hospital.tsx:95)", "shortDescription": {"text": "Dangling fetch: POST /api/player/heal (shinobij.client/src/screens/Hospital.tsx:95)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Hospital.tsx:95` calls `POST /api/player/heal` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/heal`\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-ea3612ee65fe0912", "name": "Dangling fetch: POST /api/player/heal (shinobij.client/src/screens/Hospital.tsx:127)", "shortDescription": {"text": "Dangling fetch: POST /api/player/heal (shinobij.client/src/screens/Hospital.tsx:127)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Hospital.tsx:127` calls `POST /api/player/heal` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/heal`\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-90d3d3a2816e0772", "name": "Dangling fetch: POST /api/jutsu/train-with-seals (shinobij.client/src/screens/Training.tsx:184)", "shortDescription": {"text": "Dangling fetch: POST /api/jutsu/train-with-seals (shinobij.client/src/screens/Training.tsx:184)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Training.tsx:184` calls `POST /api/jutsu/train-with-seals` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/jutsu/train-with-seals`\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-88468baf85702190", "name": "Dangling fetch: POST /api/jutsu/speedup (shinobij.client/src/screens/Training.tsx:218)", "shortDescription": {"text": "Dangling fetch: POST /api/jutsu/speedup (shinobij.client/src/screens/Training.tsx:218)"}, "fullDescription": {"text": "`shinobij.client/src/screens/Training.tsx:218` calls `POST /api/jutsu/speedup` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/jutsu/speedup`\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-ea64ecf2e76bc119", "name": "Dangling fetch: GET /api/village/kage?village=${encodeURIComponent(character.village)} (shinobij.client/src/screens/Town", "shortDescription": {"text": "Dangling fetch: GET /api/village/kage?village=${encodeURIComponent(character.village)} (shinobij.client/src/screens/TownHall.tsx:115)"}, "fullDescription": {"text": "`shinobij.client/src/screens/TownHall.tsx:115` calls `GET /api/village/kage?village=${encodeURIComponent(character.village)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/village/kage`\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-12d703d7a9c13e4b", "name": "Dangling fetch: POST /api/village-guard/list (shinobij.client/src/screens/TownHall.tsx:128)", "shortDescription": {"text": "Dangling fetch: POST /api/village-guard/list (shinobij.client/src/screens/TownHall.tsx:128)"}, "fullDescription": {"text": "`shinobij.client/src/screens/TownHall.tsx:128` calls `POST /api/village-guard/list` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/village-guard/list`\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-6817c8f1f4429faf", "name": "Dangling fetch: POST /api/village/treasury/transfer (shinobij.client/src/screens/TownHall.tsx:181)", "shortDescription": {"text": "Dangling fetch: POST /api/village/treasury/transfer (shinobij.client/src/screens/TownHall.tsx:181)"}, "fullDescription": {"text": "`shinobij.client/src/screens/TownHall.tsx:181` calls `POST /api/village/treasury/transfer` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/village/treasury/transfer`\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-91e6be2c2858fb9e", "name": "Dangling fetch: POST /api/village/treasury/transfer (shinobij.client/src/screens/TownHall.tsx:213)", "shortDescription": {"text": "Dangling fetch: POST /api/village/treasury/transfer (shinobij.client/src/screens/TownHall.tsx:213)"}, "fullDescription": {"text": "`shinobij.client/src/screens/TownHall.tsx:213` calls `POST /api/village/treasury/transfer` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/village/treasury/transfer`\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-b97f01495f740caa", "name": "Dangling fetch: POST /api/village/claim-daily-agenda (shinobij.client/src/screens/TownHall.tsx:422)", "shortDescription": {"text": "Dangling fetch: POST /api/village/claim-daily-agenda (shinobij.client/src/screens/TownHall.tsx:422)"}, "fullDescription": {"text": "`shinobij.client/src/screens/TownHall.tsx:422` calls `POST /api/village/claim-daily-agenda` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/village/claim-daily-agenda`\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-f7c0c96584d4c96a", "name": "Dangling fetch: POST /api/village/claim-map-control (shinobij.client/src/screens/TownHall.tsx:476)", "shortDescription": {"text": "Dangling fetch: POST /api/village/claim-map-control (shinobij.client/src/screens/TownHall.tsx:476)"}, "fullDescription": {"text": "`shinobij.client/src/screens/TownHall.tsx:476` calls `POST /api/village/claim-map-control` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/village/claim-map-control`\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-299ea9dcb0d25b89", "name": "Dangling fetch: GET /api/weekly-boss (shinobij.client/src/screens/WeeklyBossArena.tsx:38)", "shortDescription": {"text": "Dangling fetch: GET /api/weekly-boss (shinobij.client/src/screens/WeeklyBossArena.tsx:38)"}, "fullDescription": {"text": "`shinobij.client/src/screens/WeeklyBossArena.tsx:38` calls `GET /api/weekly-boss` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/weekly-boss`\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-d19e3e0f3a2b0884", "name": "Dangling fetch: POST /api/clan/war/tilecards (shinobij.client/src/screens/ClanWarTileCardDuel.tsx:107)", "shortDescription": {"text": "Dangling fetch: POST /api/clan/war/tilecards (shinobij.client/src/screens/ClanWarTileCardDuel.tsx:107)"}, "fullDescription": {"text": "`shinobij.client/src/screens/ClanWarTileCardDuel.tsx:107` calls `POST /api/clan/war/tilecards` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/clan/war/tilecards`\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-f00550922b5d5f4e", "name": "Dangling fetch: POST /api/clan/war/tilecards (shinobij.client/src/screens/ClanWarTileCardDuel.tsx:160)", "shortDescription": {"text": "Dangling fetch: POST /api/clan/war/tilecards (shinobij.client/src/screens/ClanWarTileCardDuel.tsx:160)"}, "fullDescription": {"text": "`shinobij.client/src/screens/ClanWarTileCardDuel.tsx:160` calls `POST /api/clan/war/tilecards` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/clan/war/tilecards`\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-193a0e77d6811269", "name": "Dangling fetch: GET /api/admin/moderation (shinobij.client/src/screens/ModerationPanel.tsx:57)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/moderation (shinobij.client/src/screens/ModerationPanel.tsx:57)"}, "fullDescription": {"text": "`shinobij.client/src/screens/ModerationPanel.tsx:57` calls `GET /api/admin/moderation` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/moderation`\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-61f2fae025cdbd04", "name": "Dangling fetch: POST /api/admin/moderation (shinobij.client/src/screens/ModerationPanel.tsx:78)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/moderation (shinobij.client/src/screens/ModerationPanel.tsx:78)"}, "fullDescription": {"text": "`shinobij.client/src/screens/ModerationPanel.tsx:78` calls `POST /api/admin/moderation` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/moderation`\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-ca2fe8b26ff1c899", "name": "Dangling fetch: GET /api/player/roster (shinobij.client/src/screens/StartScreen.tsx:215)", "shortDescription": {"text": "Dangling fetch: GET /api/player/roster (shinobij.client/src/screens/StartScreen.tsx:215)"}, "fullDescription": {"text": "`shinobij.client/src/screens/StartScreen.tsx:215` calls `GET /api/player/roster` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/roster`\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-5c39acac32d8bd5e", "name": "Dangling fetch: GET /api/game-state (shinobij.client/src/screens/StartScreen.tsx:216)", "shortDescription": {"text": "Dangling fetch: GET /api/game-state (shinobij.client/src/screens/StartScreen.tsx:216)"}, "fullDescription": {"text": "`shinobij.client/src/screens/StartScreen.tsx:216` calls `GET /api/game-state` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/game-state`\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-925f96c9d744b0b3", "name": "Dangling fetch: GET /api/world-state (shinobij.client/src/screens/CentralHub.tsx:98)", "shortDescription": {"text": "Dangling fetch: GET /api/world-state (shinobij.client/src/screens/CentralHub.tsx:98)"}, "fullDescription": {"text": "`shinobij.client/src/screens/CentralHub.tsx:98` calls `GET /api/world-state` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/world-state`\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-89822d2acce4ef59", "name": "Dangling fetch: GET /api/village/chat?village=${encodeURIComponent(character.village)} (shinobij.client/src/screens/Vill", "shortDescription": {"text": "Dangling fetch: GET /api/village/chat?village=${encodeURIComponent(character.village)} (shinobij.client/src/screens/VillageTavern.tsx:20)"}, "fullDescription": {"text": "`shinobij.client/src/screens/VillageTavern.tsx:20` calls `GET /api/village/chat?village=${encodeURIComponent(character.village)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/village/chat`\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-914becaec704fd9d", "name": "Dangling fetch: POST /api/village/chat?village=${encodeURIComponent(character.village)} (shinobij.client/src/screens/Vil", "shortDescription": {"text": "Dangling fetch: POST /api/village/chat?village=${encodeURIComponent(character.village)} (shinobij.client/src/screens/VillageTavern.tsx:69)"}, "fullDescription": {"text": "`shinobij.client/src/screens/VillageTavern.tsx:69` calls `POST /api/village/chat?village=${encodeURIComponent(character.village)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/village/chat`\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-54111f8f64fa469c", "name": "Dangling fetch: GET /api/images?cat=${encodeURIComponent(cat)} (shinobij.client/src/screens/AdminPanel.tsx:755)", "shortDescription": {"text": "Dangling fetch: GET /api/images?cat=${encodeURIComponent(cat)} (shinobij.client/src/screens/AdminPanel.tsx:755)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:755` calls `GET /api/images?cat=${encodeURIComponent(cat)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/images`\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-0fa1a44a26914040", "name": "Dangling fetch: POST /api/admin/players (shinobij.client/src/screens/AdminPanel.tsx:787)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/players (shinobij.client/src/screens/AdminPanel.tsx:787)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:787` calls `POST /api/admin/players` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/players`\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-3b1291800177b3a6", "name": "Dangling fetch: GET /api/admin/item-review (shinobij.client/src/screens/AdminPanel.tsx:817)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/item-review (shinobij.client/src/screens/AdminPanel.tsx:817)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:817` calls `GET /api/admin/item-review` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/item-review`\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-84b33ddabb1206ca", "name": "Dangling fetch: GET /api/bloodlines/list (shinobij.client/src/screens/AdminPanel.tsx:832)", "shortDescription": {"text": "Dangling fetch: GET /api/bloodlines/list (shinobij.client/src/screens/AdminPanel.tsx:832)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:832` calls `GET /api/bloodlines/list` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/bloodlines/list`\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-93ac971482dece94", "name": "Dangling fetch: GET /api/save/${encodeURIComponent(pmTargetName.trim().toLowerCase())} (shinobij.client/src/screens/Admi", "shortDescription": {"text": "Dangling fetch: GET /api/save/${encodeURIComponent(pmTargetName.trim().toLowerCase())} (shinobij.client/src/screens/AdminPanel.tsx:856)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:856` calls `GET /api/save/${encodeURIComponent(pmTargetName.trim().toLowerCase())}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-81cd5683b3590fca", "name": "Dangling fetch: POST /api/save/${encodeURIComponent(pmTargetName.trim().toLowerCase())}?signal=1 (shinobij.client/src/sc", "shortDescription": {"text": "Dangling fetch: POST /api/save/${encodeURIComponent(pmTargetName.trim().toLowerCase())}?signal=1 (shinobij.client/src/screens/AdminPanel.tsx:889)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:889` calls `POST /api/save/${encodeURIComponent(pmTargetName.trim().toLowerCase())}?signal=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-746df8e51f679ebe", "name": "Dangling fetch: GET /api/save/${encodeURIComponent(pmEditName.trim().toLowerCase())} (shinobij.client/src/screens/AdminP", "shortDescription": {"text": "Dangling fetch: GET /api/save/${encodeURIComponent(pmEditName.trim().toLowerCase())} (shinobij.client/src/screens/AdminPanel.tsx:916)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:916` calls `GET /api/save/${encodeURIComponent(pmEditName.trim().toLowerCase())}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-1253067ed218b629", "name": "Dangling fetch: POST /api/save/${encodeURIComponent(pmEditName.trim().toLowerCase())}?signal=1 (shinobij.client/src/scre", "shortDescription": {"text": "Dangling fetch: POST /api/save/${encodeURIComponent(pmEditName.trim().toLowerCase())}?signal=1 (shinobij.client/src/screens/AdminPanel.tsx:951)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:951` calls `POST /api/save/${encodeURIComponent(pmEditName.trim().toLowerCase())}?signal=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-c82fec85f795a8d9", "name": "Dangling fetch: GET /api/save/${encodeURIComponent(name.toLowerCase())} (shinobij.client/src/screens/AdminPanel.tsx:989)", "shortDescription": {"text": "Dangling fetch: GET /api/save/${encodeURIComponent(name.toLowerCase())} (shinobij.client/src/screens/AdminPanel.tsx:989)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:989` calls `GET /api/save/${encodeURIComponent(name.toLowerCase())}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-8d59cd5862e7778b", "name": "Dangling fetch: POST /api/save/${encodeURIComponent(name.toLowerCase())}?signal=1 (shinobij.client/src/screens/AdminPane", "shortDescription": {"text": "Dangling fetch: POST /api/save/${encodeURIComponent(name.toLowerCase())}?signal=1 (shinobij.client/src/screens/AdminPanel.tsx:1000)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:1000` calls `POST /api/save/${encodeURIComponent(name.toLowerCase())}?signal=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-57f491fc11317530", "name": "Dangling fetch: DELETE /api/save/${encodeURIComponent(pmTargetName.trim().toLowerCase())} (shinobij.client/src/screens/A", "shortDescription": {"text": "Dangling fetch: DELETE /api/save/${encodeURIComponent(pmTargetName.trim().toLowerCase())} (shinobij.client/src/screens/AdminPanel.tsx:1021)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:1021` calls `DELETE /api/save/${encodeURIComponent(pmTargetName.trim().toLowerCase())}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-3d653f61b1cbec51", "name": "Dangling fetch: POST /api/admin/server-reset (shinobij.client/src/screens/AdminPanel.tsx:1044)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/server-reset (shinobij.client/src/screens/AdminPanel.tsx:1044)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:1044` calls `POST /api/admin/server-reset` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/server-reset`\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-aec753a2243c9d60", "name": "Dangling fetch: POST /api/admin/item-review (shinobij.client/src/screens/AdminPanel.tsx:1093)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/item-review (shinobij.client/src/screens/AdminPanel.tsx:1093)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:1093` calls `POST /api/admin/item-review` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/item-review`\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-d1fc7c6672b56621", "name": "Dangling fetch: POST /api/admin/bloodline-review (shinobij.client/src/screens/AdminPanel.tsx:1115)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/bloodline-review (shinobij.client/src/screens/AdminPanel.tsx:1115)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:1115` calls `POST /api/admin/bloodline-review` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/bloodline-review`\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-349fc3a550929f07", "name": "Dangling fetch: POST /api/admin/bloodline-review (shinobij.client/src/screens/AdminPanel.tsx:1859)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/bloodline-review (shinobij.client/src/screens/AdminPanel.tsx:1859)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:1859` calls `POST /api/admin/bloodline-review` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/bloodline-review`\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-c147ef0fb1d27f55", "name": "Dangling fetch: POST /api/weekly-boss (shinobij.client/src/screens/AdminPanel.tsx:2976)", "shortDescription": {"text": "Dangling fetch: POST /api/weekly-boss (shinobij.client/src/screens/AdminPanel.tsx:2976)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:2976` calls `POST /api/weekly-boss` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/weekly-boss`\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-636d4f1de57f679b", "name": "Dangling fetch: GET /api/images?cat=item (shinobij.client/src/screens/AdminPanel.tsx:3287)", "shortDescription": {"text": "Dangling fetch: GET /api/images?cat=item (shinobij.client/src/screens/AdminPanel.tsx:3287)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:3287` calls `GET /api/images?cat=item` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/images`\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-8a4d7a7c6ae84853", "name": "Dangling fetch: GET /api/images?cat=jutsu (shinobij.client/src/screens/AdminPanel.tsx:3468)", "shortDescription": {"text": "Dangling fetch: GET /api/images?cat=jutsu (shinobij.client/src/screens/AdminPanel.tsx:3468)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:3468` calls `GET /api/images?cat=jutsu` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/images`\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-2f527cb3c044b694", "name": "Dangling fetch: GET /api/images?cat=pet (shinobij.client/src/screens/AdminPanel.tsx:4029)", "shortDescription": {"text": "Dangling fetch: GET /api/images?cat=pet (shinobij.client/src/screens/AdminPanel.tsx:4029)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:4029` calls `GET /api/images?cat=pet` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/images`\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-908fee4c397074f5", "name": "Dangling fetch: POST /api/village/kage (shinobij.client/src/screens/AdminPanel.tsx:4552)", "shortDescription": {"text": "Dangling fetch: POST /api/village/kage (shinobij.client/src/screens/AdminPanel.tsx:4552)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:4552` calls `POST /api/village/kage` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/village/kage`\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-64583cbfd60fc1c6", "name": "Dangling fetch: DELETE /api/images?id=${encodeURIComponent(asset.key)} (shinobij.client/src/screens/AdminPanel.tsx:4972)", "shortDescription": {"text": "Dangling fetch: DELETE /api/images?id=${encodeURIComponent(asset.key)} (shinobij.client/src/screens/AdminPanel.tsx:4972)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:4972` calls `DELETE /api/images?id=${encodeURIComponent(asset.key)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/images`\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-9472b4f01eabeb9c", "name": "Dangling fetch: DELETE /api/images?id=${encodeURIComponent(key)} (shinobij.client/src/screens/AdminPanel.tsx:5179)", "shortDescription": {"text": "Dangling fetch: DELETE /api/images?id=${encodeURIComponent(key)} (shinobij.client/src/screens/AdminPanel.tsx:5179)"}, "fullDescription": {"text": "`shinobij.client/src/screens/AdminPanel.tsx:5179` calls `DELETE /api/images?id=${encodeURIComponent(key)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/images`\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-7a3564bf5d89b273", "name": "Dangling fetch: POST /api/village-guard/list (shinobij.client/src/screens/WorldMap.tsx:285)", "shortDescription": {"text": "Dangling fetch: POST /api/village-guard/list (shinobij.client/src/screens/WorldMap.tsx:285)"}, "fullDescription": {"text": "`shinobij.client/src/screens/WorldMap.tsx:285` calls `POST /api/village-guard/list` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/village-guard/list`\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-cf29d238ec5cb06b", "name": "Dangling fetch: POST /api/village-guard/list (shinobij.client/src/screens/WorldMap.tsx:297)", "shortDescription": {"text": "Dangling fetch: POST /api/village-guard/list (shinobij.client/src/screens/WorldMap.tsx:297)"}, "fullDescription": {"text": "`shinobij.client/src/screens/WorldMap.tsx:297` calls `POST /api/village-guard/list` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/village-guard/list`\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-4c59c35b4b76db69", "name": "Dangling fetch: POST /api/pvp/session (shinobij.client/src/screens/WorldMap.tsx:361)", "shortDescription": {"text": "Dangling fetch: POST /api/pvp/session (shinobij.client/src/screens/WorldMap.tsx:361)"}, "fullDescription": {"text": "`shinobij.client/src/screens/WorldMap.tsx:361` calls `POST /api/pvp/session` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pvp/session`\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-11fabfd43f94daad", "name": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/WorldMap.tsx:425)", "shortDescription": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/WorldMap.tsx:425)"}, "fullDescription": {"text": "`shinobij.client/src/screens/WorldMap.tsx:425` calls `POST /api/player/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/challenge`\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-c46579e75b4005a2", "name": "Dangling fetch: POST /api/village-guard/challenge (shinobij.client/src/screens/WorldMap.tsx:1523)", "shortDescription": {"text": "Dangling fetch: POST /api/village-guard/challenge (shinobij.client/src/screens/WorldMap.tsx:1523)"}, "fullDescription": {"text": "`shinobij.client/src/screens/WorldMap.tsx:1523` calls `POST /api/village-guard/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/village-guard/challenge`\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-27e6e3dbcabca30a", "name": "Dangling fetch: POST /api/pvp/session (shinobij.client/src/screens/WorldMap.tsx:1551)", "shortDescription": {"text": "Dangling fetch: POST /api/pvp/session (shinobij.client/src/screens/WorldMap.tsx:1551)"}, "fullDescription": {"text": "`shinobij.client/src/screens/WorldMap.tsx:1551` calls `POST /api/pvp/session` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pvp/session`\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-468475e78da919f5", "name": "Dangling fetch: POST /api/village-guard/challenge (shinobij.client/src/screens/WorldMap.tsx:1568)", "shortDescription": {"text": "Dangling fetch: POST /api/village-guard/challenge (shinobij.client/src/screens/WorldMap.tsx:1568)"}, "fullDescription": {"text": "`shinobij.client/src/screens/WorldMap.tsx:1568` calls `POST /api/village-guard/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/village-guard/challenge`\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-1891da73150812ca", "name": "Dangling fetch: GET /api/weekly-boss (shinobij.client/src/screens/HallOfLegends.tsx:34)", "shortDescription": {"text": "Dangling fetch: GET /api/weekly-boss (shinobij.client/src/screens/HallOfLegends.tsx:34)"}, "fullDescription": {"text": "`shinobij.client/src/screens/HallOfLegends.tsx:34` calls `GET /api/weekly-boss` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/weekly-boss`\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-63350427542c2344", "name": "Dangling fetch: DELETE /api/images?id=${encodeURIComponent(key)} (shinobij.client/src/components/KenneyAtlasPicker.tsx:2", "shortDescription": {"text": "Dangling fetch: DELETE /api/images?id=${encodeURIComponent(key)} (shinobij.client/src/components/KenneyAtlasPicker.tsx:245)"}, "fullDescription": {"text": "`shinobij.client/src/components/KenneyAtlasPicker.tsx:245` calls `DELETE /api/images?id=${encodeURIComponent(key)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/images`\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-3998c5bb0a0c9f92", "name": "Dangling fetch: POST /api/player-auth (shinobij.client/src/components/ChangePasswordCard.tsx:37)", "shortDescription": {"text": "Dangling fetch: POST /api/player-auth (shinobij.client/src/components/ChangePasswordCard.tsx:37)"}, "fullDescription": {"text": "`shinobij.client/src/components/ChangePasswordCard.tsx:37` calls `POST /api/player-auth` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player-auth`\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-10ca49dfbb20b297", "name": "Dangling fetch: POST /api/arena/lobby (shinobij.client/src/components/ArenaCoopLobby.tsx:27)", "shortDescription": {"text": "Dangling fetch: POST /api/arena/lobby (shinobij.client/src/components/ArenaCoopLobby.tsx:27)"}, "fullDescription": {"text": "`shinobij.client/src/components/ArenaCoopLobby.tsx:27` calls `POST /api/arena/lobby` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/arena/lobby`\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-e2688c34874e26e1", "name": "Dangling fetch: POST /api/images (shinobij.client/src/lib/shared-images.ts:65)", "shortDescription": {"text": "Dangling fetch: POST /api/images (shinobij.client/src/lib/shared-images.ts:65)"}, "fullDescription": {"text": "`shinobij.client/src/lib/shared-images.ts:65` calls `POST /api/images` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/images`\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-11ab3d80e9790419", "name": "Dangling fetch: GET /api/messages (shinobij.client/src/lib/mail-unread.ts:31)", "shortDescription": {"text": "Dangling fetch: GET /api/messages (shinobij.client/src/lib/mail-unread.ts:31)"}, "fullDescription": {"text": "`shinobij.client/src/lib/mail-unread.ts:31` calls `GET /api/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/messages`\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-b22824ee9b847d8f", "name": "Dangling fetch: GET /api/save/${clanSlug(name)} (shinobij.client/src/lib/clan-api.ts:15)", "shortDescription": {"text": "Dangling fetch: GET /api/save/${clanSlug(name)} (shinobij.client/src/lib/clan-api.ts:15)"}, "fullDescription": {"text": "`shinobij.client/src/lib/clan-api.ts:15` calls `GET /api/save/${clanSlug(name)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-278816887d5478ca", "name": "Dangling fetch: GET /api/save/${clanSlug(name)} (shinobij.client/src/lib/clan-api.ts:27)", "shortDescription": {"text": "Dangling fetch: GET /api/save/${clanSlug(name)} (shinobij.client/src/lib/clan-api.ts:27)"}, "fullDescription": {"text": "`shinobij.client/src/lib/clan-api.ts:27` calls `GET /api/save/${clanSlug(name)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-45a7e94492539940", "name": "Dangling fetch: POST /api/save/${clanSlug(data.name)} (shinobij.client/src/lib/clan-api.ts:52)", "shortDescription": {"text": "Dangling fetch: POST /api/save/${clanSlug(data.name)} (shinobij.client/src/lib/clan-api.ts:52)"}, "fullDescription": {"text": "`shinobij.client/src/lib/clan-api.ts:52` calls `POST /api/save/${clanSlug(data.name)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-978c3f761000b769", "name": "Dangling fetch: POST /api/village-guard/${action} (shinobij.client/src/lib/clan-api.ts:71)", "shortDescription": {"text": "Dangling fetch: POST /api/village-guard/${action} (shinobij.client/src/lib/clan-api.ts:71)"}, "fullDescription": {"text": "`shinobij.client/src/lib/clan-api.ts:71` calls `POST /api/village-guard/${action}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/village-guard/<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-d8b1e24fe7a80133", "name": "Dangling fetch: POST /api/battle/lock (shinobij.client/src/lib/battle-save.ts:77)", "shortDescription": {"text": "Dangling fetch: POST /api/battle/lock (shinobij.client/src/lib/battle-save.ts:77)"}, "fullDescription": {"text": "`shinobij.client/src/lib/battle-save.ts:77` calls `POST /api/battle/lock` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/battle/lock`\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-9f7d2a3041e24688", "name": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/lib/duel-challenge.ts:38)", "shortDescription": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/lib/duel-challenge.ts:38)"}, "fullDescription": {"text": "`shinobij.client/src/lib/duel-challenge.ts:38` calls `POST /api/player/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/challenge`\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-5911c21a0056974b", "name": "Dangling fetch: POST /api/missions/claim-mission (shinobij.client/src/lib/claim-mission.ts:50)", "shortDescription": {"text": "Dangling fetch: POST /api/missions/claim-mission (shinobij.client/src/lib/claim-mission.ts:50)"}, "fullDescription": {"text": "`shinobij.client/src/lib/claim-mission.ts:50` calls `POST /api/missions/claim-mission` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/missions/claim-mission`\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-e6a2f86ab5983caf", "name": "Dangling fetch: GET /api/clan/war/list (shinobij.client/src/lib/clan-war-api.ts:49)", "shortDescription": {"text": "Dangling fetch: GET /api/clan/war/list (shinobij.client/src/lib/clan-war-api.ts:49)"}, "fullDescription": {"text": "`shinobij.client/src/lib/clan-war-api.ts:49` calls `GET /api/clan/war/list` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/clan/war/list`\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-f29a34c657ce4269", "name": "Dangling fetch: POST /api/clan/war/declare (shinobij.client/src/lib/clan-war-api.ts:61)", "shortDescription": {"text": "Dangling fetch: POST /api/clan/war/declare (shinobij.client/src/lib/clan-war-api.ts:61)"}, "fullDescription": {"text": "`shinobij.client/src/lib/clan-war-api.ts:61` calls `POST /api/clan/war/declare` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/clan/war/declare`\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-5916a3600f00790b", "name": "Dangling fetch: POST /api/clan/war/challenge (shinobij.client/src/lib/clan-war-api.ts:73)", "shortDescription": {"text": "Dangling fetch: POST /api/clan/war/challenge (shinobij.client/src/lib/clan-war-api.ts:73)"}, "fullDescription": {"text": "`shinobij.client/src/lib/clan-war-api.ts:73` calls `POST /api/clan/war/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/clan/war/challenge`\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-0dff449425fc8784", "name": "Dangling fetch: GET /api/player/friends?playerName=${encodeURIComponent(playerName)} (shinobij.client/src/lib/friends.ts", "shortDescription": {"text": "Dangling fetch: GET /api/player/friends?playerName=${encodeURIComponent(playerName)} (shinobij.client/src/lib/friends.ts:27)"}, "fullDescription": {"text": "`shinobij.client/src/lib/friends.ts:27` calls `GET /api/player/friends?playerName=${encodeURIComponent(playerName)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/friends`\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-6ce62aedcef69197", "name": "Dangling fetch: POST /api/player/friends (shinobij.client/src/lib/friends.ts:62)", "shortDescription": {"text": "Dangling fetch: POST /api/player/friends (shinobij.client/src/lib/friends.ts:62)"}, "fullDescription": {"text": "`shinobij.client/src/lib/friends.ts:62` calls `POST /api/player/friends` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/friends`\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-1dc5e0699f27a430", "name": "Dangling fetch: DELETE /api/player/friends (shinobij.client/src/lib/friends.ts:83)", "shortDescription": {"text": "Dangling fetch: DELETE /api/player/friends (shinobij.client/src/lib/friends.ts:83)"}, "fullDescription": {"text": "`shinobij.client/src/lib/friends.ts:83` calls `DELETE /api/player/friends` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/friends`\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-83c3529f5e280485", "name": "Dangling fetch: POST /api/perf-beacon (shinobij.client/src/lib/perfTelemetry.ts:236)", "shortDescription": {"text": "Dangling fetch: POST /api/perf-beacon (shinobij.client/src/lib/perfTelemetry.ts:236)"}, "fullDescription": {"text": "`shinobij.client/src/lib/perfTelemetry.ts:236` calls `POST /api/perf-beacon` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/perf-beacon`\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-42deca94136ec5bb", "name": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/lib/player-api.ts:12)", "shortDescription": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/lib/player-api.ts:12)"}, "fullDescription": {"text": "`shinobij.client/src/lib/player-api.ts:12` calls `POST /api/player/challenge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/player/challenge`\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-22f1ba44d958a7b3", "name": "Dangling fetch: POST /api/village/treasury/donate (shinobij.client/src/lib/player-api.ts:31)", "shortDescription": {"text": "Dangling fetch: POST /api/village/treasury/donate (shinobij.client/src/lib/player-api.ts:31)"}, "fullDescription": {"text": "`shinobij.client/src/lib/player-api.ts:31` calls `POST /api/village/treasury/donate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/village/treasury/donate`\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-12127e128ed0b748", "name": "Dangling fetch: POST /api/clan/treasury/donate (shinobij.client/src/lib/player-api.ts:52)", "shortDescription": {"text": "Dangling fetch: POST /api/clan/treasury/donate (shinobij.client/src/lib/player-api.ts:52)"}, "fullDescription": {"text": "`shinobij.client/src/lib/player-api.ts:52` calls `POST /api/clan/treasury/donate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/clan/treasury/donate`\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-7a4556884adaf8c9", "name": "Dangling fetch: POST /api/clan/upgrade/purchase (shinobij.client/src/lib/player-api.ts:77)", "shortDescription": {"text": "Dangling fetch: POST /api/clan/upgrade/purchase (shinobij.client/src/lib/player-api.ts:77)"}, "fullDescription": {"text": "`shinobij.client/src/lib/player-api.ts:77` calls `POST /api/clan/upgrade/purchase` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/clan/upgrade/purchase`\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-00a466b5c46f2b52", "name": "Dangling fetch: POST /api/village/kage (shinobij.client/src/lib/world-state.ts:703)", "shortDescription": {"text": "Dangling fetch: POST /api/village/kage (shinobij.client/src/lib/world-state.ts:703)"}, "fullDescription": {"text": "`shinobij.client/src/lib/world-state.ts:703` calls `POST /api/village/kage` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/village/kage`\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-fb835d9008958c27", "name": "Dangling fetch: GET /api/save/${encodeURIComponent(name.toLowerCase())}?combatOnly=1 (shinobij.client/src/lib/pvp-sessio", "shortDescription": {"text": "Dangling fetch: GET /api/save/${encodeURIComponent(name.toLowerCase())}?combatOnly=1 (shinobij.client/src/lib/pvp-session.ts:54)"}, "fullDescription": {"text": "`shinobij.client/src/lib/pvp-session.ts:54` calls `GET /api/save/${encodeURIComponent(name.toLowerCase())}?combatOnly=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/save/<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-089fe2117be1756a", "name": "Dangling fetch: POST https://api.openai.com/v1/images/generations (api/generate-image.ts:126)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/generations (api/generate-image.ts:126)"}, "fullDescription": {"text": "`api/generate-image.ts:126` 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-170a4d79c2b7f8ae", "name": "Unused endpoint: USE /api/player/heartbeat", "shortDescription": {"text": "Unused endpoint: USE /api/player/heartbeat"}, "fullDescription": {"text": "`shinobij.client/vite.config.ts` declares `USE /api/player/heartbeat` 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-8527f38da59803f5", "name": "Unused endpoint: USE /api/player/attack", "shortDescription": {"text": "Unused endpoint: USE /api/player/attack"}, "fullDescription": {"text": "`shinobij.client/vite.config.ts` declares `USE /api/player/attack` 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-37aa89a6abc5a6df", "name": "Unused endpoint: USE /api/player/clear-attack", "shortDescription": {"text": "Unused endpoint: USE /api/player/clear-attack"}, "fullDescription": {"text": "`shinobij.client/vite.config.ts` declares `USE /api/player/clear-attack` 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-3b485b2d4c9b2fc8", "name": "Unused endpoint: USE /api/village-guard/queue", "shortDescription": {"text": "Unused endpoint: USE /api/village-guard/queue"}, "fullDescription": {"text": "`shinobij.client/vite.config.ts` declares `USE /api/village-guard/queue` 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-a47655cd6e579b2e", "name": "Unused endpoint: USE /api/village-guard/dequeue", "shortDescription": {"text": "Unused endpoint: USE /api/village-guard/dequeue"}, "fullDescription": {"text": "`shinobij.client/vite.config.ts` declares `USE /api/village-guard/dequeue` 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-6735d5d2bcd36f8f", "name": "Unused endpoint: USE /api/village-guard/list", "shortDescription": {"text": "Unused endpoint: USE /api/village-guard/list"}, "fullDescription": {"text": "`shinobij.client/vite.config.ts` declares `USE /api/village-guard/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-0a523f3594556dae", "name": "Unused endpoint: USE /api/clans/list", "shortDescription": {"text": "Unused endpoint: USE /api/clans/list"}, "fullDescription": {"text": "`shinobij.client/vite.config.ts` declares `USE /api/clans/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-3dba932983f6f879", "name": "Unused endpoint: USE /api/save", "shortDescription": {"text": "Unused endpoint: USE /api/save"}, "fullDescription": {"text": "`shinobij.client/vite.config.ts` declares `USE /api/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-ab5cf91a3be6e8ac", "name": "Unused endpoint: USE /api/generate-image", "shortDescription": {"text": "Unused endpoint: USE /api/generate-image"}, "fullDescription": {"text": "`shinobij.client/vite.config.ts` declares `USE /api/generate-image` 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-7a538eb6af53f0a9", "name": "Unused endpoint: POST /api/player/attack", "shortDescription": {"text": "Unused endpoint: POST /api/player/attack"}, "fullDescription": {"text": "`shinobij.client/server.ts` declares `POST /api/player/attack` 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-539af941cd5de132", "name": "Unused endpoint: POST /api/player/clear-attack", "shortDescription": {"text": "Unused endpoint: POST /api/player/clear-attack"}, "fullDescription": {"text": "`shinobij.client/server.ts` declares `POST /api/player/clear-attack` 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/21297"}, "properties": {"repository": "Timehue/ShinobiX", "repoUrl": "https://github.com/Timehue/ShinobiX", "branch": "main"}, "results": [{"ruleId": "foundry_unresolved_feedback", "level": "warning", "message": {"text": "Foundry mined unresolved feedback: Timehue/ShinobiX"}, "properties": {"repobilityId": 423452, "scanner": "foundry_dataset", "fingerprint": "9b8733878999b4f5c1e2dd9a1dccae6ef2bb688b3a6182c6a45c2dbf38bce5de", "category": "practices", "severity": "medium", "confidence": 0.7, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Human feedback without linked fix evidence", "intent": "Negative/unresolved examples that should not be hallucinated into fixes.", "labels": {"bug_fix": 1, "test_or_ci": 21, "api_or_backend": 72, "docs_or_claims": 2, "schema_or_data": 1, "source_or_other": 4, "api_integration_gap": 1, "build_install_failure": 1, "partial blueprint fit": 2, "verification_or_tests": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 1, "blueprint_human_gap_alignment": 2, "human_reported_issue_no_linked_fix": 1, "thread_has_human_issue_and_fix_context": 2, "claimed_resolved_with_verification_signal": 3, "human_reported_issue_then_verified_fix_attempt": 1}, "source": "graph_query_export", "motif_id": "unlinked_feedback_needs_evidence", "outcomes": {"not_resolved_or_not_observed": 2, "claimed_resolved_with_verification_signal": 6}, "polarity": "bad", "query_id": "unresolved_feedback", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 162, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 2, "thread_touches_file": 100, "alignment_uses_comment": 2, "alignment_uses_finding": 2, "chain_has_link_quality": 6, "comment_aligns_finding": 2, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 12, "thread_has_comment_chain": 2, "comment_chain_links_commit": 2, "comment_chain_touches_file": 24, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 2}, "node_count": 120, "node_types": {"repo": 1, "commit": 2, "thread": 1, "comment": 2, "pr_file": 100, "alignment": 2, "fix_outcome": 1, "issue_chain": 1, "link_quality": 6, "comment_chain": 2, "blueprint_finding": 2}, "query_type": "motif_query", "thread_key": "Timehue/ShinobiX#2", "issue_number": "2", "quality_tiers": {"unresolved": 1, "assumption_check": 2, "weak_supervision": 3}, "repo_full_name": "Timehue/ShinobiX", "training_usage": "negative_or_unresolved", "source_motif_id": "graph-pattern-motif-thread-832bc8f6fddf6388", "graph_gold_label": "supported_by_verification_signal", "changed_file_labels": {"test_or_ci": 105, "api_or_backend": 360, "docs_or_claims": 10, "schema_or_data": 5, "source_or_other": 20}}, "text": "Graph query export: Human feedback without linked fix evidence\nQuery id: unresolved_feedback\nQuery type: motif_query\nIntent: Negative/unresolved examples that should not be hallucinated into fixes.\nMotif: unlinked_feedback_needs_evidence\nTraining usage: negative_or_unresolved\nGraph gold label: supported_by_verification_signal\nRepo: Timehue/ShinobiX\nThread: Timehue/ShinobiX#2\nEvidence:\nGraph motif: Human feedback exists without a linked fix\nMotif id: unlinked_feedback_needs_evidence\nPolarity: bad\nTraining usage: negative_or_unresolved\nSeverity: medium\nRepo: Timehue/ShinobiX\nThread: Timehue/ShinobiX#2\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: Timehue/ShinobiX#2\nRepo: Timehue/ShinobiX\nIssue/PR number: 2\nGraph consistency label: supported_by_verification_signal\nNodes: 120\nEdges: 162\nNode types: {'pr_file': 100, 'link_quality': 6, 'comment': 2, 'comment_chain': 2, 'commit': 2, 'alignment': 2, 'blueprint_finding': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'thread_touches_file': 100, 'comment_chain_touches_file': 24, 'issue_chain_touches_file': 12, 'chain_has_link_quality': 6, 'thread_has_comment': 2, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'comment_chain_links_commit': 2, 'issue_chain_has_comment_chain': 2, 'alignment_uses_comment': 2, 'alignment_uses_finding': 2, 'comment_aligns_finding': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'api_or_backend': 72, 'test_or_ci': 21, 'source_or_other': 4, 'claimed_resolved_with_verification_signal': 3, 'docs_or_claims': 2, 'thread_has_human_issue_and_fix_context': 2, 'blueprint_human_gap_alignment': 2, 'partial blueprint fit': 2, 'issue_or_pull_request_thread': 1, 'build_install_failure': 1, 'api_integration_gap': 1, 'schema_or_data': 1, 'human_reported_issue_then_verified_fix_attempt': 1, 'bug_fix': 1, 'verification_or_tests': 1, 'human_reported_issue_no_linked_fix': 1}\nOutcomes: {'claimed_resolved_with_verification_signal': 6, 'not_resolved_or_not_observed': 2}\nQuality tiers: {'weak_supervision': 3, 'assumption_check': 2, 'unresolved': 1}\nCI labels: {}\nCurriculum targets:\n- Teach models to preserve unresolved human feedback instead of hallucinating fixes.\n- Build issue-to-regression examples where no accepted fix exists yet.\nAssumption checks:\n- Can a commit be linked by issue number, SHA, changed path, or time window?\n- If no link exists, is this explicitly labelled unresolved?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/Timehue/ShinobiX", "source_id": "graph-query-motif_query-65a61706ffa529a5", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/unresolved_feedback/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "Timehue/ShinobiX", "source_dataset": "graph_queries/unresolved_feedback", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_unresolved_feedback", "level": "warning", "message": {"text": "Foundry mined unresolved feedback: Timehue/ShinobiX"}, "properties": {"repobilityId": 423451, "scanner": "foundry_dataset", "fingerprint": "9b87710fa61c485f139cbdfbcadbd38784982db655b47e8e93618793f066ad1c", "category": "practices", "severity": "medium", "confidence": 0.7, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Human feedback without linked fix evidence", "intent": "Negative/unresolved examples that should not be hallucinated into fixes.", "labels": {"ui_or_frontend": 1, "api_integration_gap": 1, "dependency_or_build": 2, "build_install_failure": 1, "partial blueprint fit": 2, "verification_or_tests": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 1, "ambiguous_needs_more_evidence": 3, "blueprint_human_gap_alignment": 2, "comment_has_related_commit_context": 1, "human_reported_issue_no_linked_fix": 1, "thread_has_human_issue_and_fix_context": 2}, "source": "graph_query_export", "motif_id": "unlinked_feedback_needs_evidence", "outcomes": {"not_resolved_or_not_observed": 2, "ambiguous_needs_more_evidence": 6}, "polarity": "bad", "query_id": "unresolved_feedback", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 37, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 2, "thread_touches_file": 3, "alignment_uses_comment": 2, "alignment_uses_finding": 2, "chain_has_link_quality": 6, "comment_aligns_finding": 2, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 3, "thread_has_comment_chain": 2, "comment_chain_links_commit": 1, "comment_chain_touches_file": 6, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 2}, "node_count": 22, "node_types": {"repo": 1, "commit": 1, "thread": 1, "comment": 2, "pr_file": 3, "alignment": 2, "fix_outcome": 1, "issue_chain": 1, "link_quality": 6, "comment_chain": 2, "blueprint_finding": 2}, "query_type": "motif_query", "thread_key": "Timehue/ShinobiX#1", "issue_number": "1", "quality_tiers": {"unresolved": 1, "assumption_check": 2, "weak_supervision": 3}, "repo_full_name": "Timehue/ShinobiX", "training_usage": "negative_or_unresolved", "source_motif_id": "graph-pattern-motif-thread-ffafa669be6d5d50", "graph_gold_label": "weak_supervision_needs_review", "changed_file_labels": {"ui_or_frontend": 5, "dependency_or_build": 10}}, "text": "Graph query export: Human feedback without linked fix evidence\nQuery id: unresolved_feedback\nQuery type: motif_query\nIntent: Negative/unresolved examples that should not be hallucinated into fixes.\nMotif: unlinked_feedback_needs_evidence\nTraining usage: negative_or_unresolved\nGraph gold label: weak_supervision_needs_review\nRepo: Timehue/ShinobiX\nThread: Timehue/ShinobiX#1\nEvidence:\nGraph motif: Human feedback exists without a linked fix\nMotif id: unlinked_feedback_needs_evidence\nPolarity: bad\nTraining usage: negative_or_unresolved\nSeverity: medium\nRepo: Timehue/ShinobiX\nThread: Timehue/ShinobiX#1\nGraph gold label: weak_supervision_needs_review\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: Timehue/ShinobiX#1\nRepo: Timehue/ShinobiX\nIssue/PR number: 1\nGraph consistency label: weak_supervision_needs_review\nNodes: 22\nEdges: 37\nNode types: {'link_quality': 6, 'pr_file': 3, 'comment': 2, 'comment_chain': 2, 'alignment': 2, 'blueprint_finding': 2, 'thread': 1, 'repo': 1, 'commit': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'comment_chain_touches_file': 6, 'chain_has_link_quality': 6, 'thread_touches_file': 3, 'issue_chain_touches_file': 3, 'thread_has_comment': 2, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'issue_chain_has_comment_chain': 2, 'alignment_uses_comment': 2, 'alignment_uses_finding': 2, 'comment_aligns_finding': 2, 'repo_has_thread': 1, 'comment_chain_links_commit': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'ambiguous_needs_more_evidence': 3, 'dependency_or_build': 2, 'thread_has_human_issue_and_fix_context': 2, 'blueprint_human_gap_alignment': 2, 'partial blueprint fit': 2, 'issue_or_pull_request_thread': 1, 'build_install_failure': 1, 'api_integration_gap': 1, 'ui_or_frontend': 1, 'comment_has_related_commit_context': 1, 'verification_or_tests': 1, 'human_reported_issue_no_linked_fix': 1, 'not_resolved_or_not_observed': 1}\nOutcomes: {'ambiguous_needs_more_evidence': 6, 'not_resolved_or_not_observed': 2}\nQuality tiers: {'weak_supervision': 3, 'assumption_check': 2, 'unresolved': 1}\nCI labels: {}\nCurriculum targets:\n- Teach models to preserve unresolved human feedback instead of hallucinating fixes.\n- Build issue-to-regression examples where no accepted fix exists yet.\nAssumption checks:\n- Can a commit be linked by issue number, SHA, changed path, or time window?\n- If no link exists, is this explicitly labelled unresolved?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/Timehue/ShinobiX", "source_id": "graph-query-motif_query-8a2a5926aa9d8916", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/unresolved_feedback/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "Timehue/ShinobiX", "source_dataset": "graph_queries/unresolved_feedback", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_blueprint_gap", "level": "warning", "message": {"text": "Foundry mined blueprint gap alignment: Timehue/ShinobiX"}, "properties": {"repobilityId": 395284, "scanner": "foundry_dataset", "fingerprint": "62f8191be70d309692914487eb06e1384f972a54f43614f9162abfaddb93efda", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Human feedback aligned with blueprint or architecture gaps", "intent": "Curriculum-gap examples connecting issue threads to helicopter-view gaps.", "labels": {"bug_fix": 1, "test_or_ci": 21, "api_or_backend": 72, "docs_or_claims": 2, "schema_or_data": 1, "source_or_other": 4, "api_integration_gap": 1, "build_install_failure": 1, "partial blueprint fit": 2, "verification_or_tests": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 1, "blueprint_human_gap_alignment": 2, "human_reported_issue_no_linked_fix": 1, "thread_has_human_issue_and_fix_context": 2, "claimed_resolved_with_verification_signal": 3, "human_reported_issue_then_verified_fix_attempt": 1}, "source": "graph_query_export", "motif_id": "blueprint_gap_alignment", "outcomes": {"not_resolved_or_not_observed": 2, "claimed_resolved_with_verification_signal": 6}, "polarity": "mixed", "query_id": "blueprint_gap_alignment", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 162, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 2, "thread_touches_file": 100, "alignment_uses_comment": 2, "alignment_uses_finding": 2, "chain_has_link_quality": 6, "comment_aligns_finding": 2, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 12, "thread_has_comment_chain": 2, "comment_chain_links_commit": 2, "comment_chain_touches_file": 24, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 2}, "node_count": 120, "node_types": {"repo": 1, "commit": 2, "thread": 1, "comment": 2, "pr_file": 100, "alignment": 2, "fix_outcome": 1, "issue_chain": 1, "link_quality": 6, "comment_chain": 2, "blueprint_finding": 2}, "query_type": "motif_query", "thread_key": "Timehue/ShinobiX#2", "issue_number": "2", "quality_tiers": {"unresolved": 1, "assumption_check": 2, "weak_supervision": 3}, "repo_full_name": "Timehue/ShinobiX", "training_usage": "curriculum_gap", "source_motif_id": "graph-pattern-motif-thread-787616cf17e0a4d5", "graph_gold_label": "supported_by_verification_signal", "changed_file_labels": {"test_or_ci": 105, "api_or_backend": 360, "docs_or_claims": 10, "schema_or_data": 5, "source_or_other": 20}}, "text": "Graph query export: Human feedback aligned with blueprint or architecture gaps\nQuery id: blueprint_gap_alignment\nQuery type: motif_query\nIntent: Curriculum-gap examples connecting issue threads to helicopter-view gaps.\nMotif: blueprint_gap_alignment\nTraining usage: curriculum_gap\nGraph gold label: supported_by_verification_signal\nRepo: Timehue/ShinobiX\nThread: Timehue/ShinobiX#2\nEvidence:\nGraph motif: Human feedback aligns with blueprint or architecture gaps\nMotif id: blueprint_gap_alignment\nPolarity: mixed\nTraining usage: curriculum_gap\nSeverity: medium\nRepo: Timehue/ShinobiX\nThread: Timehue/ShinobiX#2\nGraph gold label: supported_by_verification_signal\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: Timehue/ShinobiX#2\nRepo: Timehue/ShinobiX\nIssue/PR number: 2\nGraph consistency label: supported_by_verification_signal\nNodes: 120\nEdges: 162\nNode types: {'pr_file': 100, 'link_quality': 6, 'comment': 2, 'comment_chain': 2, 'commit': 2, 'alignment': 2, 'blueprint_finding': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'thread_touches_file': 100, 'comment_chain_touches_file': 24, 'issue_chain_touches_file': 12, 'chain_has_link_quality': 6, 'thread_has_comment': 2, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'comment_chain_links_commit': 2, 'issue_chain_has_comment_chain': 2, 'alignment_uses_comment': 2, 'alignment_uses_finding': 2, 'comment_aligns_finding': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'api_or_backend': 72, 'test_or_ci': 21, 'source_or_other': 4, 'claimed_resolved_with_verification_signal': 3, 'docs_or_claims': 2, 'thread_has_human_issue_and_fix_context': 2, 'blueprint_human_gap_alignment': 2, 'partial blueprint fit': 2, 'issue_or_pull_request_thread': 1, 'build_install_failure': 1, 'api_integration_gap': 1, 'schema_or_data': 1, 'human_reported_issue_then_verified_fix_attempt': 1, 'bug_fix': 1, 'verification_or_tests': 1, 'human_reported_issue_no_linked_fix': 1}\nOutcomes: {'claimed_resolved_with_verification_signal': 6, 'not_resolved_or_not_observed': 2}\nQuality tiers: {'weak_supervision': 3, 'assumption_check': 2, 'unresolved': 1}\nCI labels: {}\nCurriculum targets:\n- Use helicopter-view architecture/schema/design evidence beside issue threads.\n- Teach models to compare requested product class against implementation layers.\nAssumption checks:\n- Which blueprint layer is absent: frontend, API, data, auth, tests, or deployment?\n- Does human feedback confirm the same architectural gap?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/Timehue/ShinobiX", "source_id": "graph-query-motif_query-2eb3ac6058eae17a", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/blueprint_gap_alignment/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "Timehue/ShinobiX", "source_dataset": "graph_queries/blueprint_gap_alignment", "training_usage": "curriculum_gap"}}}, {"ruleId": "foundry_blueprint_gap", "level": "warning", "message": {"text": "Foundry mined blueprint gap alignment: Timehue/ShinobiX"}, "properties": {"repobilityId": 395283, "scanner": "foundry_dataset", "fingerprint": "17219b94114e1da5c7c9c84b9895df49bf9879d89672f8660bcaaf9b42e7a528", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Human feedback aligned with blueprint or architecture gaps", "intent": "Curriculum-gap examples connecting issue threads to helicopter-view gaps.", "labels": {"ui_or_frontend": 1, "api_integration_gap": 1, "dependency_or_build": 2, "build_install_failure": 1, "partial blueprint fit": 2, "verification_or_tests": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 1, "ambiguous_needs_more_evidence": 3, "blueprint_human_gap_alignment": 2, "comment_has_related_commit_context": 1, "human_reported_issue_no_linked_fix": 1, "thread_has_human_issue_and_fix_context": 2}, "source": "graph_query_export", "motif_id": "blueprint_gap_alignment", "outcomes": {"not_resolved_or_not_observed": 2, "ambiguous_needs_more_evidence": 6}, "polarity": "mixed", "query_id": "blueprint_gap_alignment", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 37, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 2, "thread_touches_file": 3, "alignment_uses_comment": 2, "alignment_uses_finding": 2, "chain_has_link_quality": 6, "comment_aligns_finding": 2, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 3, "thread_has_comment_chain": 2, "comment_chain_links_commit": 1, "comment_chain_touches_file": 6, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 2}, "node_count": 22, "node_types": {"repo": 1, "commit": 1, "thread": 1, "comment": 2, "pr_file": 3, "alignment": 2, "fix_outcome": 1, "issue_chain": 1, "link_quality": 6, "comment_chain": 2, "blueprint_finding": 2}, "query_type": "motif_query", "thread_key": "Timehue/ShinobiX#1", "issue_number": "1", "quality_tiers": {"unresolved": 1, "assumption_check": 2, "weak_supervision": 3}, "repo_full_name": "Timehue/ShinobiX", "training_usage": "curriculum_gap", "source_motif_id": "graph-pattern-motif-thread-47e85a0374aa3495", "graph_gold_label": "weak_supervision_needs_review", "changed_file_labels": {"ui_or_frontend": 5, "dependency_or_build": 10}}, "text": "Graph query export: Human feedback aligned with blueprint or architecture gaps\nQuery id: blueprint_gap_alignment\nQuery type: motif_query\nIntent: Curriculum-gap examples connecting issue threads to helicopter-view gaps.\nMotif: blueprint_gap_alignment\nTraining usage: curriculum_gap\nGraph gold label: weak_supervision_needs_review\nRepo: Timehue/ShinobiX\nThread: Timehue/ShinobiX#1\nEvidence:\nGraph motif: Human feedback aligns with blueprint or architecture gaps\nMotif id: blueprint_gap_alignment\nPolarity: mixed\nTraining usage: curriculum_gap\nSeverity: medium\nRepo: Timehue/ShinobiX\nThread: Timehue/ShinobiX#1\nGraph gold label: weak_supervision_needs_review\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: Timehue/ShinobiX#1\nRepo: Timehue/ShinobiX\nIssue/PR number: 1\nGraph consistency label: weak_supervision_needs_review\nNodes: 22\nEdges: 37\nNode types: {'link_quality': 6, 'pr_file': 3, 'comment': 2, 'comment_chain': 2, 'alignment': 2, 'blueprint_finding': 2, 'thread': 1, 'repo': 1, 'commit': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'comment_chain_touches_file': 6, 'chain_has_link_quality': 6, 'thread_touches_file': 3, 'issue_chain_touches_file': 3, 'thread_has_comment': 2, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'issue_chain_has_comment_chain': 2, 'alignment_uses_comment': 2, 'alignment_uses_finding': 2, 'comment_aligns_finding': 2, 'repo_has_thread': 1, 'comment_chain_links_commit': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'ambiguous_needs_more_evidence': 3, 'dependency_or_build': 2, 'thread_has_human_issue_and_fix_context': 2, 'blueprint_human_gap_alignment': 2, 'partial blueprint fit': 2, 'issue_or_pull_request_thread': 1, 'build_install_failure': 1, 'api_integration_gap': 1, 'ui_or_frontend': 1, 'comment_has_related_commit_context': 1, 'verification_or_tests': 1, 'human_reported_issue_no_linked_fix': 1, 'not_resolved_or_not_observed': 1}\nOutcomes: {'ambiguous_needs_more_evidence': 6, 'not_resolved_or_not_observed': 2}\nQuality tiers: {'weak_supervision': 3, 'assumption_check': 2, 'unresolved': 1}\nCI labels: {}\nCurriculum targets:\n- Use helicopter-view architecture/schema/design evidence beside issue threads.\n- Teach models to compare requested product class against implementation layers.\nAssumption checks:\n- Which blueprint layer is absent: frontend, API, data, auth, tests, or deployment?\n- Does human feedback confirm the same architectural gap?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/Timehue/ShinobiX", "source_id": "graph-query-motif_query-a285a224e82db410", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/blueprint_gap_alignment/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "Timehue/ShinobiX", "source_dataset": "graph_queries/blueprint_gap_alignment", "training_usage": "curriculum_gap"}}}, {"ruleId": "foundry_assumption_check", "level": "warning", "message": {"text": "Foundry mined assumption checks: Timehue/ShinobiX"}, "properties": {"repobilityId": 374386, "scanner": "foundry_dataset", "fingerprint": "37897cd054b26c77498a0bf6b396c71ed01885b2656cf0b8aac2fa89a62158e4", "category": "practices", "severity": "medium", "confidence": 0.62, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "comment_chain_pattern_product", "source": "comment_chain_pattern_miner", "product": "assumption_checks", "synthetic": false, "thread_key": "Timehue/ShinobiX#1", "human_labels": ["api_integration_gap", "build_install_failure", "dependency_or_build", "ui_or_frontend"], "issue_number": "1", "thread_label": "thread_has_human_issue_and_fix_context", "outcome_label": "ambiguous_needs_more_evidence", "source_backed": true, "max_confidence": 0.59, "repo_full_name": "Timehue/ShinobiX", "training_usage": "weak_supervision", "confidence_tier": "weak_supervision", "source_chain_id": "evidence-chain-issue_chain-cff14a78f0ebf19b", "helicopter_views": {"schemas": 2}, "artifact_families": {"ci": 1, "docs": 4, "tests": 1, "schemas": 2}, "source_chain_kind": "issue_chain", "changed_file_count": 3, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"ui_or_frontend": 1, "dependency_or_build": 2}, "linked_commit_count": 1, "helicopter_view_count": 2, "source_artifact_count": 8, "classification_reasons": ["source_graph_has_real_artifacts", "source_graph_has_verification_artifacts", "repo_has_isolated_helicopter_views", "link_quality_weak_supervision", "high_risk_human_feedback_label"], "linked_ci_commit_count": 0, "verification_artifact_count": 4, "design_schema_api_artifact_count": 2}, "text": "Comment chain pattern product: assumption_checks\nRepo: Timehue/ShinobiX\nThread: Timehue/ShinobiX#1\nOutcome: ambiguous_needs_more_evidence\nThread label: thread_has_human_issue_and_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_weak_supervision, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: Timehue/ShinobiX#1\nRepo: Timehue/ShinobiX\nThread label: thread_has_human_issue_and_fix_context\nOutcome: ambiguous_needs_more_evidence\nComment count: 2\nLinked commit count: 1\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 3\nLabels: {'build_install_failure': 1, 'api_integration_gap': 1}\nPolarities: {'bad': 2}\nChanged file labels: {'dependency_or_build': 2, 'ui_or_frontend': 1}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-1a2bb5071e92b331\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"build_install_failure\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/Timehue/ShinobiX/pull/1\",\n    \"text\": \"GitHub feedback: build_install_failure\\nPolarity: bad\\nKind: pull_request_body\\nRepo: Timehue/ShinobiX\\nAuthor: vercel[bot] (Bot)\\nURL: https://github.com/Timehue/ShinobiX/pull/1\\nTitle: Install Vercel Web Analytics\\nBody:\\nSuccessfully installed and configured Vercel Web Analytics for the ShinobiX project.\\n\\n## Changes Made:\\n\\n### 1. Package Installation\\n- Installed `@vercel/analytics` version 2.0.1 using npm\\n- Updated `shinobij.client/package.json` to include the new dependency\\n- Updated `shinobij.client/package-lock.json` with the new package and its dependencies\\n\\n### 2. Analytics Integration\\n- Added the Analytics component to `shinobij.client/src/main.tsx`\\n- Imported `{ Analytics }` from `@vercel/analytics/react` (React-specific package)\\n- Placed the `<Analytics />` component inside the StrictMode wrapper alongside the App component\\n\\n### Implementation Details:\\n\\nThe project is a React application built with Vite, so I followed the official Vercel documentation's React-specific instructions:\\n\\n**File: shinobij.client/src/main.tsx**\\n- Added import: `import { Analytics } from '@vercel/analytics/react'`\\n- Added component: `<Analytics />` within the StrictMode render tree\\n\\nThis follows the rec\"\n  },\n  {\n    \"id\": \"github-feedback-comment-8f8a99f1d5900090\",\n    \"kind\": \"issue_comment\",\n    \"label\": \"api_integration_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/Timehue/ShinobiX/pull/1#issuecomment-4464333829\",\n    \"text\": \"GitHub feedback: api_integration_gap\\nPolarity: bad\\nKind: issue_comment\\nRepo: Timehue/ShinobiX\\nAuthor: vercel[bot] (Bot)\\nURL: https://github.com/Timehue/ShinobiX/pull/1#issuecomment-4464333829\\nTitle: \\nBody:\\n[vc]: #UR+J99TQwH9eJDuZmThPXMnA48MOE2HnFhXV9ZRLYs8=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJ0ZXN0IiwicHJvamVjdElkIjoicHJqXzhBYUFYTHZKbTVpTGNOS1Z\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/Timehue/ShinobiX", "source_id": "comment-chain-pattern-assumption_checks-22b59d7b1576274e", "synthetic": false, "gold_label": "", "graph_label": "source_backed_multi_signal_graph", "source_path": "/data/distillate/foundry_data/comment_chain_patterns/assumption_checks/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "Timehue/ShinobiX", "source_dataset": "comment_chain_patterns/assumption_checks", "training_usage": "weak_supervision"}}}, {"ruleId": "scanner-9f2399db84d64f38", "level": "note", "message": {"text": "Possibly dead Python function: apply_dots"}, "properties": {"repobilityId": "1207c3555f4c726e", "scanner": "scanner-primary", "fingerprint": "9f2399db84d64f38", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/pvp_v4_stacking_sim.py:120"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bb7d664f6ff7c356", "level": "note", "message": {"text": "Possibly dead Python function: ignition"}, "properties": {"repobilityId": "e4acdced603f13a1", "scanner": "scanner-primary", "fingerprint": "bb7d664f6ff7c356", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/pvp_v4_match_sim.py:292"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1807b72cd3e24fc0", "level": "note", "message": {"text": "Possibly dead Python function: wound_S"}, "properties": {"repobilityId": "703defb5c4acd950", "scanner": "scanner-primary", "fingerprint": "1807b72cd3e24fc0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/pvp_v4_match_sim.py:295"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-35e8ad13debc44ce", "level": "note", "message": {"text": "Possibly dead Python function: basic_atk"}, "properties": {"repobilityId": "63d11f151c8d509b", "scanner": "scanner-primary", "fingerprint": "35e8ad13debc44ce", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/pvp_v4_match_sim.py:302"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-79a6888050b7e9ca", "level": "note", "message": {"text": "Possibly dead Python function: buff_prev"}, "properties": {"repobilityId": "1d451db8350d3a17", "scanner": "scanner-primary", "fingerprint": "79a6888050b7e9ca", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/pvp_v4_match_sim.py:303"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-03d212e895513f85", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app.js:30"}, "properties": {"repobilityId": "59748ac0372fad2e", "scanner": "scanner-primary", "fingerprint": "03d212e895513f85", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-db892b711117b5f9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server.ts:161"}, "properties": {"repobilityId": "63422c4893a0b074", "scanner": "scanner-primary", "fingerprint": "db892b711117b5f9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fe1855e94a84ee5e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 shinobij.client/server.ts:164"}, "properties": {"repobilityId": "43192d63ee3cd40c", "scanner": "scanner-primary", "fingerprint": "fe1855e94a84ee5e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7f5a469b4c5b6ebf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 shinobij.client/src/lib/world-state.ts:1044"}, "properties": {"repobilityId": "093335d141934c2e", "scanner": "scanner-primary", "fingerprint": "7f5a469b4c5b6ebf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e7cd92527c237b70", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 api/images.ts:67"}, "properties": {"repobilityId": "f16db737988a99d6", "scanner": "scanner-primary", "fingerprint": "e7cd92527c237b70", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8c052bd3ea74c486", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 api/_storage.ts:830"}, "properties": {"repobilityId": "a240ee8f63b0f291", "scanner": "scanner-primary", "fingerprint": "8c052bd3ea74c486", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-77954d5f96dceffa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 api/_force-ipv4.ts:30"}, "properties": {"repobilityId": "f4ef9951d4b5dda8", "scanner": "scanner-primary", "fingerprint": "77954d5f96dceffa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8519d3b7e66dbc77", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 api/perf-beacon.ts:89"}, "properties": {"repobilityId": "7d5a571976e1e8e7", "scanner": "scanner-primary", "fingerprint": "8519d3b7e66dbc77", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f75003519ad17ddf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 api/cron/_scheduler.ts:43"}, "properties": {"repobilityId": "e328492dc7d30716", "scanner": "scanner-primary", "fingerprint": "f75003519ad17ddf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-51ddbcf194cd38ee", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 api/_realtime/socket.ts:86"}, "properties": {"repobilityId": "52c7761b080cadd9", "scanner": "scanner-primary", "fingerprint": "51ddbcf194cd38ee", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e587407dd1c4e560", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 api/_realtime/game-loop.ts:48"}, "properties": {"repobilityId": "af3207eb8c193c6c", "scanner": "scanner-primary", "fingerprint": "e587407dd1c4e560", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-08f3e9e9922e909e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/arena-ai-stats.ts:77"}, "properties": {"repobilityId": "96e88e4245e053da", "scanner": "scanner-primary", "fingerprint": "08f3e9e9922e909e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d558da41811951c2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/pvp-formula-sim.ts:781"}, "properties": {"repobilityId": "f5a2ebe5c1e5ac29", "scanner": "scanner-primary", "fingerprint": "d558da41811951c2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-674e355548f729bd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/pet-duel-balance.ts:102"}, "properties": {"repobilityId": "0273a53bb8b62b6a", "scanner": "scanner-primary", "fingerprint": "674e355548f729bd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c51c5501508bb395", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/pet-role-balance.ts:46"}, "properties": {"repobilityId": "4a6a28dda950ff4f", "scanner": "scanner-primary", "fingerprint": "c51c5501508bb395", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d63da3583b14afc0", "level": "warning", "message": {"text": "Dockerfile runs as root: Dockerfile"}, "properties": {"repobilityId": "a2ed1bd120e507db", "scanner": "scanner-primary", "fingerprint": "d63da3583b14afc0", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-59cbf6e36a0e3777", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-bookworm-slim"}, "properties": {"repobilityId": "e71e2412dd050aaf", "scanner": "scanner-primary", "fingerprint": "59cbf6e36a0e3777", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-544067b28b78dbeb", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in CLAUDE.md:86"}, "properties": {"repobilityId": "357ad155aeba7b11", "scanner": "scanner-primary", "fingerprint": "544067b28b78dbeb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 86}}}]}, {"ruleId": "scanner-2f9a5de91fb9e0d4", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in shinobij.client/vite.config.ts:8"}, "properties": {"repobilityId": "7707e6ca9ff65179", "scanner": "scanner-primary", "fingerprint": "2f9a5de91fb9e0d4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "shinobij.client/vite.config.ts"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-56302c88a6486e52", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in shinobij.client/server.ts:7"}, "properties": {"repobilityId": "e7932f798b4e8ef1", "scanner": "scanner-primary", "fingerprint": "56302c88a6486e52", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "shinobij.client/server.ts"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-8c99e4f0f92cbd8d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in shinobij.client/scripts/gen-all-pet-runs.mjs:14"}, "properties": {"repobilityId": "4a0d9cfaf42e1d6d", "scanner": "scanner-primary", "fingerprint": "8c99e4f0f92cbd8d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "shinobij.client/scripts/gen-all-pet-runs.mjs"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-0d5f94370dc73e26", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in shinobij.client/scripts/gen-all-pet-poses.mjs:16"}, "properties": {"repobilityId": "326f924889038c53", "scanner": "scanner-primary", "fingerprint": "0d5f94370dc73e26", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "shinobij.client/scripts/gen-all-pet-poses.mjs"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"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-66d8ceede29113a9", "level": "note", "message": {"text": "Very large file: shinobij.client/src/App.tsx (10451 lines)"}, "properties": {"repobilityId": "5fcf0bdebe991a2d", "scanner": "scanner-primary", "fingerprint": "66d8ceede29113a9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-59c8f066d0ef312e", "level": "note", "message": {"text": "Very large file: shinobij.client/src/screens/PvpBattleScreen.tsx (1680 lines)"}, "properties": {"repobilityId": "8ec9c20559029224", "scanner": "scanner-primary", "fingerprint": "59c8f066d0ef312e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-92deb0d28b7b5018", "level": "note", "message": {"text": "Very large file: shinobij.client/src/screens/PetYard.tsx (1051 lines)"}, "properties": {"repobilityId": "bfe629800199f1a3", "scanner": "scanner-primary", "fingerprint": "92deb0d28b7b5018", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a7eb32982dedba63", "level": "note", "message": {"text": "Very large file: shinobij.client/src/screens/Arena.tsx (4913 lines)"}, "properties": {"repobilityId": "0995025667d67a21", "scanner": "scanner-primary", "fingerprint": "a7eb32982dedba63", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2279665eb71e2816", "level": "note", "message": {"text": "Very large file: shinobij.client/src/screens/PetArena.tsx (1453 lines)"}, "properties": {"repobilityId": "46547dea4cf3b5d8", "scanner": "scanner-primary", "fingerprint": "2279665eb71e2816", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e01c3d26b0a78f26", "level": "note", "message": {"text": "Very large file: shinobij.client/src/screens/CentralHub.tsx (1621 lines)"}, "properties": {"repobilityId": "b9680f77d520649a", "scanner": "scanner-primary", "fingerprint": "e01c3d26b0a78f26", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-074ccabea8889749", "level": "note", "message": {"text": "Very large file: shinobij.client/src/screens/AdminPanel.tsx (5567 lines)"}, "properties": {"repobilityId": "16352a5f21b53fa3", "scanner": "scanner-primary", "fingerprint": "074ccabea8889749", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c6498b75868d7c65", "level": "note", "message": {"text": "Very large file: shinobij.client/src/screens/WorldMap.tsx (1934 lines)"}, "properties": {"repobilityId": "e3557a246a501ad6", "scanner": "scanner-primary", "fingerprint": "c6498b75868d7c65", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f098951095858c4f", "level": "note", "message": {"text": "Very large file: shinobij.client/src/components/PetColiseum.tsx (2640 lines)"}, "properties": {"repobilityId": "61b21af6ec9b0417", "scanner": "scanner-primary", "fingerprint": "f098951095858c4f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b141785680ffc85a", "level": "note", "message": {"text": "Very large file: shinobij.client/src/lib/pet-arena-sim.ts (1072 lines)"}, "properties": {"repobilityId": "497c079a54c2a597", "scanner": "scanner-primary", "fingerprint": "b141785680ffc85a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0647d79f5a9ab90a", "level": "note", "message": {"text": "Very large file: shinobij.client/src/lib/pet-battle-sim.ts (2780 lines)"}, "properties": {"repobilityId": "6951dfd25f016ebc", "scanner": "scanner-primary", "fingerprint": "0647d79f5a9ab90a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fa9b6c58480d546c", "level": "note", "message": {"text": "Very large file: shinobij.client/src/lib/world-state.ts (1165 lines)"}, "properties": {"repobilityId": "707679cfea763161", "scanner": "scanner-primary", "fingerprint": "fa9b6c58480d546c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2cf47f989aed0568", "level": "note", "message": {"text": "Very large file: api/world-state.ts (882 lines)"}, "properties": {"repobilityId": "d63919e8866af48f", "scanner": "scanner-primary", "fingerprint": "2cf47f989aed0568", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-609ebd81aa68ec34", "level": "note", "message": {"text": "Very large file: api/save/[name].ts (1332 lines)"}, "properties": {"repobilityId": "b095a2c184d4bede", "scanner": "scanner-primary", "fingerprint": "609ebd81aa68ec34", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-37c007a88a86b509", "level": "note", "message": {"text": "Very large file: api/pvp/move.ts (1520 lines)"}, "properties": {"repobilityId": "381475d3e380a75e", "scanner": "scanner-primary", "fingerprint": "37c007a88a86b509", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cb8fbd1c781b5f19", "level": "note", "message": {"text": "Very large file: scripts/pvp-formula-sim.ts (944 lines)"}, "properties": {"repobilityId": "b1e0f8158fecab1f", "scanner": "scanner-primary", "fingerprint": "cb8fbd1c781b5f19", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "cb80e3615869ab2e", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b3ed68815bca2f8c", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: package.json"}, "properties": {"repobilityId": "7edae0550c126386", "scanner": "scanner-primary", "fingerprint": "b3ed68815bca2f8c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "f230333a2a877ede", "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": "127a44323071057c", "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": "21a44411a1f9d809", "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": "3998666ec620eae1", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "3bfbe09400ceae6f", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "512185a1f42a521e", "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": "e34cc96f06177b0e", "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": "39063eccf8f9eec5", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-fbecdd0f890d254a", "level": "none", "message": {"text": "Commented-code block (8 lines) in server.ts:142"}, "properties": {"repobilityId": "13c8b75147b8f75d", "scanner": "scanner-primary", "fingerprint": "fbecdd0f890d254a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f9dcfc7c9e31c959", "level": "none", "message": {"text": "Commented-code block (5 lines) in server-routes.test.ts:70"}, "properties": {"repobilityId": "4aeade06f8ba484c", "scanner": "scanner-primary", "fingerprint": "f9dcfc7c9e31c959", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bd588a71dd0ea77a", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/vite.config.ts:167"}, "properties": {"repobilityId": "4b6c19e3e20e374e", "scanner": "scanner-primary", "fingerprint": "bd588a71dd0ea77a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0d68d2ad88a8f011", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/vite.config.ts:388"}, "properties": {"repobilityId": "a638235f0fb79bf0", "scanner": "scanner-primary", "fingerprint": "0d68d2ad88a8f011", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-76432f75e7b25f31", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/scripts/gen-walkmask.mjs:1"}, "properties": {"repobilityId": "59096d92422fb23e", "scanner": "scanner-primary", "fingerprint": "76432f75e7b25f31", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6d82dc0561b7def7", "level": "none", "message": {"text": "Commented-code block (7 lines) in shinobij.client/scripts/finalize-evo-poses.mjs:3"}, "properties": {"repobilityId": "3fffc52eb9ebd3fc", "scanner": "scanner-primary", "fingerprint": "6d82dc0561b7def7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-85a038ac23e8b34d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-bg.mjs:60"}, "properties": {"repobilityId": "b7a75b8f51f7f253", "scanner": "scanner-primary", "fingerprint": "85a038ac23e8b34d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d8edadb6db17eaa8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-map-flux.mjs:33"}, "properties": {"repobilityId": "da0da1524858a680", "scanner": "scanner-primary", "fingerprint": "d8edadb6db17eaa8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-997fefad89e750ea", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/scripts/gen-asset.mjs:6"}, "properties": {"repobilityId": "a2f488d067d94cc0", "scanner": "scanner-primary", "fingerprint": "997fefad89e750ea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-03b30c0d0078ec2a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-asset.mjs:189"}, "properties": {"repobilityId": "ad62c6812b3a049b", "scanner": "scanner-primary", "fingerprint": "03b30c0d0078ec2a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c85ff3ed70e4ddb3", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/scripts/to-webp.mjs:8"}, "properties": {"repobilityId": "027013c6df61476f", "scanner": "scanner-primary", "fingerprint": "c85ff3ed70e4ddb3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5a0f75e1dc112988", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-sector-depth.mjs:62"}, "properties": {"repobilityId": "7ce669432514f80c", "scanner": "scanner-primary", "fingerprint": "5a0f75e1dc112988", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-df13fb35888c7878", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-pet-anim.mjs:64"}, "properties": {"repobilityId": "4b974ee6affc3729", "scanner": "scanner-primary", "fingerprint": "df13fb35888c7878", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fed110f18498ca99", "level": "none", "message": {"text": "Commented-code block (8 lines) in shinobij.client/scripts/normalize-petbody-facing.mjs:3"}, "properties": {"repobilityId": "182a18ea66d3100a", "scanner": "scanner-primary", "fingerprint": "fed110f18498ca99", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-72cb16795993c2d9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/normalize-petbody-facing.mjs:60"}, "properties": {"repobilityId": "7061391df29a8392", "scanner": "scanner-primary", "fingerprint": "72cb16795993c2d9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ed7b69ae7d2aba87", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/scripts/gen-pet-run.mjs:1"}, "properties": {"repobilityId": "695a166c04b29f1e", "scanner": "scanner-primary", "fingerprint": "ed7b69ae7d2aba87", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ff2f29112a7b6adc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-pet-run.mjs:47"}, "properties": {"repobilityId": "222ae0f93cd6d26e", "scanner": "scanner-primary", "fingerprint": "ff2f29112a7b6adc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7544023807809fc6", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/scripts/gen-pet-3d.mjs:5"}, "properties": {"repobilityId": "1025493009cac667", "scanner": "scanner-primary", "fingerprint": "7544023807809fc6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-030605f215c10045", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-pet-3d.mjs:61"}, "properties": {"repobilityId": "7fb68bb39d3a6091", "scanner": "scanner-primary", "fingerprint": "030605f215c10045", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-02b4be6e2f2eda21", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/scripts/gen-sector-props.mjs:5"}, "properties": {"repobilityId": "03c46eee716f726d", "scanner": "scanner-primary", "fingerprint": "02b4be6e2f2eda21", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0ad0c4b74c054f38", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-sector-props.mjs:91"}, "properties": {"repobilityId": "ee8dd6ce7694c18d", "scanner": "scanner-primary", "fingerprint": "0ad0c4b74c054f38", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-394af19f23cea8c2", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/scripts/gen-pet-battle-sprites.mjs:3"}, "properties": {"repobilityId": "4811f67b70b7e008", "scanner": "scanner-primary", "fingerprint": "394af19f23cea8c2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1abf82ec995f6388", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-pet-battle-sprites.mjs:90"}, "properties": {"repobilityId": "61dab475dc3d65da", "scanner": "scanner-primary", "fingerprint": "1abf82ec995f6388", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-91dadfe36e360e34", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/scripts/gen-sector-foreground.mjs:5"}, "properties": {"repobilityId": "f5b7722529a83c5d", "scanner": "scanner-primary", "fingerprint": "91dadfe36e360e34", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c92c02ad03d7f404", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-sector-foreground.mjs:71"}, "properties": {"repobilityId": "9dca57600053f7ce", "scanner": "scanner-primary", "fingerprint": "c92c02ad03d7f404", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-55d503b3f0591917", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/scripts/gen-ai-opponent-art.mjs:1"}, "properties": {"repobilityId": "3dc02df96813f282", "scanner": "scanner-primary", "fingerprint": "55d503b3f0591917", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e189e52929ba4408", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/scripts/gen-ai-opponent-art.mjs:68"}, "properties": {"repobilityId": "a5e14a20924d63e8", "scanner": "scanner-primary", "fingerprint": "e189e52929ba4408", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6581ef176f620eaa", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/petvfx.tsx:1"}, "properties": {"repobilityId": "2480e81ab55c153f", "scanner": "scanner-primary", "fingerprint": "6581ef176f620eaa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a6ac2657166f87e2", "level": "none", "message": {"text": "Commented-code block (10 lines) in shinobij.client/src/professionLogic.ts:63"}, "properties": {"repobilityId": "519f4565571a8688", "scanner": "scanner-primary", "fingerprint": "a6ac2657166f87e2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-50ff16103687eb2f", "level": "none", "message": {"text": "Commented-code block (8 lines) in shinobij.client/src/authFetch.ts:117"}, "properties": {"repobilityId": "6b505519a775c4fa", "scanner": "scanner-primary", "fingerprint": "50ff16103687eb2f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-29a585e3d96c7800", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/authFetch.ts:9"}, "properties": {"repobilityId": "e11885bda60510e0", "scanner": "scanner-primary", "fingerprint": "29a585e3d96c7800", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-108d13f3e0600ab8", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/App.tsx:168"}, "properties": {"repobilityId": "bf6def4a3407dc37", "scanner": "scanner-primary", "fingerprint": "108d13f3e0600ab8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c8ea40c8171c7603", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/App.tsx:98"}, "properties": {"repobilityId": "038ba7b1d9daf498", "scanner": "scanner-primary", "fingerprint": "c8ea40c8171c7603", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d0bc18a157e9ba7b", "level": "none", "message": {"text": "Commented-code block (7 lines) in shinobij.client/src/App.size.test.ts:15"}, "properties": {"repobilityId": "2f01cd5649ed1143", "scanner": "scanner-primary", "fingerprint": "d0bc18a157e9ba7b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-49178cb5df7ad6c1", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/src/types/pet.ts:32"}, "properties": {"repobilityId": "beca0d4fe43faa64", "scanner": "scanner-primary", "fingerprint": "49178cb5df7ad6c1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e8ea818f2eee2180", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/types/combat.ts:54"}, "properties": {"repobilityId": "7fa32f53c4d63b86", "scanner": "scanner-primary", "fingerprint": "e8ea818f2eee2180", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-adf8b2ebfa43aa9a", "level": "none", "message": {"text": "Commented-code block (7 lines) in shinobij.client/src/types/character.ts:147"}, "properties": {"repobilityId": "22d008ac49894e62", "scanner": "scanner-primary", "fingerprint": "adf8b2ebfa43aa9a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bc979265e018abde", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/screens/PvpBattleScreen.tsx:33"}, "properties": {"repobilityId": "59346c4a94cb1284", "scanner": "scanner-primary", "fingerprint": "bc979265e018abde", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-06dca73f5895dfe2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/PvpBattleScreen.tsx:650"}, "properties": {"repobilityId": "769230a1f23341fe", "scanner": "scanner-primary", "fingerprint": "06dca73f5895dfe2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b8b831497f7bcb83", "level": "none", "message": {"text": "Commented-code block (12 lines) in shinobij.client/src/screens/ShinobiCouncilHall.tsx:239"}, "properties": {"repobilityId": "082bc73aeeb3cddb", "scanner": "scanner-primary", "fingerprint": "b8b831497f7bcb83", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a2a682ecd271b74a", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/screens/ClanHall.tsx:284"}, "properties": {"repobilityId": "76269aeeb045768f", "scanner": "scanner-primary", "fingerprint": "a2a682ecd271b74a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a3911710b3f88eb2", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/src/screens/ProfessionPicker.tsx:80"}, "properties": {"repobilityId": "a6251988f8df3ee0", "scanner": "scanner-primary", "fingerprint": "a3911710b3f88eb2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-00678fd3c2e2307f", "level": "none", "message": {"text": "Commented-code block (8 lines) in shinobij.client/src/screens/AdminDiagnosticsPanel.tsx:7"}, "properties": {"repobilityId": "8ed1aa3cba5ef4c3", "scanner": "scanner-primary", "fingerprint": "00678fd3c2e2307f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a6d1dfdcdd39ad35", "level": "none", "message": {"text": "Commented-code block (7 lines) in shinobij.client/src/screens/PetYard.tsx:106"}, "properties": {"repobilityId": "ae568b23d31e4da4", "scanner": "scanner-primary", "fingerprint": "a6d1dfdcdd39ad35", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b06f7e96b95bcc34", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/PetYard.tsx:206"}, "properties": {"repobilityId": "f35a72a33820b85b", "scanner": "scanner-primary", "fingerprint": "b06f7e96b95bcc34", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6934688f55974ab4", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/screens/AdminLogin.tsx:41"}, "properties": {"repobilityId": "1950e74bee99138a", "scanner": "scanner-primary", "fingerprint": "6934688f55974ab4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ede8064ec7122199", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/src/screens/Arena.tsx:237"}, "properties": {"repobilityId": "1c7b1b69c119b572", "scanner": "scanner-primary", "fingerprint": "ede8064ec7122199", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8cd2d786c1658b6d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/Arena.tsx:352"}, "properties": {"repobilityId": "2b055cf496f9b89d", "scanner": "scanner-primary", "fingerprint": "8cd2d786c1658b6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f76bb2318b0f9a5d", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/src/screens/VillageWarScreen.tsx:127"}, "properties": {"repobilityId": "2d07e796dc838736", "scanner": "scanner-primary", "fingerprint": "f76bb2318b0f9a5d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f1f60f906de4cf9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/VillageWarScreen.tsx:35"}, "properties": {"repobilityId": "0d8d252b28ab7837", "scanner": "scanner-primary", "fingerprint": "1f1f60f906de4cf9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4ee8255da7d71673", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/src/screens/Bank.tsx:38"}, "properties": {"repobilityId": "d58556b560b014b5", "scanner": "scanner-primary", "fingerprint": "4ee8255da7d71673", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8fcccc149b5a4d5b", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/src/screens/PetArena.tsx:244"}, "properties": {"repobilityId": "b05098f519897434", "scanner": "scanner-primary", "fingerprint": "8fcccc149b5a4d5b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d1f67f0cf7e861d7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/PetArena.tsx:719"}, "properties": {"repobilityId": "05d3bd3f0c187267", "scanner": "scanner-primary", "fingerprint": "d1f67f0cf7e861d7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-252a87d617b4556b", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/src/screens/Profile.tsx:69"}, "properties": {"repobilityId": "663080ef646edb44", "scanner": "scanner-primary", "fingerprint": "252a87d617b4556b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2861ce0617bdba4", "level": "none", "message": {"text": "Commented-code block (7 lines) in shinobij.client/src/screens/DailyProfessionMissions.tsx:47"}, "properties": {"repobilityId": "da1e1c742cbe964d", "scanner": "scanner-primary", "fingerprint": "e2861ce0617bdba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f647b0370d33e39", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/Messages.tsx:5"}, "properties": {"repobilityId": "7b19b1dd82c00f65", "scanner": "scanner-primary", "fingerprint": "0f647b0370d33e39", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ae58ac0ef6fbc49e", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/src/screens/Hospital.tsx:56"}, "properties": {"repobilityId": "2648240ac0d0a016", "scanner": "scanner-primary", "fingerprint": "ae58ac0ef6fbc49e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-93daa12f552c84ee", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/screens/Training.tsx:54"}, "properties": {"repobilityId": "fcb76aef0f2a68ad", "scanner": "scanner-primary", "fingerprint": "93daa12f552c84ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-30af589236d4c6ee", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/screens/TownHall.tsx:75"}, "properties": {"repobilityId": "c178f47caf6ff9db", "scanner": "scanner-primary", "fingerprint": "30af589236d4c6ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6e038ef784e15ec9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/TownHall.tsx:115"}, "properties": {"repobilityId": "a2e3b7cbb10f9d1c", "scanner": "scanner-primary", "fingerprint": "6e038ef784e15ec9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cd5a761416f309fd", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/screens/Dungeon.tsx:71"}, "properties": {"repobilityId": "970a1466fa5aa36b", "scanner": "scanner-primary", "fingerprint": "cd5a761416f309fd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2615d24bc2973981", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/src/screens/WeeklyBossArena.tsx:7"}, "properties": {"repobilityId": "c8e054a56a7412f8", "scanner": "scanner-primary", "fingerprint": "2615d24bc2973981", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3f5e03d5507dc5f1", "level": "none", "message": {"text": "Commented-code block (8 lines) in shinobij.client/src/screens/Missions.tsx:48"}, "properties": {"repobilityId": "1b4cd34aeb4d3a5c", "scanner": "scanner-primary", "fingerprint": "3f5e03d5507dc5f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-099f595258b13101", "level": "none", "message": {"text": "Commented-code block (9 lines) in shinobij.client/src/screens/StartScreen.tsx:53"}, "properties": {"repobilityId": "2830062903f06d78", "scanner": "scanner-primary", "fingerprint": "099f595258b13101", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d91eff581e9a1f7f", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/src/screens/CentralHub.tsx:73"}, "properties": {"repobilityId": "01aad239a2399537", "scanner": "scanner-primary", "fingerprint": "d91eff581e9a1f7f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-863410ea125e0b72", "level": "none", "message": {"text": "Commented-code block (8 lines) in shinobij.client/src/screens/AdminPanel.tsx:178"}, "properties": {"repobilityId": "d92ef5da08d427d2", "scanner": "scanner-primary", "fingerprint": "863410ea125e0b72", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3f29246933f5b831", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/AdminPanel.tsx:787"}, "properties": {"repobilityId": "b98e4511b190252f", "scanner": "scanner-primary", "fingerprint": "3f29246933f5b831", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cfb7cd8c02d79c5b", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/screens/ClanBattlesTab.tsx:72"}, "properties": {"repobilityId": "a2c9157f1aa7583b", "scanner": "scanner-primary", "fingerprint": "cfb7cd8c02d79c5b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-44f77d6cfc165e0e", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/screens/WorldMap.tsx:112"}, "properties": {"repobilityId": "d6ddc49f9e8c4c63", "scanner": "scanner-primary", "fingerprint": "44f77d6cfc165e0e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8bbb362eb0abe8ca", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/screens/WorldMap.tsx:425"}, "properties": {"repobilityId": "01c7029e2e305c7f", "scanner": "scanner-primary", "fingerprint": "8bbb362eb0abe8ca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-88f9da2eaf14f07d", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/screens/BloodlineMaker.tsx:222"}, "properties": {"repobilityId": "69b0a18a7827c7b2", "scanner": "scanner-primary", "fingerprint": "88f9da2eaf14f07d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e489d53fff1aa55", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/constants/pet-arena.ts:13"}, "properties": {"repobilityId": "ccbb37d0297a7f1f", "scanner": "scanner-primary", "fingerprint": "1e489d53fff1aa55", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-60051b665052bcf6", "level": "none", "message": {"text": "Commented-code block (8 lines) in shinobij.client/src/components/PetBattleAvatar.tsx:10"}, "properties": {"repobilityId": "ba9f4ff718945a85", "scanner": "scanner-primary", "fingerprint": "60051b665052bcf6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ee30a8f769911cc9", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/components/CombatSideHud.tsx:154"}, "properties": {"repobilityId": "5597326306496701", "scanner": "scanner-primary", "fingerprint": "ee30a8f769911cc9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5ade97cc3776157f", "level": "none", "message": {"text": "Commented-code block (7 lines) in shinobij.client/src/components/SectorScene3D.tsx:26"}, "properties": {"repobilityId": "2d5202c455783a17", "scanner": "scanner-primary", "fingerprint": "5ade97cc3776157f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b1fbd520b1ae51b8", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/components/GameAlert.tsx:109"}, "properties": {"repobilityId": "45f0876e069e2f2b", "scanner": "scanner-primary", "fingerprint": "b1fbd520b1ae51b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54aa8a6bb7bb4225", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/src/components/LeftProfileCard.tsx:34"}, "properties": {"repobilityId": "d5c4121aaf7ade94", "scanner": "scanner-primary", "fingerprint": "54aa8a6bb7bb4225", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d2bf00c820ecda56", "level": "none", "message": {"text": "Commented-code block (7 lines) in shinobij.client/src/components/PetColiseum.tsx:72"}, "properties": {"repobilityId": "f5e5d4686066a4ed", "scanner": "scanner-primary", "fingerprint": "d2bf00c820ecda56", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0575496af0ce896c", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/src/components/SectorScene3DScene.tsx:41"}, "properties": {"repobilityId": "fd5b73950a7be908", "scanner": "scanner-primary", "fingerprint": "0575496af0ce896c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54f632f1880fb864", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/src/components/BattleLockKeeper.tsx:5"}, "properties": {"repobilityId": "9c085259e423c4c0", "scanner": "scanner-primary", "fingerprint": "54f632f1880fb864", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f7231d96a1ec49f", "level": "none", "message": {"text": "Commented-code block (7 lines) in shinobij.client/src/lib/pet-arena-sim.ts:26"}, "properties": {"repobilityId": "0305f45e51304cc1", "scanner": "scanner-primary", "fingerprint": "0f7231d96a1ec49f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-90f943d204e3a027", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/pet-battle-sim.ts:45"}, "properties": {"repobilityId": "2ae0d334f419a1e2", "scanner": "scanner-primary", "fingerprint": "90f943d204e3a027", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-081c8ed82b471f2f", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/pet-arena-sim.test.ts:88"}, "properties": {"repobilityId": "e386e0c44be8f2b8", "scanner": "scanner-primary", "fingerprint": "081c8ed82b471f2f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-da63e2e33973273c", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/src/lib/shared-images.ts:57"}, "properties": {"repobilityId": "462d527ccca0ea0b", "scanner": "scanner-primary", "fingerprint": "da63e2e33973273c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-281aba6fa8c9eb77", "level": "none", "message": {"text": "Commented-code block (9 lines) in shinobij.client/src/lib/pet-balance.ts:56"}, "properties": {"repobilityId": "6be7a2e67e17c304", "scanner": "scanner-primary", "fingerprint": "281aba6fa8c9eb77", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-99573248f6be70bb", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/pet.ts:63"}, "properties": {"repobilityId": "fdce55c6b0875c10", "scanner": "scanner-primary", "fingerprint": "99573248f6be70bb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-39141d1c3080a96a", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/tags.ts:151"}, "properties": {"repobilityId": "c8f72e2bf76ae92b", "scanner": "scanner-primary", "fingerprint": "39141d1c3080a96a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7fb5739f6c186cd4", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/clan-upgrades.ts:41"}, "properties": {"repobilityId": "a563fe647e7e565f", "scanner": "scanner-primary", "fingerprint": "7fb5739f6c186cd4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8affa5e355e32a44", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/jutsu-effects.ts:24"}, "properties": {"repobilityId": "dd7652d04cbc126a", "scanner": "scanner-primary", "fingerprint": "8affa5e355e32a44", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5db6931b23fc9754", "level": "none", "message": {"text": "Commented-code block (7 lines) in shinobij.client/src/lib/pet-duel-sim.ts:4"}, "properties": {"repobilityId": "3acc016fa765533b", "scanner": "scanner-primary", "fingerprint": "5db6931b23fc9754", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5ec699ac84a4f3cd", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/equipment.ts:21"}, "properties": {"repobilityId": "b1a0831ce5e5196f", "scanner": "scanner-primary", "fingerprint": "5ec699ac84a4f3cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e020575ba420d81c", "level": "none", "message": {"text": "Commented-code block (8 lines) in shinobij.client/src/lib/jutsu-scaling.ts:53"}, "properties": {"repobilityId": "4829f62e3b32e37b", "scanner": "scanner-primary", "fingerprint": "e020575ba420d81c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8f588ac0b77acf17", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/src/lib/progression.ts:49"}, "properties": {"repobilityId": "b90c4c04de2939c2", "scanner": "scanner-primary", "fingerprint": "8f588ac0b77acf17", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-42cbc4ca86fd0ea1", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/pet-tactics.ts:61"}, "properties": {"repobilityId": "f30b9991fd7af898", "scanner": "scanner-primary", "fingerprint": "42cbc4ca86fd0ea1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aa95c4270ddc35ac", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/clan-api.ts:20"}, "properties": {"repobilityId": "2c6e2287305251a2", "scanner": "scanner-primary", "fingerprint": "aa95c4270ddc35ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-88af7c377917fb2e", "level": "none", "message": {"text": "Commented-code block (8 lines) in shinobij.client/src/lib/battle-save.ts:8"}, "properties": {"repobilityId": "0eb1401ef230892b", "scanner": "scanner-primary", "fingerprint": "88af7c377917fb2e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d9ff0dcbcd899e69", "level": "none", "message": {"text": "Commented-code block (7 lines) in shinobij.client/src/lib/pet-battle-anim.ts:284"}, "properties": {"repobilityId": "6e31f7c19419080b", "scanner": "scanner-primary", "fingerprint": "d9ff0dcbcd899e69", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-23b8fb6d33db4322", "level": "none", "message": {"text": "Commented-code block (9 lines) in shinobij.client/src/lib/clan-math.ts:59"}, "properties": {"repobilityId": "a5f4270da6be6df8", "scanner": "scanner-primary", "fingerprint": "23b8fb6d33db4322", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-655cc50707e3ae5c", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/src/lib/pet-sfx.ts:1"}, "properties": {"repobilityId": "9edb39c8b457c48f", "scanner": "scanner-primary", "fingerprint": "655cc50707e3ae5c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4a226246f25cf756", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/src/lib/utils.ts:47"}, "properties": {"repobilityId": "90b1803afc7bca5b", "scanner": "scanner-primary", "fingerprint": "4a226246f25cf756", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-874fcffa015ff7c6", "level": "none", "message": {"text": "Commented-code block (8 lines) in shinobij.client/src/lib/jutsu-vfx.ts:66"}, "properties": {"repobilityId": "23c25f62a86b2b5d", "scanner": "scanner-primary", "fingerprint": "874fcffa015ff7c6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4071a87437f785d5", "level": "none", "message": {"text": "Commented-code block (7 lines) in shinobij.client/src/lib/hex-path.ts:1"}, "properties": {"repobilityId": "f195efd9c05db428", "scanner": "scanner-primary", "fingerprint": "4071a87437f785d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-819a6e5e76038744", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/jutsu.ts:18"}, "properties": {"repobilityId": "466394ff6f2381d1", "scanner": "scanner-primary", "fingerprint": "819a6e5e76038744", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3ed1afb2d957c6d6", "level": "none", "message": {"text": "Commented-code block (10 lines) in shinobij.client/src/lib/endless-tower.ts:34"}, "properties": {"repobilityId": "242383b5f5d492fb", "scanner": "scanner-primary", "fingerprint": "3ed1afb2d957c6d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-454bf18cc5726cae", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/screen-guards.ts:76"}, "properties": {"repobilityId": "b8a9d278c6778a60", "scanner": "scanner-primary", "fingerprint": "454bf18cc5726cae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c4f611144b618840", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/pet-roles.ts:64"}, "properties": {"repobilityId": "b6ae8fb31c926b5e", "scanner": "scanner-primary", "fingerprint": "c4f611144b618840", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c9e1500272c35ced", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/src/lib/pet-coliseum-scene.ts:53"}, "properties": {"repobilityId": "2d9ace6355eb235e", "scanner": "scanner-primary", "fingerprint": "c9e1500272c35ced", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-796edcfcbb4462e6", "level": "none", "message": {"text": "Commented-code block (7 lines) in shinobij.client/src/lib/onboarding-step.ts:8"}, "properties": {"repobilityId": "4186bc556f81b337", "scanner": "scanner-primary", "fingerprint": "796edcfcbb4462e6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-744ac9dd5799594e", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/src/lib/combat-math.ts:96"}, "properties": {"repobilityId": "428d506208acde10", "scanner": "scanner-primary", "fingerprint": "744ac9dd5799594e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e0c204b521f0a05", "level": "none", "message": {"text": "Commented-code block (13 lines) in shinobij.client/src/lib/hollow-gate-dungeon.ts:25"}, "properties": {"repobilityId": "af0a74e6bab8cffe", "scanner": "scanner-primary", "fingerprint": "1e0c204b521f0a05", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c69fcf189d5eecb3", "level": "none", "message": {"text": "Commented-code block (7 lines) in shinobij.client/src/lib/perfTelemetry.ts:4"}, "properties": {"repobilityId": "9705b55e0c15d95f", "scanner": "scanner-primary", "fingerprint": "c69fcf189d5eecb3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b4dd37e8392da704", "level": "none", "message": {"text": "Commented-code block (9 lines) in shinobij.client/src/lib/realtime.ts:13"}, "properties": {"repobilityId": "1f9621bd553b2b7c", "scanner": "scanner-primary", "fingerprint": "b4dd37e8392da704", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b6905ddea70c697e", "level": "none", "message": {"text": "Commented-code block (5 lines) in shinobij.client/src/lib/player-api.ts:45"}, "properties": {"repobilityId": "326566c9c00ecfd1", "scanner": "scanner-primary", "fingerprint": "b6905ddea70c697e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-034a8c9c73d64de9", "level": "none", "message": {"text": "Commented-code block (6 lines) in shinobij.client/src/lib/world-state.ts:247"}, "properties": {"repobilityId": "2e25bf6a66d3e4cc", "scanner": "scanner-primary", "fingerprint": "034a8c9c73d64de9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b8368d18fa407bd0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/lib/world-state.ts:703"}, "properties": {"repobilityId": "59c86b43041aec09", "scanner": "scanner-primary", "fingerprint": "b8368d18fa407bd0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-185bab902edca94a", "level": "none", "message": {"text": "Commented-code block (10 lines) in shinobij.client/src/lib/pvp-session.ts:14"}, "properties": {"repobilityId": "d694b2e533f82127", "scanner": "scanner-primary", "fingerprint": "185bab902edca94a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c012f4adb76cee7b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 shinobij.client/src/lib/pvp-session.ts:2"}, "properties": {"repobilityId": "fbec7fbabfd1fb8c", "scanner": "scanner-primary", "fingerprint": "c012f4adb76cee7b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-46cc222791d9b312", "level": "none", "message": {"text": "Commented-code block (9 lines) in api/weekly-boss.ts:7"}, "properties": {"repobilityId": "5d311515c7e3c802", "scanner": "scanner-primary", "fingerprint": "46cc222791d9b312", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5636874aed0e012e", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_map-control-reward.test.ts:5"}, "properties": {"repobilityId": "2f743cee3bd689a7", "scanner": "scanner-primary", "fingerprint": "5636874aed0e012e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-45d4e835be4d8a56", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/generate-image.ts:68"}, "properties": {"repobilityId": "cad8fb10effd909b", "scanner": "scanner-primary", "fingerprint": "45d4e835be4d8a56", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ed0a1998311c4ecd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/generate-image.ts:126"}, "properties": {"repobilityId": "e9948d0c645fa5c4", "scanner": "scanner-primary", "fingerprint": "ed0a1998311c4ecd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9142368253d7ad7d", "level": "none", "message": {"text": "Commented-code block (9 lines) in api/_xp-engine.ts:6"}, "properties": {"repobilityId": "45c0d9aac2a06a7f", "scanner": "scanner-primary", "fingerprint": "9142368253d7ad7d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8aaafa68947d19c2", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/_territory-supply.ts:6"}, "properties": {"repobilityId": "f0f84860b586d908", "scanner": "scanner-primary", "fingerprint": "8aaafa68947d19c2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2e644d33e4ab41cc", "level": "none", "message": {"text": "Commented-code block (8 lines) in api/images.ts:13"}, "properties": {"repobilityId": "3494e3f2cba5018a", "scanner": "scanner-primary", "fingerprint": "2e644d33e4ab41cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-24a707b6bb12d8ec", "level": "none", "message": {"text": "Commented-code block (8 lines) in api/_ratelimit.ts:86"}, "properties": {"repobilityId": "b7aa80d74ac333fa", "scanner": "scanner-primary", "fingerprint": "24a707b6bb12d8ec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e2f2e7c29194a64", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/admin-auth.ts:8"}, "properties": {"repobilityId": "6299989e224d1447", "scanner": "scanner-primary", "fingerprint": "9e2f2e7c29194a64", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e24ed855dabf929b", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_lock.test.ts:5"}, "properties": {"repobilityId": "d67239d67b1de176", "scanner": "scanner-primary", "fingerprint": "e24ed855dabf929b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3a1b53ede464baf3", "level": "none", "message": {"text": "Commented-code block (11 lines) in api/_bank-interest.ts:6"}, "properties": {"repobilityId": "7642c08816a586ab", "scanner": "scanner-primary", "fingerprint": "3a1b53ede464baf3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bda50601681a6c88", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_treasury-donate.test.ts:5"}, "properties": {"repobilityId": "87994e0830521eb1", "scanner": "scanner-primary", "fingerprint": "bda50601681a6c88", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a29922b3b7eb6464", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/_map-control-reward.ts:10"}, "properties": {"repobilityId": "a570d719e0d7363f", "scanner": "scanner-primary", "fingerprint": "a29922b3b7eb6464", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1c9514fa6812e7da", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/_ranked-match-token.test.ts:5"}, "properties": {"repobilityId": "d14cdd4f5ad9a1c1", "scanner": "scanner-primary", "fingerprint": "1c9514fa6812e7da", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f9b27a41a2ebeada", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/_clan-save-validate.test.ts:5"}, "properties": {"repobilityId": "bf16499c4cb2cb9b", "scanner": "scanner-primary", "fingerprint": "f9b27a41a2ebeada", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b168ac13fc1de2d5", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/_village-state-validate.ts:10"}, "properties": {"repobilityId": "fa30d138e8ef2766", "scanner": "scanner-primary", "fingerprint": "b168ac13fc1de2d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-30ebea5d2916a015", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/_xp-engine.test.ts:10"}, "properties": {"repobilityId": "2d6ad0dbc463dc12", "scanner": "scanner-primary", "fingerprint": "30ebea5d2916a015", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5642a22f0308e9e3", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/_lock.ts:90"}, "properties": {"repobilityId": "f406c275b41d92d0", "scanner": "scanner-primary", "fingerprint": "5642a22f0308e9e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7c8facf7de59a47c", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_clan-save-validate.ts:7"}, "properties": {"repobilityId": "077033c71abde9e1", "scanner": "scanner-primary", "fingerprint": "7c8facf7de59a47c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e9a84657c1118638", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/_vercel.d.ts:3"}, "properties": {"repobilityId": "02cbbc6e5cb9eec0", "scanner": "scanner-primary", "fingerprint": "e9a84657c1118638", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-85325be8215ce506", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/img.ts:14"}, "properties": {"repobilityId": "fa7d59dba472aa5b", "scanner": "scanner-primary", "fingerprint": "85325be8215ce506", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-62fd442929108e0d", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/_storage.test.ts:5"}, "properties": {"repobilityId": "a05893f3295e0bd9", "scanner": "scanner-primary", "fingerprint": "62fd442929108e0d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7c83c22ced02def1", "level": "none", "message": {"text": "Commented-code block (8 lines) in api/_treasury-donate.ts:4"}, "properties": {"repobilityId": "9244196f2baa471c", "scanner": "scanner-primary", "fingerprint": "7c83c22ced02def1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3b6f30d661936789", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/_receipts.ts:7"}, "properties": {"repobilityId": "8558465e5f08a745", "scanner": "scanner-primary", "fingerprint": "3b6f30d661936789", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dcd112a6538ae86d", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_auth.ts:41"}, "properties": {"repobilityId": "0017c3a15d93b854", "scanner": "scanner-primary", "fingerprint": "dcd112a6538ae86d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b30a1839a3910b35", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/_asset-registry.ts:7"}, "properties": {"repobilityId": "eabb6af1084b0a19", "scanner": "scanner-primary", "fingerprint": "b30a1839a3910b35", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ab5d132ed96ff243", "level": "note", "message": {"text": "Legacy-named symbol `hashLegacy` in api/player-auth.ts:71"}, "properties": {"repobilityId": "5d8be683d377435c", "scanner": "scanner-primary", "fingerprint": "ab5d132ed96ff243", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ea0fc4e68f0642fd", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/player-auth.ts:9"}, "properties": {"repobilityId": "f7ac1eb7a5c3910c", "scanner": "scanner-primary", "fingerprint": "ea0fc4e68f0642fd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b903df1dc2cdf8b3", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/_storage.ts:23"}, "properties": {"repobilityId": "0d5caa94ba62c162", "scanner": "scanner-primary", "fingerprint": "b903df1dc2cdf8b3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-98c4319b9c92a1b9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_storage.ts:300"}, "properties": {"repobilityId": "a3b1c42f211106b3", "scanner": "scanner-primary", "fingerprint": "98c4319b9c92a1b9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f9e159e78a6dd832", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/game-state.ts:26"}, "properties": {"repobilityId": "912956e1f2fe0a30", "scanner": "scanner-primary", "fingerprint": "f9e159e78a6dd832", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6702e988cc910827", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_combat-formula-parity.test.ts:98"}, "properties": {"repobilityId": "af259b85ca26f86d", "scanner": "scanner-primary", "fingerprint": "6702e988cc910827", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eac99827be2732a7", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_text-moderation.ts:82"}, "properties": {"repobilityId": "6b4b1d0f5d3cda25", "scanner": "scanner-primary", "fingerprint": "eac99827be2732a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-16abbcbe830b06f8", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/perf-beacon.ts:8"}, "properties": {"repobilityId": "a7659c86bf2bc9a2", "scanner": "scanner-primary", "fingerprint": "16abbcbe830b06f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f52db7f3f334bd03", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_village-state-validate.test.ts:5"}, "properties": {"repobilityId": "1d37c71e5bd37705", "scanner": "scanner-primary", "fingerprint": "f52db7f3f334bd03", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1828f7953d2268ee", "level": "none", "message": {"text": "Commented-code block (8 lines) in api/world-state.ts:21"}, "properties": {"repobilityId": "9a1b18b9981b33fe", "scanner": "scanner-primary", "fingerprint": "1828f7953d2268ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec017b81806c4bcf", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_utils.ts:3"}, "properties": {"repobilityId": "d3a52b9d11535906", "scanner": "scanner-primary", "fingerprint": "ec017b81806c4bcf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-249cb5fb1c0e3160", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/player/heal.ts:52"}, "properties": {"repobilityId": "4003f32e6aa9f6a2", "scanner": "scanner-primary", "fingerprint": "249cb5fb1c0e3160", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a6bba676974504e4", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/player/roster.ts:8"}, "properties": {"repobilityId": "154845dfdce10dd8", "scanner": "scanner-primary", "fingerprint": "a6bba676974504e4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f8d4c66a608fb0d", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/player/attack.ts:19"}, "properties": {"repobilityId": "356ee3e4f7af4d73", "scanner": "scanner-primary", "fingerprint": "1f8d4c66a608fb0d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9aad3e6eb9496844", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/player/heartbeat.ts:11"}, "properties": {"repobilityId": "bf01c61befd65552", "scanner": "scanner-primary", "fingerprint": "9aad3e6eb9496844", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e15be3893272a5fd", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/player/challenge.ts:12"}, "properties": {"repobilityId": "4b9f382a95a55494", "scanner": "scanner-primary", "fingerprint": "e15be3893272a5fd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5a5b9f4115ff753b", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/player/friends.ts:8"}, "properties": {"repobilityId": "8478f63ef9fd2a52", "scanner": "scanner-primary", "fingerprint": "5a5b9f4115ff753b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a2217d1cbd33ebc8", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/bloodlines/list.ts:40"}, "properties": {"repobilityId": "fb373a57f37baa9b", "scanner": "scanner-primary", "fingerprint": "a2217d1cbd33ebc8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b5ea2fa90cbad455", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/clans/list.ts:11"}, "properties": {"repobilityId": "e241d0cb9d977b05", "scanner": "scanner-primary", "fingerprint": "b5ea2fa90cbad455", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1da511e55df7056e", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/missions/daily.ts:52"}, "properties": {"repobilityId": "db9ec86405591529", "scanner": "scanner-primary", "fingerprint": "1da511e55df7056e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-38a3120809d00993", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/missions/_mission-catalog.test.ts:13"}, "properties": {"repobilityId": "1cc4b2f144aea61e", "scanner": "scanner-primary", "fingerprint": "38a3120809d00993", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-701c1943daebd1c8", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/missions/report-raid.ts:38"}, "properties": {"repobilityId": "1eafb94ac9348683", "scanner": "scanner-primary", "fingerprint": "701c1943daebd1c8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-99e13374e01cc2d4", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/missions/report-pvp-win.ts:89"}, "properties": {"repobilityId": "9f580ef5a31e7ab7", "scanner": "scanner-primary", "fingerprint": "99e13374e01cc2d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-64b9fe46990f3295", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/missions/report-pet-event.ts:35"}, "properties": {"repobilityId": "39cb573a7cb7d98b", "scanner": "scanner-primary", "fingerprint": "64b9fe46990f3295", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-619fe278d7fdd223", "level": "none", "message": {"text": "Commented-code block (10 lines) in api/missions/_mission-catalog.ts:5"}, "properties": {"repobilityId": "1ceb1bef9cbc05ee", "scanner": "scanner-primary", "fingerprint": "619fe278d7fdd223", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-68b9b9ae156c99b8", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/missions/claim-mission.ts:28"}, "properties": {"repobilityId": "9a7e03f0f6306985", "scanner": "scanner-primary", "fingerprint": "68b9b9ae156c99b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a2c5bd53b02f4d2b", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/missions/_progress.ts:102"}, "properties": {"repobilityId": "cb824052e624023c", "scanner": "scanner-primary", "fingerprint": "a2c5bd53b02f4d2b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0e01ef5d5cc33b42", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/missions/_pool.ts:118"}, "properties": {"repobilityId": "7f043c889b68984c", "scanner": "scanner-primary", "fingerprint": "0e01ef5d5cc33b42", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6117b1891cc2e7a8", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/missions/expedition-start.ts:97"}, "properties": {"repobilityId": "6341eecf6bc59da9", "scanner": "scanner-primary", "fingerprint": "6117b1891cc2e7a8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-85f9def94c1d521e", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/save/[name].ts:54"}, "properties": {"repobilityId": "b242bc28319b5112", "scanner": "scanner-primary", "fingerprint": "85f9def94c1d521e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-76a39f498bafad3c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/save/[name].ts:891"}, "properties": {"repobilityId": "893c75c6a9fff627", "scanner": "scanner-primary", "fingerprint": "76a39f498bafad3c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d97251d5e512b280", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/admin/battle-receipts.ts:9"}, "properties": {"repobilityId": "06b2250b52b2b1f4", "scanner": "scanner-primary", "fingerprint": "d97251d5e512b280", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-93f6cb0735698259", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/admin/asset-report.ts:9"}, "properties": {"repobilityId": "5869ea663149080f", "scanner": "scanner-primary", "fingerprint": "93f6cb0735698259", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-63ca6f446f6f16ff", "level": "none", "message": {"text": "Commented-code block (12 lines) in api/admin/server-reset.ts:20"}, "properties": {"repobilityId": "6e6588a6c319d4ec", "scanner": "scanner-primary", "fingerprint": "63ca6f446f6f16ff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fa3ad27c3ea16cdc", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/admin/bloodline-review.ts:18"}, "properties": {"repobilityId": "33c8f1a95b99689d", "scanner": "scanner-primary", "fingerprint": "fa3ad27c3ea16cdc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7d06297fa8fcf65e", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/admin/moderation.ts:11"}, "properties": {"repobilityId": "ad31f7d0c0549e52", "scanner": "scanner-primary", "fingerprint": "7d06297fa8fcf65e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3307298a842c6d37", "level": "none", "message": {"text": "Commented-code block (8 lines) in api/admin/players.ts:18"}, "properties": {"repobilityId": "ea5cd5ce8ca47fbb", "scanner": "scanner-primary", "fingerprint": "3307298a842c6d37", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8c74a545f39faf71", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/profession/choose.ts:26"}, "properties": {"repobilityId": "29d5feef946612a2", "scanner": "scanner-primary", "fingerprint": "8c74a545f39faf71", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-76001986814ed9a4", "level": "none", "message": {"text": "Commented-code block (10 lines) in api/battle/lock.ts:140"}, "properties": {"repobilityId": "2dbe510193d2bf4e", "scanner": "scanner-primary", "fingerprint": "76001986814ed9a4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ce2ea586d899b06c", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/clan/seal-pool/get.ts:11"}, "properties": {"repobilityId": "767785f3e9302fad", "scanner": "scanner-primary", "fingerprint": "ce2ea586d899b06c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e8ec7bdb710b1420", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/clan/seal-pool/donate.ts:47"}, "properties": {"repobilityId": "849e65d351c4f571", "scanner": "scanner-primary", "fingerprint": "e8ec7bdb710b1420", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c4649193578e801b", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/clan/seal-pool/distribute.ts:91"}, "properties": {"repobilityId": "5c0a0409f6c77aa2", "scanner": "scanner-primary", "fingerprint": "c4649193578e801b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f6be09568c353023", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/clan/war/tilecards.ts:40"}, "properties": {"repobilityId": "c58cc04d0e6eb0c0", "scanner": "scanner-primary", "fingerprint": "f6be09568c353023", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-68a44223f07caf20", "level": "none", "message": {"text": "Commented-code block (16 lines) in api/clan/war/report.ts:55"}, "properties": {"repobilityId": "4fef86bfc0fd8195", "scanner": "scanner-primary", "fingerprint": "68a44223f07caf20", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-06801d001439c277", "level": "none", "message": {"text": "Commented-code block (10 lines) in api/clan/war/challenge.ts:20"}, "properties": {"repobilityId": "835937e27206178b", "scanner": "scanner-primary", "fingerprint": "06801d001439c277", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df5919bbb71ee75a", "level": "none", "message": {"text": "Commented-code block (16 lines) in api/clan/war/declare.ts:22"}, "properties": {"repobilityId": "97db1fb56d4f5e49", "scanner": "scanner-primary", "fingerprint": "df5919bbb71ee75a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2b7033b8bb1f4899", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/clan/war/_storage.ts:6"}, "properties": {"repobilityId": "1e2d9aaf9ed3d105", "scanner": "scanner-primary", "fingerprint": "2b7033b8bb1f4899", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ec2799779b0a815", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/clan/territory/collect-supply.ts:124"}, "properties": {"repobilityId": "e743d4affa9fc68c", "scanner": "scanner-primary", "fingerprint": "9ec2799779b0a815", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54018d6a6ff5835f", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/clan/pet-escort/offer.ts:39"}, "properties": {"repobilityId": "b0d3c670ecd16d08", "scanner": "scanner-primary", "fingerprint": "54018d6a6ff5835f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f9a004f41d0fa2b", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/clan/treasury/donate.ts:37"}, "properties": {"repobilityId": "958e04c45953a5cd", "scanner": "scanner-primary", "fingerprint": "0f9a004f41d0fa2b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-41033d1c97596445", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/cron/snapshot-saves.ts:120"}, "properties": {"repobilityId": "9d1f6d4eb32cefc4", "scanner": "scanner-primary", "fingerprint": "41033d1c97596445", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fcee60f24ccd50b7", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/jutsu/train-with-seals.ts:73"}, "properties": {"repobilityId": "898b82b2741c97af", "scanner": "scanner-primary", "fingerprint": "fcee60f24ccd50b7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a09618e20ada80b1", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/jutsu/speedup.ts:53"}, "properties": {"repobilityId": "74bd7fb11f7180ec", "scanner": "scanner-primary", "fingerprint": "a09618e20ada80b1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8f327c355d747a0f", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/village-guard/challenge.ts:138"}, "properties": {"repobilityId": "d9f44063a9df2960", "scanner": "scanner-primary", "fingerprint": "8f327c355d747a0f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-467593de7748a4a7", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/pvp/ranked-queue.ts:25"}, "properties": {"repobilityId": "38ff825dade5fb57", "scanner": "scanner-primary", "fingerprint": "467593de7748a4a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a5e14b18be23940b", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/pvp/pet-ranked-queue.ts:154"}, "properties": {"repobilityId": "a1702c82a5c3b784", "scanner": "scanner-primary", "fingerprint": "a5e14b18be23940b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a005062a5bf7ee1d", "level": "none", "message": {"text": "Commented-code block (9 lines) in api/pvp/_aoe.ts:4"}, "properties": {"repobilityId": "173f4c2b5ff7f2e0", "scanner": "scanner-primary", "fingerprint": "a005062a5bf7ee1d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e05537885ff6021e", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/pvp/move.ts:20"}, "properties": {"repobilityId": "1ae46fa5d60c5e03", "scanner": "scanner-primary", "fingerprint": "e05537885ff6021e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-66ee82cb793ff2f4", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/pvp/_reward-farm.ts:3"}, "properties": {"repobilityId": "5ded2c6b3bf30f82", "scanner": "scanner-primary", "fingerprint": "66ee82cb793ff2f4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-74da0a7884b4c1a9", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/pvp/stream.ts:9"}, "properties": {"repobilityId": "cd03e066c006182f", "scanner": "scanner-primary", "fingerprint": "74da0a7884b4c1a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1527b6caca0f1c63", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/pvp/session.ts:22"}, "properties": {"repobilityId": "c401cf3dfa207791", "scanner": "scanner-primary", "fingerprint": "1527b6caca0f1c63", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1815d873b50ff6a9", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/pvp/combat-log.ts:11"}, "properties": {"repobilityId": "788f7b79c4e18bfe", "scanner": "scanner-primary", "fingerprint": "1815d873b50ff6a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-013eb674bbdea895", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/pvp/claim-rewards.ts:14"}, "properties": {"repobilityId": "1016e85ea916b7c0", "scanner": "scanner-primary", "fingerprint": "013eb674bbdea895", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-30d4f7eca9198fc2", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/pvp/chat.ts:36"}, "properties": {"repobilityId": "7b41b0f8576d1774", "scanner": "scanner-primary", "fingerprint": "30d4f7eca9198fc2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-28f00982bad215a2", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/pvp/_vanguard-rewards.ts:78"}, "properties": {"repobilityId": "159924174c0bed98", "scanner": "scanner-primary", "fingerprint": "28f00982bad215a2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e38a9ee2c6a87603", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/pvp/_tags.ts:78"}, "properties": {"repobilityId": "bc647bcdc14fc4c8", "scanner": "scanner-primary", "fingerprint": "e38a9ee2c6a87603", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-27374974bca4a291", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/village/claim-daily-agenda.ts:41"}, "properties": {"repobilityId": "578309ff5b9bd71e", "scanner": "scanner-primary", "fingerprint": "27374974bca4a291", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-273450939787f137", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/village/chat.ts:114"}, "properties": {"repobilityId": "21a771f026484915", "scanner": "scanner-primary", "fingerprint": "273450939787f137", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d72cc664043b2b92", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/village/claim-map-control.ts:86"}, "properties": {"repobilityId": "041204d9eab4f107", "scanner": "scanner-primary", "fingerprint": "d72cc664043b2b92", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-07caab6c62eb1f6a", "level": "none", "message": {"text": "Commented-code block (9 lines) in api/village/kage.ts:62"}, "properties": {"repobilityId": "31c0cf1b1d6b9d3b", "scanner": "scanner-primary", "fingerprint": "07caab6c62eb1f6a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3f9e1eacc0ab2b25", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/village/treasury/donate.ts:96"}, "properties": {"repobilityId": "5b1f1da0a878267a", "scanner": "scanner-primary", "fingerprint": "3f9e1eacc0ab2b25", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ee0b6c9ae70300ec", "level": "none", "message": {"text": "Commented-code block (8 lines) in api/village/treasury/transfer.ts:183"}, "properties": {"repobilityId": "7cf5d935d920acb1", "scanner": "scanner-primary", "fingerprint": "ee0b6c9ae70300ec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5146f57fdd387389", "level": "none", "message": {"text": "Commented-code block (9 lines) in api/pet/battle-result.ts:12"}, "properties": {"repobilityId": "55f2117e7c0da650", "scanner": "scanner-primary", "fingerprint": "5146f57fdd387389", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8f77534366b8c8e9", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/pet/evolve.ts:11"}, "properties": {"repobilityId": "20b67b39fe864859", "scanner": "scanner-primary", "fingerprint": "8f77534366b8c8e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8a57df12d7784023", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_realtime/presence-gating.ts:18"}, "properties": {"repobilityId": "3222aacb646dda14", "scanner": "scanner-primary", "fingerprint": "8a57df12d7784023", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c91492ff35d55af5", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_realtime/socket.ts:30"}, "properties": {"repobilityId": "15ee7338396ac4af", "scanner": "scanner-primary", "fingerprint": "c91492ff35d55af5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ccb85b8c041c2cfb", "level": "none", "message": {"text": "Commented-code block (9 lines) in api/_realtime/presence-input.ts:33"}, "properties": {"repobilityId": "28920fad2ef86c92", "scanner": "scanner-primary", "fingerprint": "ccb85b8c041c2cfb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-94f83edf5c75ef64", "level": "none", "message": {"text": "Commented-code block (8 lines) in scripts/pvp-formula-sim.ts:586"}, "properties": {"repobilityId": "67d7260713557b2a", "scanner": "scanner-primary", "fingerprint": "94f83edf5c75ef64", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-23243ba8e2944e8f", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/backfill-asset-meta.mjs:3"}, "properties": {"repobilityId": "9073b7b83d5a94ab", "scanner": "scanner-primary", "fingerprint": "23243ba8e2944e8f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2e190065b8670bf", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/derive-pet-battle-sprites.mjs:134"}, "properties": {"repobilityId": "ce4791d278f467b5", "scanner": "scanner-primary", "fingerprint": "f2e190065b8670bf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f3f102042c75dc12", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/slice-battle-vfx.mjs:11"}, "properties": {"repobilityId": "0ebeec5db976d375", "scanner": "scanner-primary", "fingerprint": "f3f102042c75dc12", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8a2e5e001070876a", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/jutsu-catalog-gen.mjs:32"}, "properties": {"repobilityId": "20337ac1f33d1bdc", "scanner": "scanner-primary", "fingerprint": "8a2e5e001070876a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-04d3728096f6c81a", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/slice-badges.mjs:3"}, "properties": {"repobilityId": "c1522f0ebf8aa4d8", "scanner": "scanner-primary", "fingerprint": "04d3728096f6c81a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e4aea50f19646895", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/check-images.mjs:4"}, "properties": {"repobilityId": "4d2edaacd5228398", "scanner": "scanner-primary", "fingerprint": "e4aea50f19646895", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-64bc033a45ab26f1", "level": "note", "message": {"text": "34 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "dab9f6f977f9c414", "scanner": "scanner-primary", "fingerprint": "64bc033a45ab26f1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-5dd5f1c6598d4007", "level": "error", "message": {"text": "Dangling fetch: POST https://fal.run/${model} (shinobij.client/scripts/gen-bg.mjs:60)"}, "properties": {"repobilityId": "7f07f1874e9c3557", "scanner": "scanner-primary", "fingerprint": "5dd5f1c6598d4007", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5cf81c25c9aab5cc", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/generations (shinobij.client/scripts/gen-bg.mjs:76)"}, "properties": {"repobilityId": "b325ae36d650239c", "scanner": "scanner-primary", "fingerprint": "5cf81c25c9aab5cc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c12941afe79c9843", "level": "error", "message": {"text": "Dangling fetch: POST https://fal.run/${model} (shinobij.client/scripts/gen-map-flux.mjs:33)"}, "properties": {"repobilityId": "a86dc4fae41a8e44", "scanner": "scanner-primary", "fingerprint": "c12941afe79c9843", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-33e5a0cffef634c3", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/generations (shinobij.client/scripts/gen-asset.mjs:189)"}, "properties": {"repobilityId": "656da90f4a4e1e79", "scanner": "scanner-primary", "fingerprint": "33e5a0cffef634c3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-21e0e7e5ace0a661", "level": "error", "message": {"text": "Dangling fetch: POST https://fal.run/fal-ai/image-preprocessors/depth-anything/v2 (shinobij.client/scripts/gen-sector-depth.mjs:62)"}, "properties": {"repobilityId": "7f3b090c13a3988b", "scanner": "scanner-primary", "fingerprint": "21e0e7e5ace0a661", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e447b418ea64af28", "level": "error", "message": {"text": "Dangling fetch: POST https://fal.run/fal-ai/nano-banana/edit (shinobij.client/scripts/gen-pet-anim.mjs:64)"}, "properties": {"repobilityId": "117238deb9c31e7d", "scanner": "scanner-primary", "fingerprint": "e447b418ea64af28", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ffcc11c052fb8578", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (shinobij.client/scripts/normalize-petbody-facing.mjs:60)"}, "properties": {"repobilityId": "68dea39d8ad662c9", "scanner": "scanner-primary", "fingerprint": "ffcc11c052fb8578", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bd9e638f5b0e0058", "level": "error", "message": {"text": "Dangling fetch: POST https://fal.run/fal-ai/nano-banana/edit (shinobij.client/scripts/gen-pet-run.mjs:47)"}, "properties": {"repobilityId": "68858d14d0e3e825", "scanner": "scanner-primary", "fingerprint": "bd9e638f5b0e0058", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5a4857acb248076a", "level": "error", "message": {"text": "Dangling fetch: POST https://fal.run/fal-ai/hunyuan3d/v2 (shinobij.client/scripts/gen-pet-3d.mjs:61)"}, "properties": {"repobilityId": "af4b9f7a3de0da42", "scanner": "scanner-primary", "fingerprint": "5a4857acb248076a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7833be5cfe674199", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/generations (shinobij.client/scripts/gen-sector-props.mjs:91)"}, "properties": {"repobilityId": "548840c1930d4b85", "scanner": "scanner-primary", "fingerprint": "7833be5cfe674199", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-88ca4b383cc72ec5", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/edits (shinobij.client/scripts/gen-pet-battle-sprites.mjs:121)"}, "properties": {"repobilityId": "2bb47bba8527bc97", "scanner": "scanner-primary", "fingerprint": "88ca4b383cc72ec5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-16ccd2c5374d203f", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/generations (shinobij.client/scripts/gen-sector-foreground.mjs:71)"}, "properties": {"repobilityId": "2e2745d99d9a3b74", "scanner": "scanner-primary", "fingerprint": "16ccd2c5374d203f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e12e7cfe226a224b", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/generations (shinobij.client/scripts/gen-ai-opponent-art.mjs:74)"}, "properties": {"repobilityId": "17b3efa9731850e7", "scanner": "scanner-primary", "fingerprint": "e12e7cfe226a224b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4c33832dff1c1022", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/generations (shinobij.client/vite.config.ts:388)"}, "properties": {"repobilityId": "5cf2077c4af268ea", "scanner": "scanner-primary", "fingerprint": "4c33832dff1c1022", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3198a945ca70f3d6", "level": "error", "message": {"text": "Dangling fetch: GET /api/save/... (shinobij.client/src/authFetch.ts:30)"}, "properties": {"repobilityId": "d5c6c58daec96d8b", "scanner": "scanner-primary", "fingerprint": "3198a945ca70f3d6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d024539a70ce4275", "level": "error", "message": {"text": "Dangling fetch: GET /api/... (shinobij.client/src/App.tsx:98)"}, "properties": {"repobilityId": "a5784cee1db69301", "scanner": "scanner-primary", "fingerprint": "d024539a70ce4275", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d1a1af17f2263405", "level": "error", "message": {"text": "Dangling fetch: POST /api/missions/raid-start (shinobij.client/src/App.tsx:2412)"}, "properties": {"repobilityId": "d2929bc19dbe5ff9", "scanner": "scanner-primary", "fingerprint": "d1a1af17f2263405", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dc9ecd0b40852d87", "level": "error", "message": {"text": "Dangling fetch: POST /api/clan/war/report (shinobij.client/src/App.tsx:2561)"}, "properties": {"repobilityId": "37dd872b9be3a3a5", "scanner": "scanner-primary", "fingerprint": "dc9ecd0b40852d87", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6168a87ad459425a", "level": "error", "message": {"text": "Dangling fetch: POST /api/clan/war/tilecards (shinobij.client/src/App.tsx:2654)"}, "properties": {"repobilityId": "6ded2a17790c897b", "scanner": "scanner-primary", "fingerprint": "6168a87ad459425a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8efe329ea4ab4b20", "level": "error", "message": {"text": "Dangling fetch: POST /api/save/${encodeURIComponent(accountName)}?ack=1 (shinobij.client/src/App.tsx:2861)"}, "properties": {"repobilityId": "6e193729328e5c3a", "scanner": "scanner-primary", "fingerprint": "8efe329ea4ab4b20", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8b46bd5a5277d686", "level": "error", "message": {"text": "Dangling fetch: GET /api/save/${encodeURIComponent(accountName)} (shinobij.client/src/App.tsx:2864)"}, "properties": {"repobilityId": "fd333fa93ec234d1", "scanner": "scanner-primary", "fingerprint": "8b46bd5a5277d686", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-661d3ee53ee63334", "level": "error", "message": {"text": "Dangling fetch: POST /api/save/${encodeURIComponent(accountName)}?ack=1 (shinobij.client/src/App.tsx:2870)"}, "properties": {"repobilityId": "5fa0b70d89ebc604", "scanner": "scanner-primary", "fingerprint": "661d3ee53ee63334", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-334a00635ffe7b89", "level": "error", "message": {"text": "Dangling fetch: POST /api/save/${encodeURIComponent(accountName)}?ack=1 (shinobij.client/src/App.tsx:2883)"}, "properties": {"repobilityId": "a340911b86d5a9a3", "scanner": "scanner-primary", "fingerprint": "334a00635ffe7b89", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2b3484c4518aeaf0", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/player/challenge (shinobij.client/src/App.tsx:3008)"}, "properties": {"repobilityId": "7270c02bfb787e7b", "scanner": "scanner-primary", "fingerprint": "2b3484c4518aeaf0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-36af2cb4df6cf78a", "level": "error", "message": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/App.tsx:3022)"}, "properties": {"repobilityId": "fb8ca9fdb165c8a9", "scanner": "scanner-primary", "fingerprint": "36af2cb4df6cf78a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3437c15db746028c", "level": "error", "message": {"text": "Dangling fetch: GET /api/player/roster (shinobij.client/src/App.tsx:3149)"}, "properties": {"repobilityId": "9dbc2b2ad4460f46", "scanner": "scanner-primary", "fingerprint": "3437c15db746028c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a6cbae11a14ca6dc", "level": "error", "message": {"text": "Dangling fetch: GET /api/bloodlines/list (shinobij.client/src/App.tsx:3198)"}, "properties": {"repobilityId": "964887b9d5d6b57a", "scanner": "scanner-primary", "fingerprint": "a6cbae11a14ca6dc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c21ae7846a147b9b", "level": "error", "message": {"text": "Dangling fetch: POST /api/pvp/session (shinobij.client/src/App.tsx:3351)"}, "properties": {"repobilityId": "464e822d6b257f61", "scanner": "scanner-primary", "fingerprint": "c21ae7846a147b9b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e689c7a0c8dc4bd4", "level": "error", "message": {"text": "Dangling fetch: GET /api/pvp/session?id=${encodeURIComponent(parsed.pvpBattleId)} (shinobij.client/src/App.tsx:3511)"}, "properties": {"repobilityId": "47a601703eb3e58a", "scanner": "scanner-primary", "fingerprint": "e689c7a0c8dc4bd4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3147ea4bd5592e1d", "level": "error", "message": {"text": "Dangling fetch: POST /api/save/${encodeURIComponent(name.toLowerCase())} (shinobij.client/src/App.tsx:3916)"}, "properties": {"repobilityId": "053bec8b03b2cc1e", "scanner": "scanner-primary", "fingerprint": "3147ea4bd5592e1d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eefad1ad16803946", "level": "error", "message": {"text": "Dangling fetch: POST /api/player-auth (shinobij.client/src/App.tsx:3951)"}, "properties": {"repobilityId": "0891a194cb8f77a9", "scanner": "scanner-primary", "fingerprint": "eefad1ad16803946", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-139058d4e6eff18c", "level": "error", "message": {"text": "Dangling fetch: GET /api/save/${encodeURIComponent(name.toLowerCase())} (shinobij.client/src/App.tsx:4009)"}, "properties": {"repobilityId": "ceefab1705b051c9", "scanner": "scanner-primary", "fingerprint": "139058d4e6eff18c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b32244cb92ed4128", "level": "error", "message": {"text": "Dangling fetch: GET /api/images?cat=${encodeURIComponent(cat)}&ids=1&cb=${cb} (shinobij.client/src/App.tsx:4527)"}, "properties": {"repobilityId": "58bcd2363bf7599a", "scanner": "scanner-primary", "fingerprint": "b32244cb92ed4128", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d1b74d3437393dbc", "level": "error", "message": {"text": "Dangling fetch: GET /api/images?cat=${encodeURIComponent(cat)}&cb=${cb} (shinobij.client/src/App.tsx:4536)"}, "properties": {"repobilityId": "b58acd51f92d8018", "scanner": "scanner-primary", "fingerprint": "d1b74d3437393dbc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8e4448b823e0f86d", "level": "error", "message": {"text": "Dangling fetch: GET /api/save/${encodeURIComponent(accountName.toLowerCase())} (shinobij.client/src/App.tsx:4777)"}, "properties": {"repobilityId": "b5ec65e424733060", "scanner": "scanner-primary", "fingerprint": "8e4448b823e0f86d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f3e35ea66f1b8dbe", "level": "error", "message": {"text": "Dangling fetch: POST /api/save/${encodeURIComponent(accountName.toLowerCase())} (shinobij.client/src/App.tsx:4802)"}, "properties": {"repobilityId": "ecefc2db37b02cf0", "scanner": "scanner-primary", "fingerprint": "f3e35ea66f1b8dbe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-45c20dbb721539ba", "level": "error", "message": {"text": "Dangling fetch: POST /api/save/${encodeURIComponent(snap.name.toLowerCase())} (shinobij.client/src/App.tsx:4954)"}, "properties": {"repobilityId": "d6d07ebbf57cedcc", "scanner": "scanner-primary", "fingerprint": "45c20dbb721539ba", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f05854db650a9ece", "level": "error", "message": {"text": "Dangling fetch: POST /api/player-auth (shinobij.client/src/App.tsx:4969)"}, "properties": {"repobilityId": "f3fc77f9ca3ce902", "scanner": "scanner-primary", "fingerprint": "f05854db650a9ece", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3ccb51b5aba16433", "level": "error", "message": {"text": "Dangling fetch: POST /api/player-auth (shinobij.client/src/App.tsx:5182)"}, "properties": {"repobilityId": "0a94ecaf8bb2a23b", "scanner": "scanner-primary", "fingerprint": "3ccb51b5aba16433", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b547dff2635782e3", "level": "error", "message": {"text": "Dangling fetch: POST /api/player-auth (shinobij.client/src/App.tsx:5247)"}, "properties": {"repobilityId": "54b02c2175eb4ed9", "scanner": "scanner-primary", "fingerprint": "b547dff2635782e3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f673f825c2292fbc", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/save/${encodeURIComponent(accountName.toLowerCase())} (shinobij.client/src/App.tsx:5273)"}, "properties": {"repobilityId": "86ae5ec2d453d8e2", "scanner": "scanner-primary", "fingerprint": "f673f825c2292fbc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3b3f2c0bea05f920", "level": "error", "message": {"text": "Dangling fetch: POST /api/player-auth (shinobij.client/src/App.tsx:5278)"}, "properties": {"repobilityId": "22f318bcd7d36af6", "scanner": "scanner-primary", "fingerprint": "3b3f2c0bea05f920", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-da137a81b61e135c", "level": "error", "message": {"text": "Dangling fetch: POST /api/missions/report-raid (shinobij.client/src/App.tsx:5406)"}, "properties": {"repobilityId": "d973da186e817667", "scanner": "scanner-primary", "fingerprint": "da137a81b61e135c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1c49d79bded97cb4", "level": "error", "message": {"text": "Dangling fetch: POST /api/weekly-boss (shinobij.client/src/App.tsx:5955)"}, "properties": {"repobilityId": "7c82072481198582", "scanner": "scanner-primary", "fingerprint": "1c49d79bded97cb4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ba41c2021edfe084", "level": "error", "message": {"text": "Dangling fetch: POST /api/pvp/session (shinobij.client/src/App.tsx:8690)"}, "properties": {"repobilityId": "7cdfb62ec7576b9d", "scanner": "scanner-primary", "fingerprint": "ba41c2021edfe084", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1325d30a0a5ed8ab", "level": "error", "message": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/App.tsx:8758)"}, "properties": {"repobilityId": "fe6f3f48de9b39e0", "scanner": "scanner-primary", "fingerprint": "1325d30a0a5ed8ab", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6da86a1ed913f086", "level": "error", "message": {"text": "Dangling fetch: POST /api/village/kage (shinobij.client/src/App.tsx:9046)"}, "properties": {"repobilityId": "c17f2ded6520e4a8", "scanner": "scanner-primary", "fingerprint": "6da86a1ed913f086", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-34784e4c414affa8", "level": "error", "message": {"text": "Dangling fetch: GET /api/save/${encodeURIComponent(character.name)} (shinobij.client/src/App.tsx:9112)"}, "properties": {"repobilityId": "3e6e4566a44c3ea0", "scanner": "scanner-primary", "fingerprint": "34784e4c414affa8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-08ca877bc5efa3d7", "level": "error", "message": {"text": "Dangling fetch: POST /api/missions/report-pvp-win (shinobij.client/src/App.tsx:9151)"}, "properties": {"repobilityId": "e44153cddcf9c8f4", "scanner": "scanner-primary", "fingerprint": "08ca877bc5efa3d7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3edd16c9b6e3722d", "level": "error", "message": {"text": "Dangling fetch: GET /api/pvp/session?id=${encodeURIComponent(battleId)} (shinobij.client/src/screens/PvpBattleScreen.tsx:235)"}, "properties": {"repobilityId": "193dd8df01867b50", "scanner": "scanner-primary", "fingerprint": "3edd16c9b6e3722d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2fe45e19f2501c7b", "level": "error", "message": {"text": "Dangling fetch: GET /api/pvp/session?id=${encodeURIComponent(battleId)} (shinobij.client/src/screens/PvpBattleScreen.tsx:254)"}, "properties": {"repobilityId": "95ab343b9d680bbb", "scanner": "scanner-primary", "fingerprint": "2fe45e19f2501c7b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a4166406098e22ba", "level": "error", "message": {"text": "Dangling fetch: POST /api/pvp/claim-rewards (shinobij.client/src/screens/PvpBattleScreen.tsx:497)"}, "properties": {"repobilityId": "be92e2db44719881", "scanner": "scanner-primary", "fingerprint": "a4166406098e22ba", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-748b66a9090cd9fa", "level": "error", "message": {"text": "Dangling fetch: GET /api/pvp/chat?id=${encodeURIComponent(battleId)} (shinobij.client/src/screens/PvpBattleScreen.tsx:627)"}, "properties": {"repobilityId": "64b19ccc0d65e358", "scanner": "scanner-primary", "fingerprint": "748b66a9090cd9fa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dca54bca73e8a4e5", "level": "error", "message": {"text": "Dangling fetch: POST /api/pvp/chat?id=${encodeURIComponent(battleId)} (shinobij.client/src/screens/PvpBattleScreen.tsx:650)"}, "properties": {"repobilityId": "81d12c74ba4b3889", "scanner": "scanner-primary", "fingerprint": "dca54bca73e8a4e5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a9041f484061f67c", "level": "error", "message": {"text": "Dangling fetch: GET /api/pvp/spectate?id=${encodeURIComponent(battleId)} (shinobij.client/src/screens/PvpBattleScreen.tsx:672)"}, "properties": {"repobilityId": "8a02fb35693d7b60", "scanner": "scanner-primary", "fingerprint": "a9041f484061f67c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3f5ea79a80ad840b", "level": "error", "message": {"text": "Dangling fetch: POST /api/pvp/move (shinobij.client/src/screens/PvpBattleScreen.tsx:921)"}, "properties": {"repobilityId": "7edd926c37a2e326", "scanner": "scanner-primary", "fingerprint": "3f5ea79a80ad840b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-11e77e5455edd6e1", "level": "error", "message": {"text": "Dangling fetch: GET /api/clans/list (shinobij.client/src/screens/ClanHall.tsx:77)"}, "properties": {"repobilityId": "77b04d9ee3bbe615", "scanner": "scanner-primary", "fingerprint": "11e77e5455edd6e1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-865fb14a9b787e34", "level": "error", "message": {"text": "Dangling fetch: POST /api/village-guard/list (shinobij.client/src/screens/ClanHall.tsx:139)"}, "properties": {"repobilityId": "d826c5bb15ecb3fc", "scanner": "scanner-primary", "fingerprint": "865fb14a9b787e34", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0c9dad094eb54ba0", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/save/${clanSlug(character.clan)} (shinobij.client/src/screens/ClanHall.tsx:235)"}, "properties": {"repobilityId": "1c3fa2a83fd19f6f", "scanner": "scanner-primary", "fingerprint": "0c9dad094eb54ba0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d6d688bf507bc4e3", "level": "error", "message": {"text": "Dangling fetch: POST /api/clan/treasury/transfer (shinobij.client/src/screens/ClanHall.tsx:290)"}, "properties": {"repobilityId": "92e0f6458a786035", "scanner": "scanner-primary", "fingerprint": "d6d688bf507bc4e3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b4dda806607b8c2a", "level": "error", "message": {"text": "Dangling fetch: POST /api/clan/treasury/transfer (shinobij.client/src/screens/ClanHall.tsx:318)"}, "properties": {"repobilityId": "bfdc5273d01402f2", "scanner": "scanner-primary", "fingerprint": "b4dda806607b8c2a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0345f972d41e8519", "level": "error", "message": {"text": "Dangling fetch: POST /api/clan/territory/collect-supply (shinobij.client/src/screens/ClanHall.tsx:362)"}, "properties": {"repobilityId": "235f78eee9709fd8", "scanner": "scanner-primary", "fingerprint": "0345f972d41e8519", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6e8c5ed7da79cca8", "level": "error", "message": {"text": "Dangling fetch: POST /api/profession/choose (shinobij.client/src/screens/ProfessionPicker.tsx:97)"}, "properties": {"repobilityId": "fd7b2cc2e180d3b0", "scanner": "scanner-primary", "fingerprint": "6e8c5ed7da79cca8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8e95968230272b43", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/battle-receipts?battleId=${encodeURIComponent(id)} (shinobij.client/src/screens/AdminDiagnosticsPanel.tsx:75)"}, "properties": {"repobilityId": "2dbfd4cd70b31947", "scanner": "scanner-primary", "fingerprint": "8e95968230272b43", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-928542d1a11c1cc3", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/asset-report (shinobij.client/src/screens/AdminDiagnosticsPanel.tsx:95)"}, "properties": {"repobilityId": "01c4c8ed0b19afe5", "scanner": "scanner-primary", "fingerprint": "928542d1a11c1cc3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-635794cb08646493", "level": "error", "message": {"text": "Dangling fetch: GET /api/images?cat=${s.cat}&ids=1 (shinobij.client/src/screens/AdminDiagnosticsPanel.tsx:104)"}, "properties": {"repobilityId": "51c14366568f0f94", "scanner": "scanner-primary", "fingerprint": "635794cb08646493", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d9850c315e21692e", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/audit-log?domain=${domain}&limit=200 (shinobij.client/src/screens/AdminDiagnosticsPanel.tsx:135)"}, "properties": {"repobilityId": "c22f0f7f360d1a7e", "scanner": "scanner-primary", "fingerprint": "d9850c315e21692e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1ead5d0fed0682fa", "level": "error", "message": {"text": "Dangling fetch: POST /api/missions/expedition-start (shinobij.client/src/screens/PetYard.tsx:117)"}, "properties": {"repobilityId": "023e99f2e5e216d3", "scanner": "scanner-primary", "fingerprint": "1ead5d0fed0682fa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4f962ba0ad617a9d", "level": "error", "message": {"text": "Dangling fetch: POST /api/missions/report-pet-event (shinobij.client/src/screens/PetYard.tsx:206)"}, "properties": {"repobilityId": "e754ab0f1f44b1cc", "scanner": "scanner-primary", "fingerprint": "4f962ba0ad617a9d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-964287dc87b20685", "level": "error", "message": {"text": "Dangling fetch: POST /api/missions/report-pet-event (shinobij.client/src/screens/PetYard.tsx:270)"}, "properties": {"repobilityId": "b9d80de6f23898ef", "scanner": "scanner-primary", "fingerprint": "964287dc87b20685", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5861ec4494440998", "level": "error", "message": {"text": "Dangling fetch: POST /api/pet/evolve (shinobij.client/src/screens/PetYard.tsx:421)"}, "properties": {"repobilityId": "4737706d943a8e35", "scanner": "scanner-primary", "fingerprint": "5861ec4494440998", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0dfc289f435618e1", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin-auth (shinobij.client/src/screens/AdminLogin.tsx:29)"}, "properties": {"repobilityId": "f97ef0a8b1d2539f", "scanner": "scanner-primary", "fingerprint": "0dfc289f435618e1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9e54e8f9ca3e76af", "level": "error", "message": {"text": "Dangling fetch: POST /api/player-auth (shinobij.client/src/screens/AdminLogin.tsx:110)"}, "properties": {"repobilityId": "06687fcb30e82488", "scanner": "scanner-primary", "fingerprint": "9e54e8f9ca3e76af", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-685d815a58868740", "level": "error", "message": {"text": "Dangling fetch: POST /api/player-auth (shinobij.client/src/screens/AdminLogin.tsx:148)"}, "properties": {"repobilityId": "4d23e3dd1715c658", "scanner": "scanner-primary", "fingerprint": "685d815a58868740", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9629237a68a04514", "level": "error", "message": {"text": "Dangling fetch: POST /api/pvp/ranked-queue (shinobij.client/src/screens/Arena.tsx:352)"}, "properties": {"repobilityId": "6ef22f79d1279763", "scanner": "scanner-primary", "fingerprint": "9629237a68a04514", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-54ca0b83f350568d", "level": "error", "message": {"text": "Dangling fetch: POST /api/pvp/ranked-queue (shinobij.client/src/screens/Arena.tsx:388)"}, "properties": {"repobilityId": "a8d9aa1c71a56afe", "scanner": "scanner-primary", "fingerprint": "54ca0b83f350568d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-89b5e3d69996e306", "level": "error", "message": {"text": "Dangling fetch: POST /api/pvp/ranked-queue (shinobij.client/src/screens/Arena.tsx:409)"}, "properties": {"repobilityId": "d53ea9d54f6f27b6", "scanner": "scanner-primary", "fingerprint": "89b5e3d69996e306", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3e1d6eb84beac0a7", "level": "error", "message": {"text": "Dangling fetch: POST /api/pvp/pet-ranked-queue (shinobij.client/src/screens/Arena.tsx:428)"}, "properties": {"repobilityId": "219d3b61f626e488", "scanner": "scanner-primary", "fingerprint": "3e1d6eb84beac0a7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b3a5893962b0c649", "level": "error", "message": {"text": "Dangling fetch: POST /api/pvp/pet-ranked-queue (shinobij.client/src/screens/Arena.tsx:466)"}, "properties": {"repobilityId": "9214a9ab37257cc9", "scanner": "scanner-primary", "fingerprint": "b3a5893962b0c649", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ed42424128956237", "level": "error", "message": {"text": "Dangling fetch: POST /api/pvp/pet-ranked-queue (shinobij.client/src/screens/Arena.tsx:478)"}, "properties": {"repobilityId": "3c6992db305eda1b", "scanner": "scanner-primary", "fingerprint": "ed42424128956237", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a47d40de10a5422e", "level": "error", "message": {"text": "Dangling fetch: POST /api/pet/ranked-start (shinobij.client/src/screens/Arena.tsx:871)"}, "properties": {"repobilityId": "8b752b4431758672", "scanner": "scanner-primary", "fingerprint": "a47d40de10a5422e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ce4b8bf279559e66", "level": "error", "message": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/Arena.tsx:897)"}, "properties": {"repobilityId": "bb2be62d65b26a25", "scanner": "scanner-primary", "fingerprint": "ce4b8bf279559e66", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-50e9fdd95573e84f", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/player/challenge (shinobij.client/src/screens/Arena.tsx:928)"}, "properties": {"repobilityId": "4042be32e5fa5e58", "scanner": "scanner-primary", "fingerprint": "50e9fdd95573e84f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ce85c80b056e78d1", "level": "error", "message": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/Arena.tsx:933)"}, "properties": {"repobilityId": "12e8b2087a4ec654", "scanner": "scanner-primary", "fingerprint": "ce85c80b056e78d1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6896742635d94144", "level": "error", "message": {"text": "Dangling fetch: POST /api/pvp/session (shinobij.client/src/screens/Arena.tsx:966)"}, "properties": {"repobilityId": "31d953de51047075", "scanner": "scanner-primary", "fingerprint": "6896742635d94144", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6c133308542c40c9", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/player/challenge (shinobij.client/src/screens/Arena.tsx:3862)"}, "properties": {"repobilityId": "9dea7b15eb35c5c0", "scanner": "scanner-primary", "fingerprint": "6c133308542c40c9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f1b05129d8bf4c44", "level": "error", "message": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/Arena.tsx:3867)"}, "properties": {"repobilityId": "e52bb8599624b0b6", "scanner": "scanner-primary", "fingerprint": "f1b05129d8bf4c44", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1fcb31f9a5bdbad2", "level": "error", "message": {"text": "Dangling fetch: POST /api/pvp/spectate?id=${encodeURIComponent(fight.battleId)} (shinobij.client/src/screens/Arena.tsx:3948)"}, "properties": {"repobilityId": "fc1dce1a489ff503", "scanner": "scanner-primary", "fingerprint": "1fcb31f9a5bdbad2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0f0d29c626069511", "level": "error", "message": {"text": "Dangling fetch: GET /api/game-state (shinobij.client/src/screens/VillageWarScreen.tsx:35)"}, "properties": {"repobilityId": "ccd222f0cd07586e", "scanner": "scanner-primary", "fingerprint": "0f0d29c626069511", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-37caa671b8fc80eb", "level": "error", "message": {"text": "Dangling fetch: GET /api/world-state (shinobij.client/src/screens/VillageWarScreen.tsx:46)"}, "properties": {"repobilityId": "74a3e8a5cb3417c7", "scanner": "scanner-primary", "fingerprint": "37caa671b8fc80eb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-550edec6d8204d82", "level": "error", "message": {"text": "Dangling fetch: POST /api/world-state (shinobij.client/src/screens/VillageWarScreen.tsx:69)"}, "properties": {"repobilityId": "954991fbc20c1cff", "scanner": "scanner-primary", "fingerprint": "550edec6d8204d82", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ebf65527803258eb", "level": "error", "message": {"text": "Dangling fetch: POST /api/world-state (shinobij.client/src/screens/VillageWarScreen.tsx:94)"}, "properties": {"repobilityId": "764161b23c6278ba", "scanner": "scanner-primary", "fingerprint": "ebf65527803258eb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e371e6ce4fd116fc", "level": "error", "message": {"text": "Dangling fetch: POST /api/world-state (shinobij.client/src/screens/VillageWarScreen.tsx:141)"}, "properties": {"repobilityId": "f2882a4af5cbc1b1", "scanner": "scanner-primary", "fingerprint": "e371e6ce4fd116fc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4babda8bdd21c61e", "level": "error", "message": {"text": "Dangling fetch: POST /api/world-state (shinobij.client/src/screens/VillageWarScreen.tsx:154)"}, "properties": {"repobilityId": "4e36316ac555e8e5", "scanner": "scanner-primary", "fingerprint": "4babda8bdd21c61e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fac670368cfc5557", "level": "error", "message": {"text": "Dangling fetch: POST /api/bank/claim-interest (shinobij.client/src/screens/Bank.tsx:46)"}, "properties": {"repobilityId": "d5fa23bdca189388", "scanner": "scanner-primary", "fingerprint": "fac670368cfc5557", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e0b75a60a8d2b6a1", "level": "error", "message": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:238)"}, "properties": {"repobilityId": "dd6add4fcc18a110", "scanner": "scanner-primary", "fingerprint": "e0b75a60a8d2b6a1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6a5dbc7f5ead2815", "level": "error", "message": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:303)"}, "properties": {"repobilityId": "5805b653669de185", "scanner": "scanner-primary", "fingerprint": "6a5dbc7f5ead2815", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cc4b44cb94db4c19", "level": "error", "message": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:331)"}, "properties": {"repobilityId": "210100c944ed1a84", "scanner": "scanner-primary", "fingerprint": "cc4b44cb94db4c19", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0cc5b52fa34b3358", "level": "error", "message": {"text": "Dangling fetch: POST /api/pet/battle-result (shinobij.client/src/screens/PetArena.tsx:555)"}, "properties": {"repobilityId": "870a16653d13e914", "scanner": "scanner-primary", "fingerprint": "0cc5b52fa34b3358", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e48b2f904f2c8588", "level": "error", "message": {"text": "Dangling fetch: POST /api/pet/battle-result (shinobij.client/src/screens/PetArena.tsx:629)"}, "properties": {"repobilityId": "b080aade2ca0c784", "scanner": "scanner-primary", "fingerprint": "e48b2f904f2c8588", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dc79041c8aa9f1f8", "level": "error", "message": {"text": "Dangling fetch: POST /api/pet/battle-result (shinobij.client/src/screens/PetArena.tsx:719)"}, "properties": {"repobilityId": "6163c5c3759eb750", "scanner": "scanner-primary", "fingerprint": "dc79041c8aa9f1f8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-72bf4695aacf4895", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:942)"}, "properties": {"repobilityId": "1823b3744baf76d8", "scanner": "scanner-primary", "fingerprint": "72bf4695aacf4895", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-874c5400a559e737", "level": "error", "message": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:947)"}, "properties": {"repobilityId": "b2a366386cb60154", "scanner": "scanner-primary", "fingerprint": "874c5400a559e737", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b1f3b3dc8e3fdbd8", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:975)"}, "properties": {"repobilityId": "acb0527042b996fa", "scanner": "scanner-primary", "fingerprint": "b1f3b3dc8e3fdbd8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6f11fd04ac21c69f", "level": "error", "message": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/PetArena.tsx:980)"}, "properties": {"repobilityId": "1bfd04f282c83255", "scanner": "scanner-primary", "fingerprint": "6f11fd04ac21c69f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4f727549a09d7398", "level": "error", "message": {"text": "Dangling fetch: GET /api/clan/seal-pool/get?clanName=${encodeURIComponent(character.clan)} (shinobij.client/src/screens/ClanSealPool.tsx:50)"}, "properties": {"repobilityId": "ecb7d28101048505", "scanner": "scanner-primary", "fingerprint": "4f727549a09d7398", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-be3375fa845db26f", "level": "error", "message": {"text": "Dangling fetch: GET /api/clan/pet-escort/list?clanName=${encodeURIComponent(character.clan)} (shinobij.client/src/screens/ClanSealPool.tsx:58)"}, "properties": {"repobilityId": "6361f4bb813fe5cb", "scanner": "scanner-primary", "fingerprint": "be3375fa845db26f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-97f003e9bc55e15c", "level": "error", "message": {"text": "Dangling fetch: POST /api/clan/seal-pool/donate (shinobij.client/src/screens/ClanSealPool.tsx:96)"}, "properties": {"repobilityId": "f9845a1fe3bf3966", "scanner": "scanner-primary", "fingerprint": "97f003e9bc55e15c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1acc07063887dde5", "level": "error", "message": {"text": "Dangling fetch: POST /api/clan/seal-pool/distribute (shinobij.client/src/screens/ClanSealPool.tsx:117)"}, "properties": {"repobilityId": "d2a8567754be062e", "scanner": "scanner-primary", "fingerprint": "1acc07063887dde5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3c2b48bc4090fcb9", "level": "error", "message": {"text": "Dangling fetch: GET /api/missions/daily?playerName=${encodeURIComponent(character.name)} (shinobij.client/src/screens/DailyProfessionMissions.tsx:58)"}, "properties": {"repobilityId": "2e0742d2b3834eaa", "scanner": "scanner-primary", "fingerprint": "3c2b48bc4090fcb9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bc42b37970268371", "level": "error", "message": {"text": "Dangling fetch: GET /api/messages (shinobij.client/src/screens/Messages.tsx:39)"}, "properties": {"repobilityId": "62a294f913dbadc3", "scanner": "scanner-primary", "fingerprint": "bc42b37970268371", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-79db0a0e847d4886", "level": "error", "message": {"text": "Dangling fetch: GET /api/messages?with=${encodeURIComponent(withName)} (shinobij.client/src/screens/Messages.tsx:43)"}, "properties": {"repobilityId": "948f8adfe52456ea", "scanner": "scanner-primary", "fingerprint": "79db0a0e847d4886", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-695854b130512a07", "level": "error", "message": {"text": "Dangling fetch: POST /api/messages (shinobij.client/src/screens/Messages.tsx:70)"}, "properties": {"repobilityId": "4e2197976294b86d", "scanner": "scanner-primary", "fingerprint": "695854b130512a07", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6a2c11fc8c2e211a", "level": "error", "message": {"text": "Dangling fetch: GET /api/player/injured-villagers?healerName=${encodeURIComponent(character.name)} (shinobij.client/src/screens/Hospital.tsx:36)"}, "properties": {"repobilityId": "c4faa0edce9a2952", "scanner": "scanner-primary", "fingerprint": "6a2c11fc8c2e211a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ce948e44f5c8bf1d", "level": "error", "message": {"text": "Dangling fetch: POST /api/player/heal (shinobij.client/src/screens/Hospital.tsx:65)"}, "properties": {"repobilityId": "d88c0f61166a795c", "scanner": "scanner-primary", "fingerprint": "ce948e44f5c8bf1d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-88eb636bdd88b3e3", "level": "error", "message": {"text": "Dangling fetch: POST /api/player/heal (shinobij.client/src/screens/Hospital.tsx:95)"}, "properties": {"repobilityId": "6312176a0f1938cb", "scanner": "scanner-primary", "fingerprint": "88eb636bdd88b3e3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ea3612ee65fe0912", "level": "error", "message": {"text": "Dangling fetch: POST /api/player/heal (shinobij.client/src/screens/Hospital.tsx:127)"}, "properties": {"repobilityId": "49558a82519d2300", "scanner": "scanner-primary", "fingerprint": "ea3612ee65fe0912", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-90d3d3a2816e0772", "level": "error", "message": {"text": "Dangling fetch: POST /api/jutsu/train-with-seals (shinobij.client/src/screens/Training.tsx:184)"}, "properties": {"repobilityId": "5b6d444a971f5904", "scanner": "scanner-primary", "fingerprint": "90d3d3a2816e0772", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-88468baf85702190", "level": "error", "message": {"text": "Dangling fetch: POST /api/jutsu/speedup (shinobij.client/src/screens/Training.tsx:218)"}, "properties": {"repobilityId": "3480b76da417d25c", "scanner": "scanner-primary", "fingerprint": "88468baf85702190", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ea64ecf2e76bc119", "level": "error", "message": {"text": "Dangling fetch: GET /api/village/kage?village=${encodeURIComponent(character.village)} (shinobij.client/src/screens/TownHall.tsx:115)"}, "properties": {"repobilityId": "8c5fe797c734c213", "scanner": "scanner-primary", "fingerprint": "ea64ecf2e76bc119", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-12d703d7a9c13e4b", "level": "error", "message": {"text": "Dangling fetch: POST /api/village-guard/list (shinobij.client/src/screens/TownHall.tsx:128)"}, "properties": {"repobilityId": "4000a49227b118c4", "scanner": "scanner-primary", "fingerprint": "12d703d7a9c13e4b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6817c8f1f4429faf", "level": "error", "message": {"text": "Dangling fetch: POST /api/village/treasury/transfer (shinobij.client/src/screens/TownHall.tsx:181)"}, "properties": {"repobilityId": "69a9ad880b916fc6", "scanner": "scanner-primary", "fingerprint": "6817c8f1f4429faf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-91e6be2c2858fb9e", "level": "error", "message": {"text": "Dangling fetch: POST /api/village/treasury/transfer (shinobij.client/src/screens/TownHall.tsx:213)"}, "properties": {"repobilityId": "96ce0d3844575003", "scanner": "scanner-primary", "fingerprint": "91e6be2c2858fb9e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b97f01495f740caa", "level": "error", "message": {"text": "Dangling fetch: POST /api/village/claim-daily-agenda (shinobij.client/src/screens/TownHall.tsx:422)"}, "properties": {"repobilityId": "5ea870c39abf17d7", "scanner": "scanner-primary", "fingerprint": "b97f01495f740caa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f7c0c96584d4c96a", "level": "error", "message": {"text": "Dangling fetch: POST /api/village/claim-map-control (shinobij.client/src/screens/TownHall.tsx:476)"}, "properties": {"repobilityId": "339d8f31856a9c38", "scanner": "scanner-primary", "fingerprint": "f7c0c96584d4c96a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-299ea9dcb0d25b89", "level": "error", "message": {"text": "Dangling fetch: GET /api/weekly-boss (shinobij.client/src/screens/WeeklyBossArena.tsx:38)"}, "properties": {"repobilityId": "e6f57a0634acdd54", "scanner": "scanner-primary", "fingerprint": "299ea9dcb0d25b89", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d19e3e0f3a2b0884", "level": "error", "message": {"text": "Dangling fetch: POST /api/clan/war/tilecards (shinobij.client/src/screens/ClanWarTileCardDuel.tsx:107)"}, "properties": {"repobilityId": "2051c447e5854ea2", "scanner": "scanner-primary", "fingerprint": "d19e3e0f3a2b0884", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f00550922b5d5f4e", "level": "error", "message": {"text": "Dangling fetch: POST /api/clan/war/tilecards (shinobij.client/src/screens/ClanWarTileCardDuel.tsx:160)"}, "properties": {"repobilityId": "78fc70c4d935bc54", "scanner": "scanner-primary", "fingerprint": "f00550922b5d5f4e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-193a0e77d6811269", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/moderation (shinobij.client/src/screens/ModerationPanel.tsx:57)"}, "properties": {"repobilityId": "f0492f954509f434", "scanner": "scanner-primary", "fingerprint": "193a0e77d6811269", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-61f2fae025cdbd04", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/moderation (shinobij.client/src/screens/ModerationPanel.tsx:78)"}, "properties": {"repobilityId": "ef0904f59658bc44", "scanner": "scanner-primary", "fingerprint": "61f2fae025cdbd04", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ca2fe8b26ff1c899", "level": "error", "message": {"text": "Dangling fetch: GET /api/player/roster (shinobij.client/src/screens/StartScreen.tsx:215)"}, "properties": {"repobilityId": "a26ec889aba24162", "scanner": "scanner-primary", "fingerprint": "ca2fe8b26ff1c899", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5c39acac32d8bd5e", "level": "error", "message": {"text": "Dangling fetch: GET /api/game-state (shinobij.client/src/screens/StartScreen.tsx:216)"}, "properties": {"repobilityId": "4e6938ac0de949cc", "scanner": "scanner-primary", "fingerprint": "5c39acac32d8bd5e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-925f96c9d744b0b3", "level": "error", "message": {"text": "Dangling fetch: GET /api/world-state (shinobij.client/src/screens/CentralHub.tsx:98)"}, "properties": {"repobilityId": "65a7d599b65e4c18", "scanner": "scanner-primary", "fingerprint": "925f96c9d744b0b3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-89822d2acce4ef59", "level": "error", "message": {"text": "Dangling fetch: GET /api/village/chat?village=${encodeURIComponent(character.village)} (shinobij.client/src/screens/VillageTavern.tsx:20)"}, "properties": {"repobilityId": "ede0a6fff35aee2f", "scanner": "scanner-primary", "fingerprint": "89822d2acce4ef59", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-914becaec704fd9d", "level": "error", "message": {"text": "Dangling fetch: POST /api/village/chat?village=${encodeURIComponent(character.village)} (shinobij.client/src/screens/VillageTavern.tsx:69)"}, "properties": {"repobilityId": "5455e8cc6ec45f21", "scanner": "scanner-primary", "fingerprint": "914becaec704fd9d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-54111f8f64fa469c", "level": "error", "message": {"text": "Dangling fetch: GET /api/images?cat=${encodeURIComponent(cat)} (shinobij.client/src/screens/AdminPanel.tsx:755)"}, "properties": {"repobilityId": "40aea1e83e7654d1", "scanner": "scanner-primary", "fingerprint": "54111f8f64fa469c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0fa1a44a26914040", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/players (shinobij.client/src/screens/AdminPanel.tsx:787)"}, "properties": {"repobilityId": "2a8212ded734cc32", "scanner": "scanner-primary", "fingerprint": "0fa1a44a26914040", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3b1291800177b3a6", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/item-review (shinobij.client/src/screens/AdminPanel.tsx:817)"}, "properties": {"repobilityId": "ed7a896f9785ec2a", "scanner": "scanner-primary", "fingerprint": "3b1291800177b3a6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-84b33ddabb1206ca", "level": "error", "message": {"text": "Dangling fetch: GET /api/bloodlines/list (shinobij.client/src/screens/AdminPanel.tsx:832)"}, "properties": {"repobilityId": "42b211415da7b02b", "scanner": "scanner-primary", "fingerprint": "84b33ddabb1206ca", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-93ac971482dece94", "level": "error", "message": {"text": "Dangling fetch: GET /api/save/${encodeURIComponent(pmTargetName.trim().toLowerCase())} (shinobij.client/src/screens/AdminPanel.tsx:856)"}, "properties": {"repobilityId": "fcba4651130fec9c", "scanner": "scanner-primary", "fingerprint": "93ac971482dece94", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-81cd5683b3590fca", "level": "error", "message": {"text": "Dangling fetch: POST /api/save/${encodeURIComponent(pmTargetName.trim().toLowerCase())}?signal=1 (shinobij.client/src/screens/AdminPanel.tsx:889)"}, "properties": {"repobilityId": "72d78a19737fc082", "scanner": "scanner-primary", "fingerprint": "81cd5683b3590fca", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-746df8e51f679ebe", "level": "error", "message": {"text": "Dangling fetch: GET /api/save/${encodeURIComponent(pmEditName.trim().toLowerCase())} (shinobij.client/src/screens/AdminPanel.tsx:916)"}, "properties": {"repobilityId": "d7f88a8ba1677a04", "scanner": "scanner-primary", "fingerprint": "746df8e51f679ebe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1253067ed218b629", "level": "error", "message": {"text": "Dangling fetch: POST /api/save/${encodeURIComponent(pmEditName.trim().toLowerCase())}?signal=1 (shinobij.client/src/screens/AdminPanel.tsx:951)"}, "properties": {"repobilityId": "e9ac46dbe9d54ef7", "scanner": "scanner-primary", "fingerprint": "1253067ed218b629", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c82fec85f795a8d9", "level": "error", "message": {"text": "Dangling fetch: GET /api/save/${encodeURIComponent(name.toLowerCase())} (shinobij.client/src/screens/AdminPanel.tsx:989)"}, "properties": {"repobilityId": "67adad1ed82a8876", "scanner": "scanner-primary", "fingerprint": "c82fec85f795a8d9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8d59cd5862e7778b", "level": "error", "message": {"text": "Dangling fetch: POST /api/save/${encodeURIComponent(name.toLowerCase())}?signal=1 (shinobij.client/src/screens/AdminPanel.tsx:1000)"}, "properties": {"repobilityId": "6cabc2c273f9d498", "scanner": "scanner-primary", "fingerprint": "8d59cd5862e7778b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-57f491fc11317530", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/save/${encodeURIComponent(pmTargetName.trim().toLowerCase())} (shinobij.client/src/screens/AdminPanel.tsx:1021)"}, "properties": {"repobilityId": "effd8e01739eec0a", "scanner": "scanner-primary", "fingerprint": "57f491fc11317530", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3d653f61b1cbec51", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/server-reset (shinobij.client/src/screens/AdminPanel.tsx:1044)"}, "properties": {"repobilityId": "e92c25c7a919c274", "scanner": "scanner-primary", "fingerprint": "3d653f61b1cbec51", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-aec753a2243c9d60", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/item-review (shinobij.client/src/screens/AdminPanel.tsx:1093)"}, "properties": {"repobilityId": "32bcf5d28d923499", "scanner": "scanner-primary", "fingerprint": "aec753a2243c9d60", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d1fc7c6672b56621", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/bloodline-review (shinobij.client/src/screens/AdminPanel.tsx:1115)"}, "properties": {"repobilityId": "113c3c84c5fcf89c", "scanner": "scanner-primary", "fingerprint": "d1fc7c6672b56621", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-349fc3a550929f07", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/bloodline-review (shinobij.client/src/screens/AdminPanel.tsx:1859)"}, "properties": {"repobilityId": "807e45d5bb672eac", "scanner": "scanner-primary", "fingerprint": "349fc3a550929f07", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c147ef0fb1d27f55", "level": "error", "message": {"text": "Dangling fetch: POST /api/weekly-boss (shinobij.client/src/screens/AdminPanel.tsx:2976)"}, "properties": {"repobilityId": "e3b3608da18122cf", "scanner": "scanner-primary", "fingerprint": "c147ef0fb1d27f55", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-636d4f1de57f679b", "level": "error", "message": {"text": "Dangling fetch: GET /api/images?cat=item (shinobij.client/src/screens/AdminPanel.tsx:3287)"}, "properties": {"repobilityId": "30ad96a297e6fcdb", "scanner": "scanner-primary", "fingerprint": "636d4f1de57f679b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8a4d7a7c6ae84853", "level": "error", "message": {"text": "Dangling fetch: GET /api/images?cat=jutsu (shinobij.client/src/screens/AdminPanel.tsx:3468)"}, "properties": {"repobilityId": "02a6625312d636a0", "scanner": "scanner-primary", "fingerprint": "8a4d7a7c6ae84853", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2f527cb3c044b694", "level": "error", "message": {"text": "Dangling fetch: GET /api/images?cat=pet (shinobij.client/src/screens/AdminPanel.tsx:4029)"}, "properties": {"repobilityId": "9182407dfe0d0b59", "scanner": "scanner-primary", "fingerprint": "2f527cb3c044b694", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-908fee4c397074f5", "level": "error", "message": {"text": "Dangling fetch: POST /api/village/kage (shinobij.client/src/screens/AdminPanel.tsx:4552)"}, "properties": {"repobilityId": "5dfbfc8fb691ce8a", "scanner": "scanner-primary", "fingerprint": "908fee4c397074f5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-64583cbfd60fc1c6", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/images?id=${encodeURIComponent(asset.key)} (shinobij.client/src/screens/AdminPanel.tsx:4972)"}, "properties": {"repobilityId": "e7a847422247d382", "scanner": "scanner-primary", "fingerprint": "64583cbfd60fc1c6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9472b4f01eabeb9c", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/images?id=${encodeURIComponent(key)} (shinobij.client/src/screens/AdminPanel.tsx:5179)"}, "properties": {"repobilityId": "b02d4ec677eb6e99", "scanner": "scanner-primary", "fingerprint": "9472b4f01eabeb9c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7a3564bf5d89b273", "level": "error", "message": {"text": "Dangling fetch: POST /api/village-guard/list (shinobij.client/src/screens/WorldMap.tsx:285)"}, "properties": {"repobilityId": "75bca41ec4ecec2e", "scanner": "scanner-primary", "fingerprint": "7a3564bf5d89b273", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cf29d238ec5cb06b", "level": "error", "message": {"text": "Dangling fetch: POST /api/village-guard/list (shinobij.client/src/screens/WorldMap.tsx:297)"}, "properties": {"repobilityId": "b2d5794baab8b738", "scanner": "scanner-primary", "fingerprint": "cf29d238ec5cb06b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4c59c35b4b76db69", "level": "error", "message": {"text": "Dangling fetch: POST /api/pvp/session (shinobij.client/src/screens/WorldMap.tsx:361)"}, "properties": {"repobilityId": "eca8a27bc126cd2a", "scanner": "scanner-primary", "fingerprint": "4c59c35b4b76db69", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-11fabfd43f94daad", "level": "error", "message": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/screens/WorldMap.tsx:425)"}, "properties": {"repobilityId": "ecf7721b19602cb7", "scanner": "scanner-primary", "fingerprint": "11fabfd43f94daad", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c46579e75b4005a2", "level": "error", "message": {"text": "Dangling fetch: POST /api/village-guard/challenge (shinobij.client/src/screens/WorldMap.tsx:1523)"}, "properties": {"repobilityId": "06a724772e520d62", "scanner": "scanner-primary", "fingerprint": "c46579e75b4005a2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-27e6e3dbcabca30a", "level": "error", "message": {"text": "Dangling fetch: POST /api/pvp/session (shinobij.client/src/screens/WorldMap.tsx:1551)"}, "properties": {"repobilityId": "4008fbaaf49f661c", "scanner": "scanner-primary", "fingerprint": "27e6e3dbcabca30a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-468475e78da919f5", "level": "error", "message": {"text": "Dangling fetch: POST /api/village-guard/challenge (shinobij.client/src/screens/WorldMap.tsx:1568)"}, "properties": {"repobilityId": "02a3c0d03a5e81d9", "scanner": "scanner-primary", "fingerprint": "468475e78da919f5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1891da73150812ca", "level": "error", "message": {"text": "Dangling fetch: GET /api/weekly-boss (shinobij.client/src/screens/HallOfLegends.tsx:34)"}, "properties": {"repobilityId": "d3f3a5a0e9a23420", "scanner": "scanner-primary", "fingerprint": "1891da73150812ca", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-63350427542c2344", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/images?id=${encodeURIComponent(key)} (shinobij.client/src/components/KenneyAtlasPicker.tsx:245)"}, "properties": {"repobilityId": "49e71f01cb4f78f8", "scanner": "scanner-primary", "fingerprint": "63350427542c2344", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3998c5bb0a0c9f92", "level": "error", "message": {"text": "Dangling fetch: POST /api/player-auth (shinobij.client/src/components/ChangePasswordCard.tsx:37)"}, "properties": {"repobilityId": "99ad058b8fd5507b", "scanner": "scanner-primary", "fingerprint": "3998c5bb0a0c9f92", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-10ca49dfbb20b297", "level": "error", "message": {"text": "Dangling fetch: POST /api/arena/lobby (shinobij.client/src/components/ArenaCoopLobby.tsx:27)"}, "properties": {"repobilityId": "3c0d84df33e39181", "scanner": "scanner-primary", "fingerprint": "10ca49dfbb20b297", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e2688c34874e26e1", "level": "error", "message": {"text": "Dangling fetch: POST /api/images (shinobij.client/src/lib/shared-images.ts:65)"}, "properties": {"repobilityId": "ab8b39ed8c4aa0cb", "scanner": "scanner-primary", "fingerprint": "e2688c34874e26e1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-11ab3d80e9790419", "level": "error", "message": {"text": "Dangling fetch: GET /api/messages (shinobij.client/src/lib/mail-unread.ts:31)"}, "properties": {"repobilityId": "86040e7fa53efab1", "scanner": "scanner-primary", "fingerprint": "11ab3d80e9790419", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b22824ee9b847d8f", "level": "error", "message": {"text": "Dangling fetch: GET /api/save/${clanSlug(name)} (shinobij.client/src/lib/clan-api.ts:15)"}, "properties": {"repobilityId": "f6eb5019753c87d9", "scanner": "scanner-primary", "fingerprint": "b22824ee9b847d8f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-278816887d5478ca", "level": "error", "message": {"text": "Dangling fetch: GET /api/save/${clanSlug(name)} (shinobij.client/src/lib/clan-api.ts:27)"}, "properties": {"repobilityId": "ac28537dbbb087b6", "scanner": "scanner-primary", "fingerprint": "278816887d5478ca", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-45a7e94492539940", "level": "error", "message": {"text": "Dangling fetch: POST /api/save/${clanSlug(data.name)} (shinobij.client/src/lib/clan-api.ts:52)"}, "properties": {"repobilityId": "9ab168852c5d9785", "scanner": "scanner-primary", "fingerprint": "45a7e94492539940", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-978c3f761000b769", "level": "error", "message": {"text": "Dangling fetch: POST /api/village-guard/${action} (shinobij.client/src/lib/clan-api.ts:71)"}, "properties": {"repobilityId": "43b803d4e804a988", "scanner": "scanner-primary", "fingerprint": "978c3f761000b769", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d8b1e24fe7a80133", "level": "error", "message": {"text": "Dangling fetch: POST /api/battle/lock (shinobij.client/src/lib/battle-save.ts:77)"}, "properties": {"repobilityId": "741e70f9d7087bf5", "scanner": "scanner-primary", "fingerprint": "d8b1e24fe7a80133", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9f7d2a3041e24688", "level": "error", "message": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/lib/duel-challenge.ts:38)"}, "properties": {"repobilityId": "15ad21ee9e6c9113", "scanner": "scanner-primary", "fingerprint": "9f7d2a3041e24688", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5911c21a0056974b", "level": "error", "message": {"text": "Dangling fetch: POST /api/missions/claim-mission (shinobij.client/src/lib/claim-mission.ts:50)"}, "properties": {"repobilityId": "da4136bbcbbf8e8c", "scanner": "scanner-primary", "fingerprint": "5911c21a0056974b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e6a2f86ab5983caf", "level": "error", "message": {"text": "Dangling fetch: GET /api/clan/war/list (shinobij.client/src/lib/clan-war-api.ts:49)"}, "properties": {"repobilityId": "e330b17156a51a56", "scanner": "scanner-primary", "fingerprint": "e6a2f86ab5983caf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f29a34c657ce4269", "level": "error", "message": {"text": "Dangling fetch: POST /api/clan/war/declare (shinobij.client/src/lib/clan-war-api.ts:61)"}, "properties": {"repobilityId": "52cb88c18c32d694", "scanner": "scanner-primary", "fingerprint": "f29a34c657ce4269", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5916a3600f00790b", "level": "error", "message": {"text": "Dangling fetch: POST /api/clan/war/challenge (shinobij.client/src/lib/clan-war-api.ts:73)"}, "properties": {"repobilityId": "eca78e2428ec146c", "scanner": "scanner-primary", "fingerprint": "5916a3600f00790b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0dff449425fc8784", "level": "error", "message": {"text": "Dangling fetch: GET /api/player/friends?playerName=${encodeURIComponent(playerName)} (shinobij.client/src/lib/friends.ts:27)"}, "properties": {"repobilityId": "ae660e670a79d1fc", "scanner": "scanner-primary", "fingerprint": "0dff449425fc8784", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6ce62aedcef69197", "level": "error", "message": {"text": "Dangling fetch: POST /api/player/friends (shinobij.client/src/lib/friends.ts:62)"}, "properties": {"repobilityId": "68e801918d3bf57d", "scanner": "scanner-primary", "fingerprint": "6ce62aedcef69197", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1dc5e0699f27a430", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/player/friends (shinobij.client/src/lib/friends.ts:83)"}, "properties": {"repobilityId": "1011dd84c954c0b2", "scanner": "scanner-primary", "fingerprint": "1dc5e0699f27a430", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-83c3529f5e280485", "level": "error", "message": {"text": "Dangling fetch: POST /api/perf-beacon (shinobij.client/src/lib/perfTelemetry.ts:236)"}, "properties": {"repobilityId": "8eabc8e93f3c3fba", "scanner": "scanner-primary", "fingerprint": "83c3529f5e280485", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-42deca94136ec5bb", "level": "error", "message": {"text": "Dangling fetch: POST /api/player/challenge (shinobij.client/src/lib/player-api.ts:12)"}, "properties": {"repobilityId": "e78c603e25790ff2", "scanner": "scanner-primary", "fingerprint": "42deca94136ec5bb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-22f1ba44d958a7b3", "level": "error", "message": {"text": "Dangling fetch: POST /api/village/treasury/donate (shinobij.client/src/lib/player-api.ts:31)"}, "properties": {"repobilityId": "79c206da0b7d353c", "scanner": "scanner-primary", "fingerprint": "22f1ba44d958a7b3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-12127e128ed0b748", "level": "error", "message": {"text": "Dangling fetch: POST /api/clan/treasury/donate (shinobij.client/src/lib/player-api.ts:52)"}, "properties": {"repobilityId": "5695816860370a58", "scanner": "scanner-primary", "fingerprint": "12127e128ed0b748", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7a4556884adaf8c9", "level": "error", "message": {"text": "Dangling fetch: POST /api/clan/upgrade/purchase (shinobij.client/src/lib/player-api.ts:77)"}, "properties": {"repobilityId": "58723346440ed39e", "scanner": "scanner-primary", "fingerprint": "7a4556884adaf8c9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-00a466b5c46f2b52", "level": "error", "message": {"text": "Dangling fetch: POST /api/village/kage (shinobij.client/src/lib/world-state.ts:703)"}, "properties": {"repobilityId": "7321eecabc5e22ac", "scanner": "scanner-primary", "fingerprint": "00a466b5c46f2b52", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fb835d9008958c27", "level": "error", "message": {"text": "Dangling fetch: GET /api/save/${encodeURIComponent(name.toLowerCase())}?combatOnly=1 (shinobij.client/src/lib/pvp-session.ts:54)"}, "properties": {"repobilityId": "c38d778e5b904a70", "scanner": "scanner-primary", "fingerprint": "fb835d9008958c27", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-089fe2117be1756a", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/images/generations (api/generate-image.ts:126)"}, "properties": {"repobilityId": "ac82f64de69dd1d0", "scanner": "scanner-primary", "fingerprint": "089fe2117be1756a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-170a4d79c2b7f8ae", "level": "note", "message": {"text": "Unused endpoint: USE /api/player/heartbeat"}, "properties": {"repobilityId": "202066c9aca3da14", "scanner": "scanner-primary", "fingerprint": "170a4d79c2b7f8ae", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8527f38da59803f5", "level": "note", "message": {"text": "Unused endpoint: USE /api/player/attack"}, "properties": {"repobilityId": "34c1fe893ec1350f", "scanner": "scanner-primary", "fingerprint": "8527f38da59803f5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-37aa89a6abc5a6df", "level": "note", "message": {"text": "Unused endpoint: USE /api/player/clear-attack"}, "properties": {"repobilityId": "42c6cba682c23106", "scanner": "scanner-primary", "fingerprint": "37aa89a6abc5a6df", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3b485b2d4c9b2fc8", "level": "note", "message": {"text": "Unused endpoint: USE /api/village-guard/queue"}, "properties": {"repobilityId": "c63652437493d014", "scanner": "scanner-primary", "fingerprint": "3b485b2d4c9b2fc8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a47655cd6e579b2e", "level": "note", "message": {"text": "Unused endpoint: USE /api/village-guard/dequeue"}, "properties": {"repobilityId": "f85da895ceeace8e", "scanner": "scanner-primary", "fingerprint": "a47655cd6e579b2e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6735d5d2bcd36f8f", "level": "note", "message": {"text": "Unused endpoint: USE /api/village-guard/list"}, "properties": {"repobilityId": "0fe9ce378599577d", "scanner": "scanner-primary", "fingerprint": "6735d5d2bcd36f8f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0a523f3594556dae", "level": "note", "message": {"text": "Unused endpoint: USE /api/clans/list"}, "properties": {"repobilityId": "c445b5db983c88b5", "scanner": "scanner-primary", "fingerprint": "0a523f3594556dae", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3dba932983f6f879", "level": "note", "message": {"text": "Unused endpoint: USE /api/save"}, "properties": {"repobilityId": "f8eccbec2f35ee9e", "scanner": "scanner-primary", "fingerprint": "3dba932983f6f879", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ab5cf91a3be6e8ac", "level": "note", "message": {"text": "Unused endpoint: USE /api/generate-image"}, "properties": {"repobilityId": "b355911067fe3346", "scanner": "scanner-primary", "fingerprint": "ab5cf91a3be6e8ac", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a538eb6af53f0a9", "level": "note", "message": {"text": "Unused endpoint: POST /api/player/attack"}, "properties": {"repobilityId": "458bd431c9239e57", "scanner": "scanner-primary", "fingerprint": "7a538eb6af53f0a9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-539af941cd5de132", "level": "note", "message": {"text": "Unused endpoint: POST /api/player/clear-attack"}, "properties": {"repobilityId": "748bf43dc759fb00", "scanner": "scanner-primary", "fingerprint": "539af941cd5de132", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}