{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-08811a6ab760e824", "name": "Possibly dead Python function: deco", "shortDescription": {"text": "Possibly dead Python function: deco"}, "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-321c66a3a6ece6ab", "name": "Possibly dead Python function: exempt", "shortDescription": {"text": "Possibly dead Python function: exempt"}, "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-2c08676d8a7dd3d3", "name": "Possibly dead Python function: ping", "shortDescription": {"text": "Possibly dead Python function: ping"}, "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-383dd9d748d874ee", "name": "Possibly dead Python function: json_default", "shortDescription": {"text": "Possibly dead Python function: json_default"}, "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-337a61b9e1d80169", "name": "Possibly dead Python function: specialty_matches_filter", "shortDescription": {"text": "Possibly dead Python function: specialty_matches_filter"}, "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-7711d2f676f90079", "name": "Possibly dead Python function: decorator", "shortDescription": {"text": "Possibly dead Python function: decorator"}, "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-f785571584185abb", "name": "Possibly dead Python function: query_work_orders", "shortDescription": {"text": "Possibly dead Python function: query_work_orders"}, "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-bba362e011569aeb", "name": "Possibly dead Python function: query_notices", "shortDescription": {"text": "Possibly dead Python function: query_notices"}, "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-9e2b98a389c65d2b", "name": "Possibly dead Python function: query_ot_personnel", "shortDescription": {"text": "Possibly dead Python function: query_ot_personnel"}, "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-46ec674de6a7485b", "name": "Possibly dead Python function: query_ot_materials", "shortDescription": {"text": "Possibly dead Python function: query_ot_materials"}, "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-6dfbf15eb22b53e9", "name": "Possibly dead Python function: query_ot_log_entries", "shortDescription": {"text": "Possibly dead Python function: query_ot_log_entries"}, "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-37c1c3b78d75ed99", "name": "Possibly dead Python function: query_lubrication_points", "shortDescription": {"text": "Possibly dead Python function: query_lubrication_points"}, "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-131c246d4a4ee094", "name": "Possibly dead Python function: query_lubrication_executions", "shortDescription": {"text": "Possibly dead Python function: query_lubrication_executions"}, "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-8b5e5a4a96a36ef9", "name": "Possibly dead Python function: query_monitoring_points", "shortDescription": {"text": "Possibly dead Python function: query_monitoring_points"}, "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-11540fd87a8d955f", "name": "Possibly dead Python function: query_monitoring_readings", "shortDescription": {"text": "Possibly dead Python function: query_monitoring_readings"}, "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-8ae6b8bf87750b32", "name": "Possibly dead Python function: query_inspection_routes", "shortDescription": {"text": "Possibly dead Python function: query_inspection_routes"}, "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-bf24d7eada5609bc", "name": "Possibly dead Python function: query_inspection_executions", "shortDescription": {"text": "Possibly dead Python function: query_inspection_executions"}, "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-175a4e55d1b5d527", "name": "Possibly dead Python function: query_thickness", "shortDescription": {"text": "Possibly dead Python function: query_thickness"}, "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-05004413da4e5ba3", "name": "Possibly dead Python function: query_shutdowns", "shortDescription": {"text": "Possibly dead Python function: query_shutdowns"}, "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-23f1149b66621309", "name": "Possibly dead Python function: query_shutdown_ots", "shortDescription": {"text": "Possibly dead Python function: query_shutdown_ots"}, "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-d762ad9719d7409b", "name": "Possibly dead Python function: query_purchases", "shortDescription": {"text": "Possibly dead Python function: query_purchases"}, "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-6d560edf6bb4fd14", "name": "Possibly dead Python function: query_warehouse", "shortDescription": {"text": "Possibly dead Python function: query_warehouse"}, "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-4b6f1853f9b9d129", "name": "Possibly dead Python function: query_warehouse_movements", "shortDescription": {"text": "Possibly dead Python function: query_warehouse_movements"}, "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-9328791ebe50c4cc", "name": "Possibly dead Python function: query_equipment_tree", "shortDescription": {"text": "Possibly dead Python function: query_equipment_tree"}, "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-fe0d4f7f7127186c", "name": "Possibly dead Python function: query_activities", "shortDescription": {"text": "Possibly dead Python function: query_activities"}, "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-f04a92e65d2b30ac", "name": "Possibly dead Python function: query_rotative_assets", "shortDescription": {"text": "Possibly dead Python function: query_rotative_assets"}, "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-6d2560d7c954858c", "name": "Possibly dead Python function: query_equipos_flat", "shortDescription": {"text": "Possibly dead Python function: query_equipos_flat"}, "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-91da60e3d89429bd", "name": "Stray `console.log` in TS/JS \u2014 static/js/notices.js:124", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 static/js/notices.js:124"}, "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-1e4eb45068c9b7e5", "name": "Icon-only button without accessible name \u2014 static/js/thickness.js:465", "shortDescription": {"text": "Icon-only button without accessible name \u2014 static/js/thickness.js:465"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9eb87d16cf2dfc5b", "name": "Stray `console.log` in TS/JS \u2014 static/js/work_orders.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 static/js/work_orders.js:16"}, "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-19b7892183cb46f2", "name": "Insecure pattern 'document_write' in static/js/reports.js:449", "shortDescription": {"text": "Insecure pattern 'document_write' in static/js/reports.js:449"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9e05f83b72a03ca5", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/reports.js:38", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/reports.js:38"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bbb56f3eb674b25f", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/indicators.js:101", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/indicators.js:101"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6590776a858e7c13", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/purchasing.js:35", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/purchasing.js:35"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6362ab7587746a9b", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/inspections.js:13", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/inspections.js:13"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e5beefc3006bba55", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/activities.js:30", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/activities.js:30"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28d96b4f1021f121", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/produccion.js:57", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/produccion.js:57"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-435834ba688d43be", "name": "Insecure pattern 'insert_adjacent_html' in static/js/produccion.js:363", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in static/js/produccion.js:363"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d1628aa87bc798b3", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/app.js:257", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/app.js:257"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b84b5b5a91d6bfbd", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard.js:40", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard.js:40"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-13e973dc58a13ecc", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/programa_nocturno.js:34", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/programa_nocturno.js:34"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-61151fb142c0ed7d", "name": "Insecure pattern 'insert_adjacent_html' in static/js/programa_nocturno.js:39", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in static/js/programa_nocturno.js:39"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fd82241ecb9b3840", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/notices.js:58", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/notices.js:58"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bf3717bf59ba3bd2", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/sidebar.js:31", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/sidebar.js:31"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b49ba3d1260d6002", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/monitoring.js:45", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/monitoring.js:45"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ae8f9ed3c6debbf6", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/lubrication.js:14", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/lubrication.js:14"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-771583e3a83ea35c", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/shutdowns.js:54", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/shutdowns.js:54"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d8140a533dcd4789", "name": "Insecure pattern 'insert_adjacent_html' in static/js/shutdowns.js:155", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in static/js/shutdowns.js:155"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-41ae4f8fc387bd23", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/rotative_assets.js:33", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/rotative_assets.js:33"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-71d4bf06bcf93ecf", "name": "Insecure pattern 'insert_adjacent_html' in static/js/rotative_assets.js:472", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in static/js/rotative_assets.js:472"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-248608f96e78770d", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/thickness.js:66", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/thickness.js:66"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3e14fb7750a6660a", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/work_orders.js:303", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/work_orders.js:303"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bd237d0e103456e5", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/requirements.js:42", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/requirements.js:42"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9fe44cbe3a622747", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/cockpit.js:111", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/cockpit.js:111"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f663a8dd2068c686", "name": "Insecure pattern 'direct_innerhtml_assignment' in scripts/fix_js.py:27", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scripts/fix_js.py:27"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6ad53519fae2edc3", "name": "Possible secret in scripts/debug/probe_pooler.py", "shortDescription": {"text": "Possible secret in scripts/debug/probe_pooler.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-1a50467f36b413ec", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-python@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e21538b56060f0ff", "name": "Very large file: models.py (2374 lines)", "shortDescription": {"text": "Very large file: models.py (2374 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-2808440ccdc84d3a", "name": "Very large file: app.py (1427 lines)", "shortDescription": {"text": "Very large file: app.py (1427 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-1a752c4c0aa61daf", "name": "Very large file: static/js/app.js (1214 lines)", "shortDescription": {"text": "Very large file: static/js/app.js (1214 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-72e8702aaf1c6138", "name": "Very large file: static/js/sidebar.js (1153 lines)", "shortDescription": {"text": "Very large file: static/js/sidebar.js (1153 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-6b48cf3599a1d18e", "name": "Very large file: static/js/work_orders.js (4347 lines)", "shortDescription": {"text": "Very large file: static/js/work_orders.js (4347 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-f2987bb1aa6b43f2", "name": "Very large file: bot/context.py (1375 lines)", "shortDescription": {"text": "Very large file: bot/context.py (1375 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-186a58071ea18bc2", "name": "Very large file: bot/telegram_bot.py (2084 lines)", "shortDescription": {"text": "Very large file: bot/telegram_bot.py (2084 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-cbee1b089332e293", "name": "Very large file: routes/work_orders_routes.py (1613 lines)", "shortDescription": {"text": "Very large file: routes/work_orders_routes.py (1613 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-63b82e71ed7f6f0f", "name": "Very large file: routes/reports_routes.py (1395 lines)", "shortDescription": {"text": "Very large file: routes/reports_routes.py (1395 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-442ed4d9b5cc35d9", "name": "Very large file: routes/core_routes.py (1784 lines)", "shortDescription": {"text": "Very large file: routes/core_routes.py (1784 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-e9168d31a440c630", "name": "Very large file: routes/weekly_plan_routes.py (1318 lines)", "shortDescription": {"text": "Very large file: routes/weekly_plan_routes.py (1318 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": "26 tests / 136 src (ratio 0.19)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-01f96f71d9907a8c", "name": "README lacks setup or run instructions", "shortDescription": {"text": "README lacks setup or run instructions"}, "fullDescription": {"text": "A README exists, but it does not contain common install/setup/run markers. This matches a frequent generated-code pattern: UI is present, operational handoff is thin."}, "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 505 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 20 placeholder/mock markers across 9 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, operator-readme. 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": "low", "confidence": 1.0}}, {"id": "scanner-376f3d87380b58e7", "name": "Commented-code block (5 lines) in models.py:222", "shortDescription": {"text": "Commented-code block (5 lines) in models.py: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-48906d80f8f5af63", "name": "Legacy-named symbol `cmms_v2` in app.py:159", "shortDescription": {"text": "Legacy-named symbol `cmms_v2` in app.py:159"}, "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-d6dc42047e6eec56", "name": "Commented-code block (6 lines) in app.py:217", "shortDescription": {"text": "Commented-code block (6 lines) in app.py:217"}, "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-97cde3f9e1ea0739", "name": "Commented-code block (5 lines) in static/sw.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in static/sw.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b98389e0401a55cf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 static/sw.js:96", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/sw.js:96"}, "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-e9e6ddbd4295404b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/reports.js:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/reports.js:25"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-131020565968e560", "name": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/inspections.js:6", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/inspections.js:6"}, "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-5bcb653f7e255685", "name": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/activities.js:6", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/activities.js:6"}, "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-541a640f5f6c68ef", "name": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/produccion.js:457", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/produccion.js:457"}, "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-e8dea7ee9378e408", "name": "Commented-code block (5 lines) in static/js/app.js:460", "shortDescription": {"text": "Commented-code block (5 lines) in static/js/app.js:460"}, "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-64bae2bc757fa2da", "name": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/app.js:187", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/app.js:187"}, "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-dd92832a6e534e7e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/dashboard.js:203", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/dashboard.js:203"}, "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-d26790fcd6168e51", "name": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/programa_nocturno.js:532", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/programa_nocturno.js:532"}, "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-682f5e6c59aee9d9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/notices.js:95", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/notices.js:95"}, "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-7a4397e0275074ab", "name": "Commented-code block (5 lines) in static/js/sidebar.js:366", "shortDescription": {"text": "Commented-code block (5 lines) in static/js/sidebar.js:366"}, "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-8136c94e488ae085", "name": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/sidebar.js:1114", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/sidebar.js:1114"}, "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-1ea8ef63c98f780a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/lubrication.js:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/lubrication.js:7"}, "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-a82b7d34800a30cd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/shutdowns.js:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/shutdowns.js:36"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8a88282f59f5ccc8", "name": "Commented-code block (5 lines) in static/js/rotative_assets.js:690", "shortDescription": {"text": "Commented-code block (5 lines) in static/js/rotative_assets.js:690"}, "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-6dfd2518273370b1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/thickness.js:124", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/thickness.js:124"}, "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-c29f5f4e669e763f", "name": "Commented-code block (5 lines) in static/js/work_orders.js:533", "shortDescription": {"text": "Commented-code block (5 lines) in static/js/work_orders.js:533"}, "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-c21516c4b1cf1a8f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/work_orders.js:495", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/work_orders.js:495"}, "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-94625764a8753674", "name": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/cockpit.js:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/cockpit.js:73"}, "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-42b005c2ef9bcbd1", "name": "Legacy-named symbol `cmms_v2` in scripts/debug/check_tables.py:5", "shortDescription": {"text": "Legacy-named symbol `cmms_v2` in scripts/debug/check_tables.py:5"}, "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-6b3277ce32089b1a", "name": "Legacy-named symbol `cmms_v2` in scripts/debug/quick_check.py:5", "shortDescription": {"text": "Legacy-named symbol `cmms_v2` in scripts/debug/quick_check.py:5"}, "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-5f2bc868d93a9e0f", "name": "Legacy-named symbol `cmms_v2` in scripts/debug/inspect_db.py:5", "shortDescription": {"text": "Legacy-named symbol `cmms_v2` in scripts/debug/inspect_db.py:5"}, "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-c732863c8dc0e062", "name": "Legacy-named symbol `cmms_v2` in scripts/migrations/migrate_warehouse.py:5", "shortDescription": {"text": "Legacy-named symbol `cmms_v2` in scripts/migrations/migrate_warehouse.py:5"}, "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-362e6d8db9351062", "name": "Legacy-named symbol `cmms_v2` in scripts/migrations/migrate_notice_annul.py:5", "shortDescription": {"text": "Legacy-named symbol `cmms_v2` in scripts/migrations/migrate_notice_annul.py:5"}, "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-06cc5ed858de7407", "name": "Legacy-named symbol `cmms_v2` in scripts/migrations/migrate_warehouse_mgmt.py:5", "shortDescription": {"text": "Legacy-named symbol `cmms_v2` in scripts/migrations/migrate_warehouse_mgmt.py:5"}, "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-ef1e9e9859bbfb56", "name": "Legacy-named symbol `cmms_v2` in scripts/migrations/migrate_purchase_req.py:5", "shortDescription": {"text": "Legacy-named symbol `cmms_v2` in scripts/migrations/migrate_purchase_req.py:5"}, "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-022a276d9dc13767", "name": "Legacy-named symbol `cmms_v2` in scripts/migrations/migrate_to_supabase.py:15", "shortDescription": {"text": "Legacy-named symbol `cmms_v2` in scripts/migrations/migrate_to_supabase.py:15"}, "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-f3d898abc6d658e1", "name": "Legacy-named symbol `cmms_v2` in scripts/migrations/migrate_db.py:4", "shortDescription": {"text": "Legacy-named symbol `cmms_v2` in scripts/migrations/migrate_db.py:4"}, "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-4c52fbddc6076fe1", "name": "Network/subprocess call without timeout or try/except \u2014 utils/photo_helpers.py:66", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 utils/photo_helpers.py:66"}, "fullDescription": {"text": "`requests.post(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2ad7d52991660044", "name": "Commented-code block (5 lines) in bot/context.py:55", "shortDescription": {"text": "Commented-code block (5 lines) in bot/context.py: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-1623532ae4b0a434", "name": "Commented-code block (5 lines) in bot/resolvers.py:74", "shortDescription": {"text": "Commented-code block (5 lines) in bot/resolvers.py:74"}, "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-6c0c5b1850dd4d9a", "name": "Commented-code block (5 lines) in bot/telegram_bot.py:67", "shortDescription": {"text": "Commented-code block (5 lines) in bot/telegram_bot.py:67"}, "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-44de54b43620baaa", "name": "Commented-code block (8 lines) in routes/production_routes.py:629", "shortDescription": {"text": "Commented-code block (8 lines) in routes/production_routes.py:629"}, "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-157fd69bdab132ce", "name": "Commented-code block (6 lines) in routes/lubrication_routes.py:338", "shortDescription": {"text": "Commented-code block (6 lines) in routes/lubrication_routes.py:338"}, "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-f55ea30130f63e29", "name": "Commented-code block (5 lines) in routes/plant_flow_routes.py:161", "shortDescription": {"text": "Commented-code block (5 lines) in routes/plant_flow_routes.py:161"}, "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-ebb97d0c6930fe1b", "name": "Commented-code block (5 lines) in routes/work_orders_routes.py:318", "shortDescription": {"text": "Commented-code block (5 lines) in routes/work_orders_routes.py:318"}, "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-74c95936873355c5", "name": "Legacy-named symbol `powerbi_work_orders_v2` in routes/reports_routes.py:1183", "shortDescription": {"text": "Legacy-named symbol `powerbi_work_orders_v2` in routes/reports_routes.py:1183"}, "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-d036c3992a894bec", "name": "Commented-code block (5 lines) in routes/shutdown_routes.py:105", "shortDescription": {"text": "Commented-code block (5 lines) in routes/shutdown_routes.py:105"}, "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-417456cff07471fe", "name": "Commented-code block (7 lines) in routes/core_routes.py:1004", "shortDescription": {"text": "Commented-code block (7 lines) in routes/core_routes.py:1004"}, "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-fb6ec9c3aed313ab", "name": "Commented-code block (5 lines) in routes/weekly_plan_routes.py:347", "shortDescription": {"text": "Commented-code block (5 lines) in routes/weekly_plan_routes.py:347"}, "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-aa5f2ac876561fee", "name": "Commented-code block (6 lines) in routes/admin_routes.py:170", "shortDescription": {"text": "Commented-code block (6 lines) in routes/admin_routes.py:170"}, "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-8e047ab7af03962f", "name": "7 env vars used in code but missing from .env.example", "shortDescription": {"text": "7 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ALLOW_DB_RESET`, `CMMS_ADMIN_TOKEN`, `CMMS_AUTO_CREATE_TABLES`, `SQLITE_SOURCE_DB`, `SUPABASE_ANON_KEY`, `SUPABASE_SERVICE_KEY`, `SUPABASE_URL`. 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-65186ed837be1097", "name": "Near-duplicate function bodies in 58 places", "shortDescription": {"text": "Near-duplicate function bodies in 58 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nmodels.py:to_dict, models.py:to_dict, models.py:to_dict, models.py:to_dict\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-33a6b62e30ce7ab4", "name": "Near-duplicate function bodies in 6 places", "shortDescription": {"text": "Near-duplicate function bodies in 6 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/_archive/models_backup.py:to_dict, scripts/_archive/models_backup.py:to_dict, scripts/_archive/models_backup.py:to_dict, scripts/_archive/models_backup.py:to_dict\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/migrations/migrate_warehouse.py:migrate_db, scripts/migrations/migrate_notice_annul.py:migrate_db, scripts/migrations/migrate_warehouse_mgmt.py:migrate_db\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/migrations/migrate_role_permissions_add_ot_flags.py:migrate, scripts/migrations/migrate_role_permissions_8flags.py:migrate\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-af0cef51088d6dca", "name": "Flask mutation route `create_production_goal` without `@login_required` \u2014 routes/production_routes.py:327", "shortDescription": {"text": "Flask mutation route `create_production_goal` without `@login_required` \u2014 routes/production_routes.py:327"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b0bf5f6640b43abb", "name": "Flask mutation route `update_production_goal` without `@login_required` \u2014 routes/production_routes.py:370", "shortDescription": {"text": "Flask mutation route `update_production_goal` without `@login_required` \u2014 routes/production_routes.py:370"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-704a2cf3ab0025f2", "name": "Flask mutation route `delete_production_goal` without `@login_required` \u2014 routes/production_routes.py:394", "shortDescription": {"text": "Flask mutation route `delete_production_goal` without `@login_required` \u2014 routes/production_routes.py:394"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8cd0cb7e437681ee", "name": "Flask mutation route `production_ai_diagnosis` without `@login_required` \u2014 routes/production_routes.py:455", "shortDescription": {"text": "Flask mutation route `production_ai_diagnosis` without `@login_required` \u2014 routes/production_routes.py:455"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4052c5209a810c82", "name": "Flask mutation route `handle_lubrication_points` without `@login_required` \u2014 routes/lubrication_routes.py:190", "shortDescription": {"text": "Flask mutation route `handle_lubrication_points` without `@login_required` \u2014 routes/lubrication_routes.py:190"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a76d7acb9cc476e9", "name": "Flask mutation route `handle_lubrication_point_id` without `@login_required` \u2014 routes/lubrication_routes.py:261", "shortDescription": {"text": "Flask mutation route `handle_lubrication_point_id` without `@login_required` \u2014 routes/lubrication_routes.py:261"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0366d10263985254", "name": "Flask mutation route `handle_lubrication_executions` without `@login_required` \u2014 routes/lubrication_routes.py:307", "shortDescription": {"text": "Flask mutation route `handle_lubrication_executions` without `@login_required` \u2014 routes/lubrication_routes.py:307"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-998e52d2fbc34b74", "name": "Flask mutation route `delete_lubrication_execution` without `@login_required` \u2014 routes/lubrication_routes.py:414", "shortDescription": {"text": "Flask mutation route `delete_lubrication_execution` without `@login_required` \u2014 routes/lubrication_routes.py:414"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-84f337a12c47ba8d", "name": "Flask mutation route `handle_activities` without `@login_required` \u2014 routes/activity_routes.py:8", "shortDescription": {"text": "Flask mutation route `handle_activities` without `@login_required` \u2014 routes/activity_routes.py:8"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e2b2c44b9623b008", "name": "Flask mutation route `handle_activity_id` without `@login_required` \u2014 routes/activity_routes.py:49", "shortDescription": {"text": "Flask mutation route `handle_activity_id` without `@login_required` \u2014 routes/activity_routes.py:49"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ea0458b8187c3032", "name": "Flask mutation route `handle_milestones` without `@login_required` \u2014 routes/activity_routes.py:78", "shortDescription": {"text": "Flask mutation route `handle_milestones` without `@login_required` \u2014 routes/activity_routes.py:78"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b7af538be443d72b", "name": "Flask mutation route `handle_milestone_id` without `@login_required` \u2014 routes/activity_routes.py:115", "shortDescription": {"text": "Flask mutation route `handle_milestone_id` without `@login_required` \u2014 routes/activity_routes.py:115"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-eb5f35fb10a7f7d4", "name": "Flask mutation route `handle_rotative_assets` without `@login_required` \u2014 routes/rotative_assets_routes.py:59", "shortDescription": {"text": "Flask mutation route `handle_rotative_assets` without `@login_required` \u2014 routes/rotative_assets_routes.py:59"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a822c1469e9cd5b2", "name": "Flask mutation route `handle_rotative_asset_id` without `@login_required` \u2014 routes/rotative_assets_routes.py:120", "shortDescription": {"text": "Flask mutation route `handle_rotative_asset_id` without `@login_required` \u2014 routes/rotative_assets_routes.py:120"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-23768332b50f635a", "name": "Flask mutation route `install_rotative_asset` without `@login_required` \u2014 routes/rotative_assets_routes.py:156", "shortDescription": {"text": "Flask mutation route `install_rotative_asset` without `@login_required` \u2014 routes/rotative_assets_routes.py:156"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fcfddbb4dc3f0286", "name": "Flask mutation route `remove_rotative_asset` without `@login_required` \u2014 routes/rotative_assets_routes.py:177", "shortDescription": {"text": "Flask mutation route `remove_rotative_asset` without `@login_required` \u2014 routes/rotative_assets_routes.py:177"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ed3f642af9a981a5", "name": "Flask mutation route `handle_rotative_specs` without `@login_required` \u2014 routes/rotative_assets_routes.py:203", "shortDescription": {"text": "Flask mutation route `handle_rotative_specs` without `@login_required` \u2014 routes/rotative_assets_routes.py:203"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fcc37aed7d7ad6ab", "name": "Flask mutation route `delete_rotative_spec` without `@login_required` \u2014 routes/rotative_assets_routes.py:257", "shortDescription": {"text": "Flask mutation route `delete_rotative_spec` without `@login_required` \u2014 routes/rotative_assets_routes.py:257"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d4be663b6d9cb330", "name": "Flask mutation route `handle_asset_bom` without `@login_required` \u2014 routes/rotative_assets_routes.py:273", "shortDescription": {"text": "Flask mutation route `handle_asset_bom` without `@login_required` \u2014 routes/rotative_assets_routes.py:273"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e7b66a7e65280e1a", "name": "Flask mutation route `delete_asset_bom` without `@login_required` \u2014 routes/rotative_assets_routes.py:334", "shortDescription": {"text": "Flask mutation route `delete_asset_bom` without `@login_required` \u2014 routes/rotative_assets_routes.py:334"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e362fbff6e106d3d", "name": "Flask mutation route `swap_rotative_assets` without `@login_required` \u2014 routes/rotative_assets_routes.py:345", "shortDescription": {"text": "Flask mutation route `swap_rotative_assets` without `@login_required` \u2014 routes/rotative_assets_routes.py:345"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f0edfad89bc156d0", "name": "Flask mutation route `upload_excel` without `@login_required` \u2014 routes/data_import_routes.py:207", "shortDescription": {"text": "Flask mutation route `upload_excel` without `@login_required` \u2014 routes/data_import_routes.py:207"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-37b4857410021e74", "name": "Flask mutation route `bulk_paste` without `@login_required` \u2014 routes/data_import_routes.py:251", "shortDescription": {"text": "Flask mutation route `bulk_paste` without `@login_required` \u2014 routes/data_import_routes.py:251"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d42a99bfc7cd0772", "name": "Flask mutation route `bulk_paste_hierarchy` without `@login_required` \u2014 routes/data_import_routes.py:343", "shortDescription": {"text": "Flask mutation route `bulk_paste_hierarchy` without `@login_required` \u2014 routes/data_import_routes.py:343"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c89f4d997a6cd1f4", "name": "Flask mutation route `apply_optimization` without `@login_required` \u2014 routes/insights_routes.py:87", "shortDescription": {"text": "Flask mutation route `apply_optimization` without `@login_required` \u2014 routes/insights_routes.py:87"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bbcba1a005f119e9", "name": "Flask mutation route `insights_narrative` without `@login_required` \u2014 routes/insights_routes.py:389", "shortDescription": {"text": "Flask mutation route `insights_narrative` without `@login_required` \u2014 routes/insights_routes.py:389"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-251b4abf1e75007a", "name": "Flask mutation route `handle_requests` without `@login_required` \u2014 routes/purchasing_routes.py:14", "shortDescription": {"text": "Flask mutation route `handle_requests` without `@login_required` \u2014 routes/purchasing_routes.py:14"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-22d3142476085b9a", "name": "Flask mutation route `handle_orders` without `@login_required` \u2014 routes/purchasing_routes.py:52", "shortDescription": {"text": "Flask mutation route `handle_orders` without `@login_required` \u2014 routes/purchasing_routes.py:52"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-08817183a2412bf6", "name": "Flask mutation route `receive_po_items` without `@login_required` \u2014 routes/purchasing_routes.py:157", "shortDescription": {"text": "Flask mutation route `receive_po_items` without `@login_required` \u2014 routes/purchasing_routes.py:157"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ecb109a11e05a410", "name": "Flask mutation route `close_po` without `@login_required` \u2014 routes/purchasing_routes.py:172", "shortDescription": {"text": "Flask mutation route `close_po` without `@login_required` \u2014 routes/purchasing_routes.py:172"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-65178a57735073e5", "name": "Flask mutation route `update_po_external_code` without `@login_required` \u2014 routes/purchasing_routes.py:185", "shortDescription": {"text": "Flask mutation route `update_po_external_code` without `@login_required` \u2014 routes/purchasing_routes.py:185"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3f146558fd2c2645", "name": "Flask mutation route `handle_hammer_batches` without `@login_required` \u2014 routes/hammer_batches_routes.py:71", "shortDescription": {"text": "Flask mutation route `handle_hammer_batches` without `@login_required` \u2014 routes/hammer_batches_routes.py:71"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-eef075ebfb87dc75", "name": "Flask mutation route `handle_hammer_batch_id` without `@login_required` \u2014 routes/hammer_batches_routes.py:120", "shortDescription": {"text": "Flask mutation route `handle_hammer_batch_id` without `@login_required` \u2014 routes/hammer_batches_routes.py:120"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-533aa1e7392666c3", "name": "Flask mutation route `discard_hammer_batch` without `@login_required` \u2014 routes/hammer_batches_routes.py:147", "shortDescription": {"text": "Flask mutation route `discard_hammer_batch` without `@login_required` \u2014 routes/hammer_batches_routes.py:147"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2515a9eec8a5bfba", "name": "Flask mutation route `receive_refilled_batch` without `@login_required` \u2014 routes/hammer_batches_routes.py:179", "shortDescription": {"text": "Flask mutation route `receive_refilled_batch` without `@login_required` \u2014 routes/hammer_batches_routes.py:179"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c9db35b3a99144d1", "name": "Flask mutation route `change_hammer_batch` without `@login_required` \u2014 routes/hammer_batches_routes.py:207", "shortDescription": {"text": "Flask mutation route `change_hammer_batch` without `@login_required` \u2014 routes/hammer_batches_routes.py:207"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3998974626eb1a62", "name": "Flask mutation route `api_plant_flow_bulk_update` without `@login_required` \u2014 routes/plant_flow_routes.py:428", "shortDescription": {"text": "Flask mutation route `api_plant_flow_bulk_update` without `@login_required` \u2014 routes/plant_flow_routes.py:428"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ff65c2ba425b1da9", "name": "Flask mutation route `api_plant_flow_seed_from_pdf` without `@login_required` \u2014 routes/plant_flow_routes.py:627", "shortDescription": {"text": "Flask mutation route `api_plant_flow_seed_from_pdf` without `@login_required` \u2014 routes/plant_flow_routes.py:627"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4871e70fe5d45957", "name": "Flask mutation route `api_bypass_create` without `@login_required` \u2014 routes/plant_flow_routes.py:735", "shortDescription": {"text": "Flask mutation route `api_bypass_create` without `@login_required` \u2014 routes/plant_flow_routes.py:735"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-34fbe7cc6599cb96", "name": "Flask mutation route `api_bypass_delete` without `@login_required` \u2014 routes/plant_flow_routes.py:771", "shortDescription": {"text": "Flask mutation route `api_bypass_delete` without `@login_required` \u2014 routes/plant_flow_routes.py:771"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8244f24c224db050", "name": "Flask mutation route `handle_inspection_routes` without `@login_required` \u2014 routes/inspection_routes.py:17", "shortDescription": {"text": "Flask mutation route `handle_inspection_routes` without `@login_required` \u2014 routes/inspection_routes.py:17"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dec94bd699605750", "name": "Flask mutation route `handle_inspection_route_id` without `@login_required` \u2014 routes/inspection_routes.py:65", "shortDescription": {"text": "Flask mutation route `handle_inspection_route_id` without `@login_required` \u2014 routes/inspection_routes.py:65"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-456b44282cbaf991", "name": "Flask mutation route `duplicate_inspection_route` without `@login_required` \u2014 routes/inspection_routes.py:90", "shortDescription": {"text": "Flask mutation route `duplicate_inspection_route` without `@login_required` \u2014 routes/inspection_routes.py:90"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-655c813202dfd768", "name": "Flask mutation route `handle_inspection_items` without `@login_required` \u2014 routes/inspection_routes.py:247", "shortDescription": {"text": "Flask mutation route `handle_inspection_items` without `@login_required` \u2014 routes/inspection_routes.py:247"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-10b8b6cef3beed33", "name": "Flask mutation route `handle_inspection_item_id` without `@login_required` \u2014 routes/inspection_routes.py:281", "shortDescription": {"text": "Flask mutation route `handle_inspection_item_id` without `@login_required` \u2014 routes/inspection_routes.py:281"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-67e01888a8d8632d", "name": "Flask mutation route `handle_inspection_executions` without `@login_required` \u2014 routes/inspection_routes.py:303", "shortDescription": {"text": "Flask mutation route `handle_inspection_executions` without `@login_required` \u2014 routes/inspection_routes.py:303"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b246985c5da0aa5e", "name": "Flask mutation route `generate_preventive_ots` without `@login_required` \u2014 routes/work_orders_routes.py:111", "shortDescription": {"text": "Flask mutation route `generate_preventive_ots` without `@login_required` \u2014 routes/work_orders_routes.py:111"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-98f14505f49043e0", "name": "Flask mutation route `handle_ot_log` without `@login_required` \u2014 routes/work_orders_routes.py:206", "shortDescription": {"text": "Flask mutation route `handle_ot_log` without `@login_required` \u2014 routes/work_orders_routes.py:206"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bcda2f57dc2476db", "name": "Flask mutation route `delete_ot_log` without `@login_required` \u2014 routes/work_orders_routes.py:240", "shortDescription": {"text": "Flask mutation route `delete_ot_log` without `@login_required` \u2014 routes/work_orders_routes.py:240"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c6aba6f50d5922b8", "name": "Flask mutation route `update_ot_report` without `@login_required` \u2014 routes/work_orders_routes.py:314", "shortDescription": {"text": "Flask mutation route `update_ot_report` without `@login_required` \u2014 routes/work_orders_routes.py:314"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5a7d8dd2f8f31b9a", "name": "Flask mutation route `update_ot_conformity` without `@login_required` \u2014 routes/work_orders_routes.py:344", "shortDescription": {"text": "Flask mutation route `update_ot_conformity` without `@login_required` \u2014 routes/work_orders_routes.py:344"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-656f3590358d1ef3", "name": "Flask mutation route `handle_ot_personnel` without `@login_required` \u2014 routes/work_orders_routes.py:456", "shortDescription": {"text": "Flask mutation route `handle_ot_personnel` without `@login_required` \u2014 routes/work_orders_routes.py:456"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-29bd417ea09c9c90", "name": "Flask mutation route `handle_ot_personnel_id` without `@login_required` \u2014 routes/work_orders_routes.py:555", "shortDescription": {"text": "Flask mutation route `handle_ot_personnel_id` without `@login_required` \u2014 routes/work_orders_routes.py:555"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7eabee68a5d360fc", "name": "Flask mutation route `handle_ot_materials` without `@login_required` \u2014 routes/work_orders_routes.py:576", "shortDescription": {"text": "Flask mutation route `handle_ot_materials` without `@login_required` \u2014 routes/work_orders_routes.py:576"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e86a40187d553314", "name": "Flask mutation route `handle_ot_material_id` without `@login_required` \u2014 routes/work_orders_routes.py:672", "shortDescription": {"text": "Flask mutation route `handle_ot_material_id` without `@login_required` \u2014 routes/work_orders_routes.py:672"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2c9145cd36102eff", "name": "Flask mutation route `handle_daily_round` without `@login_required` \u2014 routes/work_orders_routes.py:849", "shortDescription": {"text": "Flask mutation route `handle_daily_round` without `@login_required` \u2014 routes/work_orders_routes.py:849"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0790d360d33c8f78", "name": "Flask mutation route `handle_work_orders` without `@login_required` \u2014 routes/work_orders_routes.py:904", "shortDescription": {"text": "Flask mutation route `handle_work_orders` without `@login_required` \u2014 routes/work_orders_routes.py:904"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-05afab586f920802", "name": "Flask mutation route `patch_wot_hours` without `@login_required` \u2014 routes/work_orders_routes.py:1300", "shortDescription": {"text": "Flask mutation route `patch_wot_hours` without `@login_required` \u2014 routes/work_orders_routes.py:1300"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8e71e68390b0c3f9", "name": "Flask mutation route `handle_wot_id` without `@login_required` \u2014 routes/work_orders_routes.py:1442", "shortDescription": {"text": "Flask mutation route `handle_wot_id` without `@login_required` \u2014 routes/work_orders_routes.py:1442"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cacfbb90b08e012e", "name": "Flask mutation route `handle_notices` without `@login_required` \u2014 routes/notices_routes.py:19", "shortDescription": {"text": "Flask mutation route `handle_notices` without `@login_required` \u2014 routes/notices_routes.py:19"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4b0c8819471fb25b", "name": "Flask mutation route `handle_notice_id` without `@login_required` \u2014 routes/notices_routes.py:235", "shortDescription": {"text": "Flask mutation route `handle_notice_id` without `@login_required` \u2014 routes/notices_routes.py:235"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9330a06ac30e9ab2", "name": "Flask mutation route `patch_notice_reported_at` without `@login_required` \u2014 routes/notices_routes.py:285", "shortDescription": {"text": "Flask mutation route `patch_notice_reported_at` without `@login_required` \u2014 routes/notices_routes.py:285"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bb5b3365e0df9a9b", "name": "Flask mutation route `handle_providers` without `@login_required` \u2014 routes/master_data_routes.py:39", "shortDescription": {"text": "Flask mutation route `handle_providers` without `@login_required` \u2014 routes/master_data_routes.py:39"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3a3ef391bf73e20c", "name": "Flask mutation route `handle_provider_id` without `@login_required` \u2014 routes/master_data_routes.py:50", "shortDescription": {"text": "Flask mutation route `handle_provider_id` without `@login_required` \u2014 routes/master_data_routes.py:50"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2e9849cd36715c9d", "name": "Flask mutation route `handle_technicians` without `@login_required` \u2014 routes/master_data_routes.py:73", "shortDescription": {"text": "Flask mutation route `handle_technicians` without `@login_required` \u2014 routes/master_data_routes.py:73"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c355c7e98b36ea24", "name": "Flask mutation route `handle_technician_id` without `@login_required` \u2014 routes/master_data_routes.py:88", "shortDescription": {"text": "Flask mutation route `handle_technician_id` without `@login_required` \u2014 routes/master_data_routes.py:88"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8fa52309f040a32e", "name": "Flask mutation route `handle_areas` without `@login_required` \u2014 routes/master_data_routes.py:111", "shortDescription": {"text": "Flask mutation route `handle_areas` without `@login_required` \u2014 routes/master_data_routes.py:111"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-04642d1ed465f69c", "name": "Flask mutation route `handle_area_id` without `@login_required` \u2014 routes/master_data_routes.py:117", "shortDescription": {"text": "Flask mutation route `handle_area_id` without `@login_required` \u2014 routes/master_data_routes.py:117"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-44cd315f27404661", "name": "Flask mutation route `handle_lines` without `@login_required` \u2014 routes/master_data_routes.py:123", "shortDescription": {"text": "Flask mutation route `handle_lines` without `@login_required` \u2014 routes/master_data_routes.py:123"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-afecda0143065cdd", "name": "Flask mutation route `handle_line_id` without `@login_required` \u2014 routes/master_data_routes.py:129", "shortDescription": {"text": "Flask mutation route `handle_line_id` without `@login_required` \u2014 routes/master_data_routes.py:129"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-96725b41c09cf7a7", "name": "Flask mutation route `merge_lines` without `@login_required` \u2014 routes/master_data_routes.py:135", "shortDescription": {"text": "Flask mutation route `merge_lines` without `@login_required` \u2014 routes/master_data_routes.py:135"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-17370da0f5773c0a", "name": "Flask mutation route `handle_equipments` without `@login_required` \u2014 routes/master_data_routes.py:229", "shortDescription": {"text": "Flask mutation route `handle_equipments` without `@login_required` \u2014 routes/master_data_routes.py:229"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a88b92068f27bd56", "name": "Flask mutation route `handle_equipment_id` without `@login_required` \u2014 routes/master_data_routes.py:235", "shortDescription": {"text": "Flask mutation route `handle_equipment_id` without `@login_required` \u2014 routes/master_data_routes.py:235"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3f43f7456fd606d8", "name": "Flask mutation route `bulk_set_equipment_responsibility` without `@login_required` \u2014 routes/master_data_routes.py:241", "shortDescription": {"text": "Flask mutation route `bulk_set_equipment_responsibility` without `@login_required` \u2014 routes/master_data_routes.py:241"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4911136bad747f5d", "name": "Flask mutation route `handle_systems` without `@login_required` \u2014 routes/master_data_routes.py:268", "shortDescription": {"text": "Flask mutation route `handle_systems` without `@login_required` \u2014 routes/master_data_routes.py:268"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e4065cfcd17da8bf", "name": "Flask mutation route `handle_system_id` without `@login_required` \u2014 routes/master_data_routes.py:274", "shortDescription": {"text": "Flask mutation route `handle_system_id` without `@login_required` \u2014 routes/master_data_routes.py:274"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e3d2e66e7e6e58df", "name": "Flask mutation route `handle_components` without `@login_required` \u2014 routes/master_data_routes.py:280", "shortDescription": {"text": "Flask mutation route `handle_components` without `@login_required` \u2014 routes/master_data_routes.py:280"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4c42145ac0d03c14", "name": "Flask mutation route `handle_component_id` without `@login_required` \u2014 routes/master_data_routes.py:286", "shortDescription": {"text": "Flask mutation route `handle_component_id` without `@login_required` \u2014 routes/master_data_routes.py:286"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ec0ae2b6e91b1895", "name": "Flask mutation route `handle_spare_parts` without `@login_required` \u2014 routes/master_data_routes.py:292", "shortDescription": {"text": "Flask mutation route `handle_spare_parts` without `@login_required` \u2014 routes/master_data_routes.py:292"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a7b3157806933a06", "name": "Flask mutation route `handle_spare_part_id` without `@login_required` \u2014 routes/master_data_routes.py:298", "shortDescription": {"text": "Flask mutation route `handle_spare_part_id` without `@login_required` \u2014 routes/master_data_routes.py:298"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-13b48ff0de42c930", "name": "Flask mutation route `login` without `@login_required` \u2014 routes/auth_routes.py:25", "shortDescription": {"text": "Flask mutation route `login` without `@login_required` \u2014 routes/auth_routes.py:25"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cfd31bd8cccbde17", "name": "Flask mutation route `handle_shutdowns` without `@login_required` \u2014 routes/shutdown_routes.py:31", "shortDescription": {"text": "Flask mutation route `handle_shutdowns` without `@login_required` \u2014 routes/shutdown_routes.py:31"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5779ad63445c6de6", "name": "Flask mutation route `handle_shutdown_detail` without `@login_required` \u2014 routes/shutdown_routes.py:124", "shortDescription": {"text": "Flask mutation route `handle_shutdown_detail` without `@login_required` \u2014 routes/shutdown_routes.py:124"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b5eb483efd3375ea", "name": "Flask mutation route `create_ot_in_shutdown` without `@login_required` \u2014 routes/shutdown_routes.py:283", "shortDescription": {"text": "Flask mutation route `create_ot_in_shutdown` without `@login_required` \u2014 routes/shutdown_routes.py:283"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6b33e0f478be4c09", "name": "Flask mutation route `add_ot_to_shutdown` without `@login_required` \u2014 routes/shutdown_routes.py:364", "shortDescription": {"text": "Flask mutation route `add_ot_to_shutdown` without `@login_required` \u2014 routes/shutdown_routes.py:364"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-26ba360f14106081", "name": "Flask mutation route `remove_ot_from_shutdown` without `@login_required` \u2014 routes/shutdown_routes.py:384", "shortDescription": {"text": "Flask mutation route `remove_ot_from_shutdown` without `@login_required` \u2014 routes/shutdown_routes.py:384"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ee0c4ae157c6740b", "name": "Flask mutation route `handle_shutdown_templates` without `@login_required` \u2014 routes/shutdown_routes.py:524", "shortDescription": {"text": "Flask mutation route `handle_shutdown_templates` without `@login_required` \u2014 routes/shutdown_routes.py:524"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c7d7ef6a59d2c81d", "name": "Flask mutation route `handle_shutdown_template_detail` without `@login_required` \u2014 routes/shutdown_routes.py:556", "shortDescription": {"text": "Flask mutation route `handle_shutdown_template_detail` without `@login_required` \u2014 routes/shutdown_routes.py:556"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6581b760c9935a33", "name": "Flask mutation route `duplicate_shutdown_template` without `@login_required` \u2014 routes/shutdown_routes.py:585", "shortDescription": {"text": "Flask mutation route `duplicate_shutdown_template` without `@login_required` \u2014 routes/shutdown_routes.py:585"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-47c347765ec4b9e9", "name": "Flask mutation route `reorder_template_items` without `@login_required` \u2014 routes/shutdown_routes.py:628", "shortDescription": {"text": "Flask mutation route `reorder_template_items` without `@login_required` \u2014 routes/shutdown_routes.py:628"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-abafb513d982e689", "name": "Flask mutation route `add_template_item` without `@login_required` \u2014 routes/shutdown_routes.py:647", "shortDescription": {"text": "Flask mutation route `add_template_item` without `@login_required` \u2014 routes/shutdown_routes.py:647"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-59d30319a731fb7f", "name": "Flask mutation route `handle_template_item` without `@login_required` \u2014 routes/shutdown_routes.py:706", "shortDescription": {"text": "Flask mutation route `handle_template_item` without `@login_required` \u2014 routes/shutdown_routes.py:706"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e68c3528668336c1", "name": "Flask mutation route `apply_template_to_shutdown` without `@login_required` \u2014 routes/shutdown_routes.py:781", "shortDescription": {"text": "Flask mutation route `apply_template_to_shutdown` without `@login_required` \u2014 routes/shutdown_routes.py:781"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7fe6ae05478dc89c", "name": "Flask mutation route `handle_photos` without `@login_required` \u2014 routes/core_routes.py:702", "shortDescription": {"text": "Flask mutation route `handle_photos` without `@login_required` \u2014 routes/core_routes.py:702"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d858acf98877a779", "name": "Flask mutation route `delete_photo` without `@login_required` \u2014 routes/core_routes.py:767", "shortDescription": {"text": "Flask mutation route `delete_photo` without `@login_required` \u2014 routes/core_routes.py:767"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4767d8482893bd38", "name": "Flask mutation route `handle_specs` without `@login_required` \u2014 routes/core_routes.py:823", "shortDescription": {"text": "Flask mutation route `handle_specs` without `@login_required` \u2014 routes/core_routes.py:823"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-563d1399d7959f92", "name": "Flask mutation route `update_spec` without `@login_required` \u2014 routes/core_routes.py:847", "shortDescription": {"text": "Flask mutation route `update_spec` without `@login_required` \u2014 routes/core_routes.py:847"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ba5bd19cadd29600", "name": "Flask mutation route `delete_spec` without `@login_required` \u2014 routes/core_routes.py:864", "shortDescription": {"text": "Flask mutation route `delete_spec` without `@login_required` \u2014 routes/core_routes.py:864"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-28306e377b0edc5c", "name": "Flask mutation route `replicate_specs` without `@login_required` \u2014 routes/core_routes.py:875", "shortDescription": {"text": "Flask mutation route `replicate_specs` without `@login_required` \u2014 routes/core_routes.py:875"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3a06c3f4a8ee90cd", "name": "Flask mutation route `handle_doc_links` without `@login_required` \u2014 routes/core_routes.py:942", "shortDescription": {"text": "Flask mutation route `handle_doc_links` without `@login_required` \u2014 routes/core_routes.py:942"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b0d49bbfb959d55f", "name": "Flask mutation route `delete_doc_link` without `@login_required` \u2014 routes/core_routes.py:968", "shortDescription": {"text": "Flask mutation route `delete_doc_link` without `@login_required` \u2014 routes/core_routes.py:968"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-517b0f53b288f93b", "name": "Flask mutation route `create_failure_catalog` without `@login_required` \u2014 routes/core_routes.py:1121", "shortDescription": {"text": "Flask mutation route `create_failure_catalog` without `@login_required` \u2014 routes/core_routes.py:1121"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6d8cc294f3fa32c3", "name": "Flask mutation route `update_failure_catalog` without `@login_required` \u2014 routes/core_routes.py:1141", "shortDescription": {"text": "Flask mutation route `update_failure_catalog` without `@login_required` \u2014 routes/core_routes.py:1141"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-273d239979bc98e6", "name": "Flask mutation route `delete_failure_catalog` without `@login_required` \u2014 routes/core_routes.py:1163", "shortDescription": {"text": "Flask mutation route `delete_failure_catalog` without `@login_required` \u2014 routes/core_routes.py:1163"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-34bb0d4b86f5e895", "name": "Flask mutation route `increment_failure_catalog` without `@login_required` \u2014 routes/core_routes.py:1173", "shortDescription": {"text": "Flask mutation route `increment_failure_catalog` without `@login_required` \u2014 routes/core_routes.py:1173"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-137de13f19c807a6", "name": "Flask mutation route `seed_failure_catalog` without `@login_required` \u2014 routes/core_routes.py:1183", "shortDescription": {"text": "Flask mutation route `seed_failure_catalog` without `@login_required` \u2014 routes/core_routes.py:1183"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-596f6304e05f1dc0", "name": "Flask mutation route `mark_notifications_read` without `@login_required` \u2014 routes/core_routes.py:1479", "shortDescription": {"text": "Flask mutation route `mark_notifications_read` without `@login_required` \u2014 routes/core_routes.py:1479"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2dfa861f6677bf64", "name": "Flask mutation route `scan_notifications` without `@login_required` \u2014 routes/core_routes.py:1497", "shortDescription": {"text": "Flask mutation route `scan_notifications` without `@login_required` \u2014 routes/core_routes.py:1497"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ee5938cee3c4b0dc", "name": "Flask mutation route `import_warehouse_excel` without `@login_required` \u2014 routes/warehouse_routes.py:245", "shortDescription": {"text": "Flask mutation route `import_warehouse_excel` without `@login_required` \u2014 routes/warehouse_routes.py:245"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-56adff81895863bb", "name": "Flask mutation route `calculate_inventory_params` without `@login_required` \u2014 routes/warehouse_routes.py:393", "shortDescription": {"text": "Flask mutation route `calculate_inventory_params` without `@login_required` \u2014 routes/warehouse_routes.py:393"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-158d52e91b920494", "name": "Flask mutation route `handle_warehouse_movements` without `@login_required` \u2014 routes/warehouse_routes.py:516", "shortDescription": {"text": "Flask mutation route `handle_warehouse_movements` without `@login_required` \u2014 routes/warehouse_routes.py:516"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-52a047283c4f5714", "name": "Flask mutation route `handle_monitoring_points` without `@login_required` \u2014 routes/monitoring_routes.py:20", "shortDescription": {"text": "Flask mutation route `handle_monitoring_points` without `@login_required` \u2014 routes/monitoring_routes.py:20"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-13fbec8d45025e27", "name": "Flask mutation route `handle_monitoring_point_id` without `@login_required` \u2014 routes/monitoring_routes.py:112", "shortDescription": {"text": "Flask mutation route `handle_monitoring_point_id` without `@login_required` \u2014 routes/monitoring_routes.py:112"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-902ba11f9ebfcad8", "name": "Flask mutation route `handle_monitoring_readings` without `@login_required` \u2014 routes/monitoring_routes.py:149", "shortDescription": {"text": "Flask mutation route `handle_monitoring_readings` without `@login_required` \u2014 routes/monitoring_routes.py:149"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-58126bfbffed5af2", "name": "Flask mutation route `wp_create` without `@login_required` \u2014 routes/weekly_plan_routes.py:145", "shortDescription": {"text": "Flask mutation route `wp_create` without `@login_required` \u2014 routes/weekly_plan_routes.py:145"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-329d5556140d752b", "name": "Flask mutation route `wp_update` without `@login_required` \u2014 routes/weekly_plan_routes.py:201", "shortDescription": {"text": "Flask mutation route `wp_update` without `@login_required` \u2014 routes/weekly_plan_routes.py:201"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-72d578be314c0cfb", "name": "Flask mutation route `wp_delete` without `@login_required` \u2014 routes/weekly_plan_routes.py:222", "shortDescription": {"text": "Flask mutation route `wp_delete` without `@login_required` \u2014 routes/weekly_plan_routes.py:222"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b3688e0f8e1bc5a6", "name": "Flask mutation route `wp_publish` without `@login_required` \u2014 routes/weekly_plan_routes.py:234", "shortDescription": {"text": "Flask mutation route `wp_publish` without `@login_required` \u2014 routes/weekly_plan_routes.py:234"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f69ab2ad460a19b9", "name": "Flask mutation route `wp_auto_plan` without `@login_required` \u2014 routes/weekly_plan_routes.py:258", "shortDescription": {"text": "Flask mutation route `wp_auto_plan` without `@login_required` \u2014 routes/weekly_plan_routes.py:258"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2c10549aca970ffa", "name": "Flask mutation route `wp_item_add` without `@login_required` \u2014 routes/weekly_plan_routes.py:481", "shortDescription": {"text": "Flask mutation route `wp_item_add` without `@login_required` \u2014 routes/weekly_plan_routes.py:481"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-96b067564b7f443a", "name": "Flask mutation route `wp_item_update` without `@login_required` \u2014 routes/weekly_plan_routes.py:508", "shortDescription": {"text": "Flask mutation route `wp_item_update` without `@login_required` \u2014 routes/weekly_plan_routes.py:508"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4217d09fd05faff1", "name": "Flask mutation route `wp_item_delete` without `@login_required` \u2014 routes/weekly_plan_routes.py:531", "shortDescription": {"text": "Flask mutation route `wp_item_delete` without `@login_required` \u2014 routes/weekly_plan_routes.py:531"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9e11b0c1e682dc3c", "name": "Flask mutation route `wp_item_execute` without `@login_required` \u2014 routes/weekly_plan_routes.py:640", "shortDescription": {"text": "Flask mutation route `wp_item_execute` without `@login_required` \u2014 routes/weekly_plan_routes.py:640"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-096121643b05c17b", "name": "Flask mutation route `wp_public_execute` without `@login_required` \u2014 routes/weekly_plan_routes.py:690", "shortDescription": {"text": "Flask mutation route `wp_public_execute` without `@login_required` \u2014 routes/weekly_plan_routes.py:690"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cc07eef36ef276c3", "name": "Flask mutation route `handle_thickness_points` without `@login_required` \u2014 routes/thickness_routes.py:50", "shortDescription": {"text": "Flask mutation route `handle_thickness_points` without `@login_required` \u2014 routes/thickness_routes.py:50"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a978bd826fa99ec9", "name": "Flask mutation route `update_thickness_point` without `@login_required` \u2014 routes/thickness_routes.py:78", "shortDescription": {"text": "Flask mutation route `update_thickness_point` without `@login_required` \u2014 routes/thickness_routes.py:78"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bc6894647fcf06a3", "name": "Flask mutation route `handle_thickness_inspections` without `@login_required` \u2014 routes/thickness_routes.py:93", "shortDescription": {"text": "Flask mutation route `handle_thickness_inspections` without `@login_required` \u2014 routes/thickness_routes.py:93"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4e5d87ce1862a841", "name": "Flask mutation route `update_thickness_pdf_url` without `@login_required` \u2014 routes/thickness_routes.py:216", "shortDescription": {"text": "Flask mutation route `update_thickness_pdf_url` without `@login_required` \u2014 routes/thickness_routes.py:216"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-44b34d0dd6d877bb", "name": "Flask mutation route `edit_thickness_inspection` without `@login_required` \u2014 routes/thickness_routes.py:231", "shortDescription": {"text": "Flask mutation route `edit_thickness_inspection` without `@login_required` \u2014 routes/thickness_routes.py:231"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6db3579ece1a0043", "name": "Flask mutation route `handle_thickness_inspection_detail` without `@login_required` \u2014 routes/thickness_routes.py:310", "shortDescription": {"text": "Flask mutation route `handle_thickness_inspection_detail` without `@login_required` \u2014 routes/thickness_routes.py:310"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e648e8adbf70fe91", "name": "Flask mutation route `upload_thickness_template` without `@login_required` \u2014 routes/thickness_routes.py:668", "shortDescription": {"text": "Flask mutation route `upload_thickness_template` without `@login_required` \u2014 routes/thickness_routes.py:668"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-36bb3ab463a1d639", "name": "Flask mutation route `handle_tools` without `@login_required` \u2014 routes/tools_routes.py:9", "shortDescription": {"text": "Flask mutation route `handle_tools` without `@login_required` \u2014 routes/tools_routes.py:9"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ea82a6fc372e1144", "name": "Flask mutation route `handle_tool_id` without `@login_required` \u2014 routes/tools_routes.py:34", "shortDescription": {"text": "Flask mutation route `handle_tool_id` without `@login_required` \u2014 routes/tools_routes.py:34"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b907a490d29d12ac", "name": "Flask mutation route `import_tools_excel` without `@login_required` \u2014 routes/tools_routes.py:125", "shortDescription": {"text": "Flask mutation route `import_tools_excel` without `@login_required` \u2014 routes/tools_routes.py:125"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-da74022b872abcab", "name": "Flask mutation route `motor_tests` without `@login_required` \u2014 routes/motors_routes.py:156", "shortDescription": {"text": "Flask mutation route `motor_tests` without `@login_required` \u2014 routes/motors_routes.py:156"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-96f069938a64eaf9", "name": "Flask mutation route `motor_config` without `@login_required` \u2014 routes/motors_routes.py:286", "shortDescription": {"text": "Flask mutation route `motor_config` without `@login_required` \u2014 routes/motors_routes.py:286"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-05c5cb7cecd1aaf9", "name": "Flask mutation route `manage_motors` without `@login_required` \u2014 routes/motors_routes.py:334", "shortDescription": {"text": "Flask mutation route `manage_motors` without `@login_required` \u2014 routes/motors_routes.py:334"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-04f26f33aa5ece65", "name": "Flask mutation route `initialize_db` without `@login_required` \u2014 routes/admin_routes.py:10", "shortDescription": {"text": "Flask mutation route `initialize_db` without `@login_required` \u2014 routes/admin_routes.py:10"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-867a31bc17cff0d4", "name": "Flask mutation route `handle_requirements` without `@login_required` \u2014 routes/requirements_routes.py:27", "shortDescription": {"text": "Flask mutation route `handle_requirements` without `@login_required` \u2014 routes/requirements_routes.py:27"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e5636952223c789c", "name": "Flask mutation route `handle_requirement` without `@login_required` \u2014 routes/requirements_routes.py:94", "shortDescription": {"text": "Flask mutation route `handle_requirement` without `@login_required` \u2014 routes/requirements_routes.py:94"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-53dddc0d920b26d7", "name": "Flask mutation route `convert_requirement` without `@login_required` \u2014 routes/requirements_routes.py:146", "shortDescription": {"text": "Flask mutation route `convert_requirement` without `@login_required` \u2014 routes/requirements_routes.py:146"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-af309ecfa3152560", "name": "Dangling fetch: GET /api/indicators/area/${areaId}/equipments?${dateParams()} (static/js/indicators.js:66)", "shortDescription": {"text": "Dangling fetch: GET /api/indicators/area/${areaId}/equipments?${dateParams()} (static/js/indicators.js:66)"}, "fullDescription": {"text": "`static/js/indicators.js:66` calls `GET /api/indicators/area/${areaId}/equipments?${dateParams()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/indicators/area/<p>/equipments`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7ce84bcf2edf9996", "name": "Dangling fetch: GET /api/indicators/equipment/${equipId}/failures?${dateParams()} (static/js/indicators.js:78)", "shortDescription": {"text": "Dangling fetch: GET /api/indicators/equipment/${equipId}/failures?${dateParams()} (static/js/indicators.js:78)"}, "fullDescription": {"text": "`static/js/indicators.js:78` calls `GET /api/indicators/equipment/${equipId}/failures?${dateParams()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/indicators/equipment/<p>/failures`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6e2281dd5544c91a", "name": "Dangling fetch: PUT /api/purchase-orders/${poId}/external-code (static/js/purchasing.js:198)", "shortDescription": {"text": "Dangling fetch: PUT /api/purchase-orders/${poId}/external-code (static/js/purchasing.js:198)"}, "fullDescription": {"text": "`static/js/purchasing.js:198` calls `PUT /api/purchase-orders/${poId}/external-code` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/purchase-orders/<p>/external-code`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6000feb67149300b", "name": "Dangling fetch: POST /api/purchase-orders/${activeReceivePO.id}/receive (static/js/purchasing.js:332)", "shortDescription": {"text": "Dangling fetch: POST /api/purchase-orders/${activeReceivePO.id}/receive (static/js/purchasing.js:332)"}, "fullDescription": {"text": "`static/js/purchasing.js:332` calls `POST /api/purchase-orders/${activeReceivePO.id}/receive` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/purchase-orders/<p>/receive`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cd836666720d118b", "name": "Dangling fetch: GET /api/work-orders/by-code/${encodeURIComponent(otCode)} (static/js/purchasing.js:377)", "shortDescription": {"text": "Dangling fetch: GET /api/work-orders/by-code/${encodeURIComponent(otCode)} (static/js/purchasing.js:377)"}, "fullDescription": {"text": "`static/js/purchasing.js:377` calls `GET /api/work-orders/by-code/${encodeURIComponent(otCode)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work-orders/by-code/<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-b4fd48d8d3285177", "name": "Dangling fetch: DELETE /api/production/goals/${id} (static/js/produccion.js:477)", "shortDescription": {"text": "Dangling fetch: DELETE /api/production/goals/${id} (static/js/produccion.js:477)"}, "fullDescription": {"text": "`static/js/produccion.js:477` calls `DELETE /api/production/goals/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/production/goals/<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-bbe71e82dea097d8", "name": "Dangling fetch: GET /api/specs/${apiT}/${id} (static/js/app.js:746)", "shortDescription": {"text": "Dangling fetch: GET /api/specs/${apiT}/${id} (static/js/app.js:746)"}, "fullDescription": {"text": "`static/js/app.js:746` calls `GET /api/specs/${apiT}/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/specs/<p>/<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-1240da5f41d764c4", "name": "Dangling fetch: PUT /api/specs/${_editingSpecId.apiType}/${_editingSpecId.specId}/update (static/js/app.js:785)", "shortDescription": {"text": "Dangling fetch: PUT /api/specs/${_editingSpecId.apiType}/${_editingSpecId.specId}/update (static/js/app.js:785)"}, "fullDescription": {"text": "`static/js/app.js:785` calls `PUT /api/specs/${_editingSpecId.apiType}/${_editingSpecId.specId}/update` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/specs/<p>/<p>/update`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-da86778926ba7626", "name": "Dangling fetch: POST /api/specs/${_apiType(type)}/${id} (static/js/app.js:792)", "shortDescription": {"text": "Dangling fetch: POST /api/specs/${_apiType(type)}/${id} (static/js/app.js:792)"}, "fullDescription": {"text": "`static/js/app.js:792` calls `POST /api/specs/${_apiType(type)}/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/specs/<p>/<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-59887b632ffc2f9f", "name": "Dangling fetch: DELETE /api/specs/${apiType}/${specId}/delete (static/js/app.js:806)", "shortDescription": {"text": "Dangling fetch: DELETE /api/specs/${apiType}/${specId}/delete (static/js/app.js:806)"}, "fullDescription": {"text": "`static/js/app.js:806` calls `DELETE /api/specs/${apiType}/${specId}/delete` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/specs/<p>/<p>/delete`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9aa9adb70d0a5aba", "name": "Dangling fetch: GET /api/specs/${apiT}/${id} (static/js/app.js:1044)", "shortDescription": {"text": "Dangling fetch: GET /api/specs/${apiT}/${id} (static/js/app.js:1044)"}, "fullDescription": {"text": "`static/js/app.js:1044` calls `GET /api/specs/${apiT}/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/specs/<p>/<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-1e6d8d65dad2bbac", "name": "Dangling fetch: POST /api/specs/${apiT}/${id} (static/js/app.js:1056)", "shortDescription": {"text": "Dangling fetch: POST /api/specs/${apiT}/${id} (static/js/app.js:1056)"}, "fullDescription": {"text": "`static/js/app.js:1056` calls `POST /api/specs/${apiT}/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/specs/<p>/<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-a56d70b205c8047e", "name": "Dangling fetch: GET /api/doc-links/${apiT}/${id} (static/js/app.js:1074)", "shortDescription": {"text": "Dangling fetch: GET /api/doc-links/${apiT}/${id} (static/js/app.js:1074)"}, "fullDescription": {"text": "`static/js/app.js:1074` calls `GET /api/doc-links/${apiT}/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/doc-links/<p>/<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-6ad5c76d366ff849", "name": "Dangling fetch: POST /api/doc-links/${_apiType(type)}/${id} (static/js/app.js:1101)", "shortDescription": {"text": "Dangling fetch: POST /api/doc-links/${_apiType(type)}/${id} (static/js/app.js:1101)"}, "fullDescription": {"text": "`static/js/app.js:1101` calls `POST /api/doc-links/${_apiType(type)}/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/doc-links/<p>/<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-3022b28e007ff9ff", "name": "Dangling fetch: DELETE /api/doc-links/${docId} (static/js/app.js:1113)", "shortDescription": {"text": "Dangling fetch: DELETE /api/doc-links/${docId} (static/js/app.js:1113)"}, "fullDescription": {"text": "`static/js/app.js:1113` calls `DELETE /api/doc-links/${docId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/doc-links/<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-3926db5bfe43b7ae", "name": "Dangling fetch: POST /api/lines/${sourceId}/merge-into/${targetId} (static/js/app.js:1193)", "shortDescription": {"text": "Dangling fetch: POST /api/lines/${sourceId}/merge-into/${targetId} (static/js/app.js:1193)"}, "fullDescription": {"text": "`static/js/app.js:1193` calls `POST /api/lines/${sourceId}/merge-into/${targetId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/lines/<p>/merge-into/<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-0fa692b3e7f26bd4", "name": "Dangling fetch: GET /api/weekly-plans/${id} (static/js/programa_nocturno.js:60)", "shortDescription": {"text": "Dangling fetch: GET /api/weekly-plans/${id} (static/js/programa_nocturno.js:60)"}, "fullDescription": {"text": "`static/js/programa_nocturno.js:60` calls `GET /api/weekly-plans/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/weekly-plans/<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-07e771ca091368f2", "name": "Dangling fetch: PUT /api/weekly-plans/${_state.plan.id}/items/${itemId} (static/js/programa_nocturno.js:174)", "shortDescription": {"text": "Dangling fetch: PUT /api/weekly-plans/${_state.plan.id}/items/${itemId} (static/js/programa_nocturno.js:174)"}, "fullDescription": {"text": "`static/js/programa_nocturno.js:174` calls `PUT /api/weekly-plans/${_state.plan.id}/items/${itemId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/weekly-plans/<p>/items/<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-90066ea235dd1e06", "name": "Dangling fetch: POST /api/weekly-plans/${_state.plan.id}/auto-plan (static/js/programa_nocturno.js:250)", "shortDescription": {"text": "Dangling fetch: POST /api/weekly-plans/${_state.plan.id}/auto-plan (static/js/programa_nocturno.js:250)"}, "fullDescription": {"text": "`static/js/programa_nocturno.js:250` calls `POST /api/weekly-plans/${_state.plan.id}/auto-plan` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/weekly-plans/<p>/auto-plan`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-59a8edf9013945d3", "name": "Dangling fetch: POST /api/weekly-plans/${_state.plan.id}/publish (static/js/programa_nocturno.js:269)", "shortDescription": {"text": "Dangling fetch: POST /api/weekly-plans/${_state.plan.id}/publish (static/js/programa_nocturno.js:269)"}, "fullDescription": {"text": "`static/js/programa_nocturno.js:269` calls `POST /api/weekly-plans/${_state.plan.id}/publish` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/weekly-plans/<p>/publish`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ae2e733551e26d2e", "name": "Dangling fetch: GET /api/weekly-plans/${_state.plan.id}/matrix (static/js/programa_nocturno.js:333)", "shortDescription": {"text": "Dangling fetch: GET /api/weekly-plans/${_state.plan.id}/matrix (static/js/programa_nocturno.js:333)"}, "fullDescription": {"text": "`static/js/programa_nocturno.js:333` calls `GET /api/weekly-plans/${_state.plan.id}/matrix` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/weekly-plans/<p>/matrix`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cf634a2778bcec10", "name": "Dangling fetch: POST /api/weekly-plans/${_state.plan.id}/items/${it.id}/execute (static/js/programa_nocturno.js:445)", "shortDescription": {"text": "Dangling fetch: POST /api/weekly-plans/${_state.plan.id}/items/${it.id}/execute (static/js/programa_nocturno.js:445)"}, "fullDescription": {"text": "`static/js/programa_nocturno.js:445` calls `POST /api/weekly-plans/${_state.plan.id}/items/${it.id}/execute` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/weekly-plans/<p>/items/<p>/execute`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7645632d638b3915", "name": "Dangling fetch: DELETE /api/weekly-plans/${_state.plan.id} (static/js/programa_nocturno.js:463)", "shortDescription": {"text": "Dangling fetch: DELETE /api/weekly-plans/${_state.plan.id} (static/js/programa_nocturno.js:463)"}, "fullDescription": {"text": "`static/js/programa_nocturno.js:463` calls `DELETE /api/weekly-plans/${_state.plan.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/weekly-plans/<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-8ed5888adfcdddb6", "name": "Dangling fetch: POST /api/weekly-plans/${_state.plan.id}/items/${itemId}/execute (static/js/programa_nocturno.js:474)", "shortDescription": {"text": "Dangling fetch: POST /api/weekly-plans/${_state.plan.id}/items/${itemId}/execute (static/js/programa_nocturno.js:474)"}, "fullDescription": {"text": "`static/js/programa_nocturno.js:474` calls `POST /api/weekly-plans/${_state.plan.id}/items/${itemId}/execute` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/weekly-plans/<p>/items/<p>/execute`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7673d45728d3699f", "name": "Dangling fetch: DELETE /api/weekly-plans/${_state.plan.id}/items/${itemId} (static/js/programa_nocturno.js:490)", "shortDescription": {"text": "Dangling fetch: DELETE /api/weekly-plans/${_state.plan.id}/items/${itemId} (static/js/programa_nocturno.js:490)"}, "fullDescription": {"text": "`static/js/programa_nocturno.js:490` calls `DELETE /api/weekly-plans/${_state.plan.id}/items/${itemId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/weekly-plans/<p>/items/<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-6a08fee99b7d3492", "name": "Dangling fetch: POST /api/weekly-plans/${_state.plan.id}/items (static/js/programa_nocturno.js:576)", "shortDescription": {"text": "Dangling fetch: POST /api/weekly-plans/${_state.plan.id}/items (static/js/programa_nocturno.js:576)"}, "fullDescription": {"text": "`static/js/programa_nocturno.js:576` calls `POST /api/weekly-plans/${_state.plan.id}/items` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/weekly-plans/<p>/items`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6bee05639873cfb9", "name": "Dangling fetch: GET /api/notices/${id} (static/js/notices.js:524)", "shortDescription": {"text": "Dangling fetch: GET /api/notices/${id} (static/js/notices.js:524)"}, "fullDescription": {"text": "`static/js/notices.js:524` calls `GET /api/notices/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/notices/<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-65bfabc964fc70fa", "name": "Dangling fetch: PUT /api/notices/${id} (static/js/notices.js:915)", "shortDescription": {"text": "Dangling fetch: PUT /api/notices/${id} (static/js/notices.js:915)"}, "fullDescription": {"text": "`static/js/notices.js:915` calls `PUT /api/notices/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/notices/<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-ca7fa95a635184e6", "name": "Dangling fetch: PUT /api/notices/${id} (static/js/notices.js:943)", "shortDescription": {"text": "Dangling fetch: PUT /api/notices/${id} (static/js/notices.js:943)"}, "fullDescription": {"text": "`static/js/notices.js:943` calls `PUT /api/notices/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/notices/<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-b322d2b6c8c9ce2e", "name": "Dangling fetch: GET /api/notices/${noticeId} (static/js/notices.js:971)", "shortDescription": {"text": "Dangling fetch: GET /api/notices/${noticeId} (static/js/notices.js:971)"}, "fullDescription": {"text": "`static/js/notices.js:971` calls `GET /api/notices/${noticeId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/notices/<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-e8a110f17edd8d69", "name": "Dangling fetch: GET /api/photos/notice/${noticeId} (static/js/notices.js:1015)", "shortDescription": {"text": "Dangling fetch: GET /api/photos/notice/${noticeId} (static/js/notices.js:1015)"}, "fullDescription": {"text": "`static/js/notices.js:1015` calls `GET /api/photos/notice/${noticeId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/photos/notice/<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-0c200bf08e041932", "name": "Dangling fetch: POST /api/photos/notice/${noticeId} (static/js/notices.js:1048)", "shortDescription": {"text": "Dangling fetch: POST /api/photos/notice/${noticeId} (static/js/notices.js:1048)"}, "fullDescription": {"text": "`static/js/notices.js:1048` calls `POST /api/photos/notice/${noticeId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/photos/notice/<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-ad869c4af2461627", "name": "Dangling fetch: DELETE /api/photos/${photoId} (static/js/notices.js:1070)", "shortDescription": {"text": "Dangling fetch: DELETE /api/photos/${photoId} (static/js/notices.js:1070)"}, "fullDescription": {"text": "`static/js/notices.js:1070` calls `DELETE /api/photos/${photoId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/photos/<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-454310d20af4a204", "name": "Dangling fetch: GET /api/photo-share/generate/notice/${noticeId} (static/js/notices.js:1086)", "shortDescription": {"text": "Dangling fetch: GET /api/photo-share/generate/notice/${noticeId} (static/js/notices.js:1086)"}, "fullDescription": {"text": "`static/js/notices.js:1086` calls `GET /api/photo-share/generate/notice/${noticeId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/photo-share/generate/notice/<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-8d129dadcf780b3e", "name": "Dangling fetch: GET /api/shutdowns/${shutdownId} (static/js/shutdowns.js:95)", "shortDescription": {"text": "Dangling fetch: GET /api/shutdowns/${shutdownId} (static/js/shutdowns.js:95)"}, "fullDescription": {"text": "`static/js/shutdowns.js:95` calls `GET /api/shutdowns/${shutdownId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/shutdowns/<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-3cb09b7eb570f8a9", "name": "Dangling fetch: GET /api/shutdowns/${_activeShutdown.id}/suggestions (static/js/shutdowns.js:345)", "shortDescription": {"text": "Dangling fetch: GET /api/shutdowns/${_activeShutdown.id}/suggestions (static/js/shutdowns.js:345)"}, "fullDescription": {"text": "`static/js/shutdowns.js:345` calls `GET /api/shutdowns/${_activeShutdown.id}/suggestions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/shutdowns/<p>/suggestions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f9e5eb578f1608be", "name": "Dangling fetch: POST /api/shutdowns/${_activeShutdown.id}/add-ot (static/js/shutdowns.js:370)", "shortDescription": {"text": "Dangling fetch: POST /api/shutdowns/${_activeShutdown.id}/add-ot (static/js/shutdowns.js:370)"}, "fullDescription": {"text": "`static/js/shutdowns.js:370` calls `POST /api/shutdowns/${_activeShutdown.id}/add-ot` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/shutdowns/<p>/add-ot`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-422e44ed9cc4d9d2", "name": "Dangling fetch: POST /api/shutdowns/${shId}/work-orders (static/js/shutdowns.js:552)", "shortDescription": {"text": "Dangling fetch: POST /api/shutdowns/${shId}/work-orders (static/js/shutdowns.js:552)"}, "fullDescription": {"text": "`static/js/shutdowns.js:552` calls `POST /api/shutdowns/${shId}/work-orders` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/shutdowns/<p>/work-orders`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-331724329b885783", "name": "Dangling fetch: GET /api/shutdowns/${shId}/preventive-sources?source_type=${type} (static/js/shutdowns.js:617)", "shortDescription": {"text": "Dangling fetch: GET /api/shutdowns/${shId}/preventive-sources?source_type=${type} (static/js/shutdowns.js:617)"}, "fullDescription": {"text": "`static/js/shutdowns.js:617` calls `GET /api/shutdowns/${shId}/preventive-sources?source_type=${type}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/shutdowns/<p>/preventive-sources`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-84c98ff5dcf237de", "name": "Dangling fetch: DELETE /api/shutdowns/${_activeShutdown.id}/remove-ot/${otId} (static/js/shutdowns.js:704)", "shortDescription": {"text": "Dangling fetch: DELETE /api/shutdowns/${_activeShutdown.id}/remove-ot/${otId} (static/js/shutdowns.js:704)"}, "fullDescription": {"text": "`static/js/shutdowns.js:704` calls `DELETE /api/shutdowns/${_activeShutdown.id}/remove-ot/${otId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/shutdowns/<p>/remove-ot/<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-66968fce4db299da", "name": "Dangling fetch: DELETE /api/shutdowns/${_activeShutdown.id} (static/js/shutdowns.js:732)", "shortDescription": {"text": "Dangling fetch: DELETE /api/shutdowns/${_activeShutdown.id} (static/js/shutdowns.js:732)"}, "fullDescription": {"text": "`static/js/shutdowns.js:732` calls `DELETE /api/shutdowns/${_activeShutdown.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/shutdowns/<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-2e0688f303063cf1", "name": "Dangling fetch: POST /api/shutdowns/${shId}/apply-template/${tplId} (static/js/shutdowns.js:781)", "shortDescription": {"text": "Dangling fetch: POST /api/shutdowns/${shId}/apply-template/${tplId} (static/js/shutdowns.js:781)"}, "fullDescription": {"text": "`static/js/shutdowns.js:781` calls `POST /api/shutdowns/${shId}/apply-template/${tplId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/shutdowns/<p>/apply-template/<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-4a2c1fc294e1f513", "name": "Dangling fetch: POST /api/shutdowns/${shId}/apply-template/${tplId} (static/js/shutdowns.js:879)", "shortDescription": {"text": "Dangling fetch: POST /api/shutdowns/${shId}/apply-template/${tplId} (static/js/shutdowns.js:879)"}, "fullDescription": {"text": "`static/js/shutdowns.js:879` calls `POST /api/shutdowns/${shId}/apply-template/${tplId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/shutdowns/<p>/apply-template/<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-53abfab7bc9d0fbf", "name": "Dangling fetch: GET /api/thickness/points/${equipmentId} (static/js/thickness.js:124)", "shortDescription": {"text": "Dangling fetch: GET /api/thickness/points/${equipmentId} (static/js/thickness.js:124)"}, "fullDescription": {"text": "`static/js/thickness.js:124` calls `GET /api/thickness/points/${equipmentId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/thickness/points/<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-8eefb91b6fe22bdf", "name": "Dangling fetch: GET /api/thickness/inspections/${_editingInspectionId} (static/js/thickness.js:137)", "shortDescription": {"text": "Dangling fetch: GET /api/thickness/inspections/${_editingInspectionId} (static/js/thickness.js:137)"}, "fullDescription": {"text": "`static/js/thickness.js:137` calls `GET /api/thickness/inspections/${_editingInspectionId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/thickness/inspections/<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-478969d5b2194226", "name": "Dangling fetch: PUT /api/thickness/inspections/${inspectionId}/pdf (static/js/thickness.js:484)", "shortDescription": {"text": "Dangling fetch: PUT /api/thickness/inspections/${inspectionId}/pdf (static/js/thickness.js:484)"}, "fullDescription": {"text": "`static/js/thickness.js:484` calls `PUT /api/thickness/inspections/${inspectionId}/pdf` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/thickness/inspections/<p>/pdf`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d06a3226d2dc3447", "name": "Dangling fetch: DELETE /api/thickness/inspections/${inspectionId} (static/js/thickness.js:509)", "shortDescription": {"text": "Dangling fetch: DELETE /api/thickness/inspections/${inspectionId} (static/js/thickness.js:509)"}, "fullDescription": {"text": "`static/js/thickness.js:509` calls `DELETE /api/thickness/inspections/${inspectionId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/thickness/inspections/<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-6592b7e7c77a17bd", "name": "Dangling fetch: GET /api/thickness/points/${equipmentId} (static/js/thickness.js:533)", "shortDescription": {"text": "Dangling fetch: GET /api/thickness/points/${equipmentId} (static/js/thickness.js:533)"}, "fullDescription": {"text": "`static/js/thickness.js:533` calls `GET /api/thickness/points/${equipmentId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/thickness/points/<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-c04d4a015a77aad1", "name": "Dangling fetch: GET /api/thickness/analysis/${equipmentId} (static/js/thickness.js:535)", "shortDescription": {"text": "Dangling fetch: GET /api/thickness/analysis/${equipmentId} (static/js/thickness.js:535)"}, "fullDescription": {"text": "`static/js/thickness.js:535` calls `GET /api/thickness/analysis/${equipmentId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/thickness/analysis/<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-b3fee3434cbc7cc7", "name": "Dangling fetch: GET /api/thickness/history/${pointId} (static/js/thickness.js:635)", "shortDescription": {"text": "Dangling fetch: GET /api/thickness/history/${pointId} (static/js/thickness.js:635)"}, "fullDescription": {"text": "`static/js/thickness.js:635` calls `GET /api/thickness/history/${pointId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/thickness/history/<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-ced5673c00ff65be", "name": "Dangling fetch: DELETE /api/providers/${id} (static/js/work_orders.js:495)", "shortDescription": {"text": "Dangling fetch: DELETE /api/providers/${id} (static/js/work_orders.js:495)"}, "fullDescription": {"text": "`static/js/work_orders.js:495` calls `DELETE /api/providers/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/providers/<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-bc8329880cb4f5a7", "name": "Dangling fetch: POST /api/work_orders/${otId}/materials (static/js/work_orders.js:994)", "shortDescription": {"text": "Dangling fetch: POST /api/work_orders/${otId}/materials (static/js/work_orders.js:994)"}, "fullDescription": {"text": "`static/js/work_orders.js:994` calls `POST /api/work_orders/${otId}/materials` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/materials`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4665d973930a6a4f", "name": "Dangling fetch: PUT /api/notices/${noticeId} (static/js/work_orders.js:1086)", "shortDescription": {"text": "Dangling fetch: PUT /api/notices/${noticeId} (static/js/work_orders.js:1086)"}, "fullDescription": {"text": "`static/js/work_orders.js:1086` calls `PUT /api/notices/${noticeId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/notices/<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-90cf920f1243aa9f", "name": "Dangling fetch: PUT /api/work-orders/${id} (static/js/work_orders.js:1220)", "shortDescription": {"text": "Dangling fetch: PUT /api/work-orders/${id} (static/js/work_orders.js:1220)"}, "fullDescription": {"text": "`static/js/work_orders.js:1220` calls `PUT /api/work-orders/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work-orders/<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-fd55d72321482f71", "name": "Dangling fetch: PUT /api/work-orders/${id} (static/js/work_orders.js:1341)", "shortDescription": {"text": "Dangling fetch: PUT /api/work-orders/${id} (static/js/work_orders.js:1341)"}, "fullDescription": {"text": "`static/js/work_orders.js:1341` calls `PUT /api/work-orders/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work-orders/<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-aa4bb99428902114", "name": "Dangling fetch: GET /api/work_orders/${ot.id}/materials (static/js/work_orders.js:1419)", "shortDescription": {"text": "Dangling fetch: GET /api/work_orders/${ot.id}/materials (static/js/work_orders.js:1419)"}, "fullDescription": {"text": "`static/js/work_orders.js:1419` calls `GET /api/work_orders/${ot.id}/materials` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/materials`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4c7f31744f404ddf", "name": "Dangling fetch: GET /api/work_orders/${ot.id}/personnel (static/js/work_orders.js:1489)", "shortDescription": {"text": "Dangling fetch: GET /api/work_orders/${ot.id}/personnel (static/js/work_orders.js:1489)"}, "fullDescription": {"text": "`static/js/work_orders.js:1489` calls `GET /api/work_orders/${ot.id}/personnel` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/personnel`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1eb66e08f788cc4b", "name": "Dangling fetch: PUT /api/work-orders/${activeExecutionOT.id} (static/js/work_orders.js:1867)", "shortDescription": {"text": "Dangling fetch: PUT /api/work-orders/${activeExecutionOT.id} (static/js/work_orders.js:1867)"}, "fullDescription": {"text": "`static/js/work_orders.js:1867` calls `PUT /api/work-orders/${activeExecutionOT.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work-orders/<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-2b10665e8a322d38", "name": "Dangling fetch: PUT /api/notices/${activeExecutionOT.notice_id} (static/js/work_orders.js:1877)", "shortDescription": {"text": "Dangling fetch: PUT /api/notices/${activeExecutionOT.notice_id} (static/js/work_orders.js:1877)"}, "fullDescription": {"text": "`static/js/work_orders.js:1877` calls `PUT /api/notices/${activeExecutionOT.notice_id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/notices/<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-c06197513b908f79", "name": "Dangling fetch: POST /api/work_orders/${id}/log (static/js/work_orders.js:1918)", "shortDescription": {"text": "Dangling fetch: POST /api/work_orders/${id}/log (static/js/work_orders.js:1918)"}, "fullDescription": {"text": "`static/js/work_orders.js:1918` calls `POST /api/work_orders/${id}/log` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/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-484bd64397e766f5", "name": "Dangling fetch: GET /api/work_orders/${activeExecutionOT.id}/personnel (static/js/work_orders.js:1954)", "shortDescription": {"text": "Dangling fetch: GET /api/work_orders/${activeExecutionOT.id}/personnel (static/js/work_orders.js:1954)"}, "fullDescription": {"text": "`static/js/work_orders.js:1954` calls `GET /api/work_orders/${activeExecutionOT.id}/personnel` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/personnel`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7fb6d6df730df711", "name": "Dangling fetch: PUT /api/work-orders/${id} (static/js/work_orders.js:2162)", "shortDescription": {"text": "Dangling fetch: PUT /api/work-orders/${id} (static/js/work_orders.js:2162)"}, "fullDescription": {"text": "`static/js/work_orders.js:2162` calls `PUT /api/work-orders/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work-orders/<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-f4bfdbae51e0d423", "name": "Dangling fetch: PUT /api/work_orders/${id}/personnel/${p.id} (static/js/work_orders.js:2173)", "shortDescription": {"text": "Dangling fetch: PUT /api/work_orders/${id}/personnel/${p.id} (static/js/work_orders.js:2173)"}, "fullDescription": {"text": "`static/js/work_orders.js:2173` calls `PUT /api/work_orders/${id}/personnel/${p.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/personnel/<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-b348870431f61a79", "name": "Dangling fetch: POST /api/work_orders/${id}/personnel (static/js/work_orders.js:2180)", "shortDescription": {"text": "Dangling fetch: POST /api/work_orders/${id}/personnel (static/js/work_orders.js:2180)"}, "fullDescription": {"text": "`static/js/work_orders.js:2180` calls `POST /api/work_orders/${id}/personnel` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/personnel`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b30a824cd00a354f", "name": "Dangling fetch: POST /api/work_orders/${id}/log (static/js/work_orders.js:2197)", "shortDescription": {"text": "Dangling fetch: POST /api/work_orders/${id}/log (static/js/work_orders.js:2197)"}, "fullDescription": {"text": "`static/js/work_orders.js:2197` calls `POST /api/work_orders/${id}/log` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/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-ef2cf9e7e6c59fb0", "name": "Dangling fetch: PATCH /api/work-orders/${id}/hours (static/js/work_orders.js:2252)", "shortDescription": {"text": "Dangling fetch: PATCH /api/work-orders/${id}/hours (static/js/work_orders.js:2252)"}, "fullDescription": {"text": "`static/js/work_orders.js:2252` calls `PATCH /api/work-orders/${id}/hours` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work-orders/<p>/hours`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-750bc0b2fc04b816", "name": "Dangling fetch: GET /api/work_orders/${id}/personnel (static/js/work_orders.js:2273)", "shortDescription": {"text": "Dangling fetch: GET /api/work_orders/${id}/personnel (static/js/work_orders.js:2273)"}, "fullDescription": {"text": "`static/js/work_orders.js:2273` calls `GET /api/work_orders/${id}/personnel` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/personnel`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ddf9ddb94cd1ed08", "name": "Dangling fetch: GET /api/photo-share/generate/work_order/${otId} (static/js/work_orders.js:2300)", "shortDescription": {"text": "Dangling fetch: GET /api/photo-share/generate/work_order/${otId} (static/js/work_orders.js:2300)"}, "fullDescription": {"text": "`static/js/work_orders.js:2300` calls `GET /api/photo-share/generate/work_order/${otId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/photo-share/generate/work_order/<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-f92a7d0251df48c3", "name": "Dangling fetch: DELETE /api/technicians/${id} (static/js/work_orders.js:2452)", "shortDescription": {"text": "Dangling fetch: DELETE /api/technicians/${id} (static/js/work_orders.js:2452)"}, "fullDescription": {"text": "`static/js/work_orders.js:2452` calls `DELETE /api/technicians/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/technicians/<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-e050d39dbebc43d8", "name": "Dangling fetch: GET /api/photos/notice/${id} (static/js/work_orders.js:2652)", "shortDescription": {"text": "Dangling fetch: GET /api/photos/notice/${id} (static/js/work_orders.js:2652)"}, "fullDescription": {"text": "`static/js/work_orders.js:2652` calls `GET /api/photos/notice/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/photos/notice/<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-3b051bea0f2c1e65", "name": "Dangling fetch: PUT /api/notices/${noticeId} (static/js/work_orders.js:2674)", "shortDescription": {"text": "Dangling fetch: PUT /api/notices/${noticeId} (static/js/work_orders.js:2674)"}, "fullDescription": {"text": "`static/js/work_orders.js:2674` calls `PUT /api/notices/${noticeId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/notices/<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-f8a618a9c0eb53c6", "name": "Dangling fetch: PUT /api/notices/${noticeId} (static/js/work_orders.js:2688)", "shortDescription": {"text": "Dangling fetch: PUT /api/notices/${noticeId} (static/js/work_orders.js:2688)"}, "fullDescription": {"text": "`static/js/work_orders.js:2688` calls `PUT /api/notices/${noticeId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/notices/<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-5ba7fa438af9ba26", "name": "Dangling fetch: GET /api/notices/${noticeId} (static/js/work_orders.js:2703)", "shortDescription": {"text": "Dangling fetch: GET /api/notices/${noticeId} (static/js/work_orders.js:2703)"}, "fullDescription": {"text": "`static/js/work_orders.js:2703` calls `GET /api/notices/${noticeId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/notices/<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-0873d2d6b1e15ee4", "name": "Dangling fetch: GET /api/work_orders/${otId}/personnel (static/js/work_orders.js:2783)", "shortDescription": {"text": "Dangling fetch: GET /api/work_orders/${otId}/personnel (static/js/work_orders.js:2783)"}, "fullDescription": {"text": "`static/js/work_orders.js:2783` calls `GET /api/work_orders/${otId}/personnel` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/personnel`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8ba6487d724854a3", "name": "Dangling fetch: GET /api/work_orders/${otId}/log (static/js/work_orders.js:2858)", "shortDescription": {"text": "Dangling fetch: GET /api/work_orders/${otId}/log (static/js/work_orders.js:2858)"}, "fullDescription": {"text": "`static/js/work_orders.js:2858` calls `GET /api/work_orders/${otId}/log` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/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-bace259f7007fdb3", "name": "Dangling fetch: POST /api/work_orders/${activeExecutionOT.id}/log (static/js/work_orders.js:2905)", "shortDescription": {"text": "Dangling fetch: POST /api/work_orders/${activeExecutionOT.id}/log (static/js/work_orders.js:2905)"}, "fullDescription": {"text": "`static/js/work_orders.js:2905` calls `POST /api/work_orders/${activeExecutionOT.id}/log` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/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-3aa6922bef6f739e", "name": "Dangling fetch: DELETE /api/work_orders/${activeExecutionOT.id}/log/${logId} (static/js/work_orders.js:2921)", "shortDescription": {"text": "Dangling fetch: DELETE /api/work_orders/${activeExecutionOT.id}/log/${logId} (static/js/work_orders.js:2921)"}, "fullDescription": {"text": "`static/js/work_orders.js:2921` calls `DELETE /api/work_orders/${activeExecutionOT.id}/log/${logId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/log/<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-f7b459821f9412a8", "name": "Dangling fetch: PUT /api/work_orders/${activeExecutionOT.id}/conformity (static/js/work_orders.js:3024)", "shortDescription": {"text": "Dangling fetch: PUT /api/work_orders/${activeExecutionOT.id}/conformity (static/js/work_orders.js:3024)"}, "fullDescription": {"text": "`static/js/work_orders.js:3024` calls `PUT /api/work_orders/${activeExecutionOT.id}/conformity` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/conformity`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-850315298335a01a", "name": "Dangling fetch: DELETE /api/work_orders/${activeExecutionOT.id}/conformity (static/js/work_orders.js:3049)", "shortDescription": {"text": "Dangling fetch: DELETE /api/work_orders/${activeExecutionOT.id}/conformity (static/js/work_orders.js:3049)"}, "fullDescription": {"text": "`static/js/work_orders.js:3049` calls `DELETE /api/work_orders/${activeExecutionOT.id}/conformity` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/conformity`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-94d63d9f59fa15d1", "name": "Dangling fetch: PUT /api/work_orders/${activeExecutionOT.id}/report (static/js/work_orders.js:3078)", "shortDescription": {"text": "Dangling fetch: PUT /api/work_orders/${activeExecutionOT.id}/report (static/js/work_orders.js:3078)"}, "fullDescription": {"text": "`static/js/work_orders.js:3078` calls `PUT /api/work_orders/${activeExecutionOT.id}/report` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/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-e0c19fe14d20a20b", "name": "Dangling fetch: POST /api/work_orders/${otId}/materials (static/js/work_orders.js:3409)", "shortDescription": {"text": "Dangling fetch: POST /api/work_orders/${otId}/materials (static/js/work_orders.js:3409)"}, "fullDescription": {"text": "`static/js/work_orders.js:3409` calls `POST /api/work_orders/${otId}/materials` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/materials`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-351b3efe2c58d438", "name": "Dangling fetch: DELETE /api/work_orders/${otId}/materials/${id} (static/js/work_orders.js:3430)", "shortDescription": {"text": "Dangling fetch: DELETE /api/work_orders/${otId}/materials/${id} (static/js/work_orders.js:3430)"}, "fullDescription": {"text": "`static/js/work_orders.js:3430` calls `DELETE /api/work_orders/${otId}/materials/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/materials/<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-d816f242b2576c28", "name": "Dangling fetch: GET /api/work_orders/${otId}/personnel (static/js/work_orders.js:3440)", "shortDescription": {"text": "Dangling fetch: GET /api/work_orders/${otId}/personnel (static/js/work_orders.js:3440)"}, "fullDescription": {"text": "`static/js/work_orders.js:3440` calls `GET /api/work_orders/${otId}/personnel` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/personnel`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d1219281f0409231", "name": "Dangling fetch: POST /api/work_orders/${otId}/personnel (static/js/work_orders.js:3566)", "shortDescription": {"text": "Dangling fetch: POST /api/work_orders/${otId}/personnel (static/js/work_orders.js:3566)"}, "fullDescription": {"text": "`static/js/work_orders.js:3566` calls `POST /api/work_orders/${otId}/personnel` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/personnel`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-932ebec70e96c657", "name": "Dangling fetch: GET /api/work_orders/${otId}/materials (static/js/work_orders.js:3581)", "shortDescription": {"text": "Dangling fetch: GET /api/work_orders/${otId}/materials (static/js/work_orders.js:3581)"}, "fullDescription": {"text": "`static/js/work_orders.js:3581` calls `GET /api/work_orders/${otId}/materials` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/materials`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8ec262b542c73fc9", "name": "Dangling fetch: DELETE /api/work_orders/${otId}/materials/${id} (static/js/work_orders.js:3648)", "shortDescription": {"text": "Dangling fetch: DELETE /api/work_orders/${otId}/materials/${id} (static/js/work_orders.js:3648)"}, "fullDescription": {"text": "`static/js/work_orders.js:3648` calls `DELETE /api/work_orders/${otId}/materials/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/materials/<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-8edd84dae185dd3e", "name": "Dangling fetch: GET /api/work_orders/${otId}/personnel (static/js/work_orders.js:3658)", "shortDescription": {"text": "Dangling fetch: GET /api/work_orders/${otId}/personnel (static/js/work_orders.js:3658)"}, "fullDescription": {"text": "`static/js/work_orders.js:3658` calls `GET /api/work_orders/${otId}/personnel` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/personnel`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-97bdcca54341737f", "name": "Dangling fetch: POST /api/work_orders/${otId}/personnel (static/js/work_orders.js:3847)", "shortDescription": {"text": "Dangling fetch: POST /api/work_orders/${otId}/personnel (static/js/work_orders.js:3847)"}, "fullDescription": {"text": "`static/js/work_orders.js:3847` calls `POST /api/work_orders/${otId}/personnel` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/work_orders/<p>/personnel`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-757eb8c8895170c3", "name": "Dangling fetch: GET /api/photos/work_order/${otId} (static/js/work_orders.js:4261)", "shortDescription": {"text": "Dangling fetch: GET /api/photos/work_order/${otId} (static/js/work_orders.js:4261)"}, "fullDescription": {"text": "`static/js/work_orders.js:4261` calls `GET /api/photos/work_order/${otId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/photos/work_order/<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-65af4a6a04169e44", "name": "Dangling fetch: POST /api/photos/work_order/${activeExecutionOT.id} (static/js/work_orders.js:4292)", "shortDescription": {"text": "Dangling fetch: POST /api/photos/work_order/${activeExecutionOT.id} (static/js/work_orders.js:4292)"}, "fullDescription": {"text": "`static/js/work_orders.js:4292` calls `POST /api/photos/work_order/${activeExecutionOT.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/photos/work_order/<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-12ee0188ace1215a", "name": "Dangling fetch: DELETE /api/photos/${photoId} (static/js/work_orders.js:4314)", "shortDescription": {"text": "Dangling fetch: DELETE /api/photos/${photoId} (static/js/work_orders.js:4314)"}, "fullDescription": {"text": "`static/js/work_orders.js:4314` calls `DELETE /api/photos/${photoId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/photos/<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-dd34b8304db67726", "name": "Dangling fetch: GET /api/photos/notice/${noticeId} (static/js/work_orders.js:4331)", "shortDescription": {"text": "Dangling fetch: GET /api/photos/notice/${noticeId} (static/js/work_orders.js:4331)"}, "fullDescription": {"text": "`static/js/work_orders.js:4331` calls `GET /api/photos/notice/${noticeId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/photos/notice/<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-cde59710d8acb154", "name": "Dangling fetch: POST /api/requirements/${id}/convert (static/js/requirements.js:246)", "shortDescription": {"text": "Dangling fetch: POST /api/requirements/${id}/convert (static/js/requirements.js:246)"}, "fullDescription": {"text": "`static/js/requirements.js:246` calls `POST /api/requirements/${id}/convert` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/requirements/<p>/convert`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3e40eccf4bb30c1b", "name": "Unused endpoint: ANY /produccion", "shortDescription": {"text": "Unused endpoint: ANY /produccion"}, "fullDescription": {"text": "`routes/production_routes.py` declares `ANY /produccion` 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-dd999ff5469faece", "name": "Unused endpoint: ANY /api/production/goals", "shortDescription": {"text": "Unused endpoint: ANY /api/production/goals"}, "fullDescription": {"text": "`routes/production_routes.py` declares `ANY /api/production/goals` 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-f8440c98e34019a9", "name": "Unused endpoint: ANY /api/production/goals/<int:goal_id>", "shortDescription": {"text": "Unused endpoint: ANY /api/production/goals/<int:goal_id>"}, "fullDescription": {"text": "`routes/production_routes.py` declares `ANY /api/production/goals/<int:goal_id>` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ac1501991b99e38d", "name": "Unused endpoint: ANY /api/production/export", "shortDescription": {"text": "Unused endpoint: ANY /api/production/export"}, "fullDescription": {"text": "`routes/production_routes.py` declares `ANY /api/production/export` 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-9c038f4b5fdb9818", "name": "Unused endpoint: ANY /api/lubrication/points", "shortDescription": {"text": "Unused endpoint: ANY /api/lubrication/points"}, "fullDescription": {"text": "`routes/lubrication_routes.py` declares `ANY /api/lubrication/points` 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-a4080c29825448cf", "name": "Unused endpoint: ANY /api/lubrication/points/<int:point_id>", "shortDescription": {"text": "Unused endpoint: ANY /api/lubrication/points/<int:point_id>"}, "fullDescription": {"text": "`routes/lubrication_routes.py` declares `ANY /api/lubrication/points/<int:point_id>` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2a358a145419330f", "name": "Unused endpoint: ANY /api/lubrication/executions", "shortDescription": {"text": "Unused endpoint: ANY /api/lubrication/executions"}, "fullDescription": {"text": "`routes/lubrication_routes.py` declares `ANY /api/lubrication/executions` 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-ed7770b0781de658", "name": "Unused endpoint: ANY /api/lubrication/executions/<int:exec_id>", "shortDescription": {"text": "Unused endpoint: ANY /api/lubrication/executions/<int:exec_id>"}, "fullDescription": {"text": "`routes/lubrication_routes.py` declares `ANY /api/lubrication/executions/<int:exec_id>` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-291bfffb6cb442b2", "name": "Unused endpoint: ANY /api/lubrication/dashboard", "shortDescription": {"text": "Unused endpoint: ANY /api/lubrication/dashboard"}, "fullDescription": {"text": "`routes/lubrication_routes.py` declares `ANY /api/lubrication/dashboard` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-75f3083417e2c21f", "name": "Unused endpoint: ANY /api/activities", "shortDescription": {"text": "Unused endpoint: ANY /api/activities"}, "fullDescription": {"text": "`routes/activity_routes.py` declares `ANY /api/activities` 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-3a3fdb18a9686240", "name": "Unused endpoint: ANY /api/activities/<int:act_id>", "shortDescription": {"text": "Unused endpoint: ANY /api/activities/<int:act_id>"}, "fullDescription": {"text": "`routes/activity_routes.py` declares `ANY /api/activities/<int:act_id>` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bb0d7383c1da6dad", "name": "Unused endpoint: ANY /api/activities/<int:act_id>/milestones", "shortDescription": {"text": "Unused endpoint: ANY /api/activities/<int:act_id>/milestones"}, "fullDescription": {"text": "`routes/activity_routes.py` declares `ANY /api/activities/<int:act_id>/milestones` 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-e6398110e8a725a4", "name": "Unused endpoint: ANY /api/milestones/<int:ms_id>", "shortDescription": {"text": "Unused endpoint: ANY /api/milestones/<int:ms_id>"}, "fullDescription": {"text": "`routes/activity_routes.py` declares `ANY /api/milestones/<int:ms_id>` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6e939e0fd6a2b209", "name": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>", "shortDescription": {"text": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>"}, "fullDescription": {"text": "`routes/rotative_assets_routes.py` declares `ANY /api/rotative-assets/<int:asset_id>` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-926673127f79cf3f", "name": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>/install", "shortDescription": {"text": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>/install"}, "fullDescription": {"text": "`routes/rotative_assets_routes.py` declares `ANY /api/rotative-assets/<int:asset_id>/install` 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-deef3b603ceebadb", "name": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>/remove", "shortDescription": {"text": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>/remove"}, "fullDescription": {"text": "`routes/rotative_assets_routes.py` declares `ANY /api/rotative-assets/<int:asset_id>/remove` 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-d1de84eb25fa8e73", "name": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>/history", "shortDescription": {"text": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>/history"}, "fullDescription": {"text": "`routes/rotative_assets_routes.py` declares `ANY /api/rotative-assets/<int:asset_id>/history` 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-aad7dd60210ee379", "name": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>/specs", "shortDescription": {"text": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>/specs"}, "fullDescription": {"text": "`routes/rotative_assets_routes.py` declares `ANY /api/rotative-assets/<int:asset_id>/specs` 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-052054dc779112e2", "name": "Unused endpoint: ANY /api/rotative-assets/specs/<int:spec_id>", "shortDescription": {"text": "Unused endpoint: ANY /api/rotative-assets/specs/<int:spec_id>"}, "fullDescription": {"text": "`routes/rotative_assets_routes.py` declares `ANY /api/rotative-assets/specs/<int:spec_id>` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-165262d394ea26b3", "name": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>/bom", "shortDescription": {"text": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>/bom"}, "fullDescription": {"text": "`routes/rotative_assets_routes.py` declares `ANY /api/rotative-assets/<int:asset_id>/bom` 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-cdc5dda33287c975", "name": "Unused endpoint: ANY /api/rotative-assets/bom/<int:bom_id>", "shortDescription": {"text": "Unused endpoint: ANY /api/rotative-assets/bom/<int:bom_id>"}, "fullDescription": {"text": "`routes/rotative_assets_routes.py` declares `ANY /api/rotative-assets/bom/<int:bom_id>` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b71efe2fceb20be6", "name": "Unused endpoint: ANY /api/rotative-assets/swap", "shortDescription": {"text": "Unused endpoint: ANY /api/rotative-assets/swap"}, "fullDescription": {"text": "`routes/rotative_assets_routes.py` declares `ANY /api/rotative-assets/swap` 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-d9e52d3fdc5dfab1", "name": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>/full-history", "shortDescription": {"text": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>/full-history"}, "fullDescription": {"text": "`routes/rotative_assets_routes.py` declares `ANY /api/rotative-assets/<int:asset_id>/full-history` 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-e5c343c03bcd699c", "name": "Unused endpoint: ANY /api/export-data", "shortDescription": {"text": "Unused endpoint: ANY /api/export-data"}, "fullDescription": {"text": "`routes/data_import_routes.py` declares `ANY /api/export-data` 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-85c334bb7d067da3", "name": "Unused endpoint: ANY /api/export-hierarchy-complete", "shortDescription": {"text": "Unused endpoint: ANY /api/export-hierarchy-complete"}, "fullDescription": {"text": "`routes/data_import_routes.py` declares `ANY /api/export-hierarchy-complete` 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-c5caca404880ec81", "name": "Unused endpoint: ANY /api/download-template", "shortDescription": {"text": "Unused endpoint: ANY /api/download-template"}, "fullDescription": {"text": "`routes/data_import_routes.py` declares `ANY /api/download-template` 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-b961dc24e98e1102", "name": "Unused endpoint: ANY /insights", "shortDescription": {"text": "Unused endpoint: ANY /insights"}, "fullDescription": {"text": "`routes/insights_routes.py` declares `ANY /insights` 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-0c80383a701f450b", "name": "Unused endpoint: ANY /optimizacion-preventivos", "shortDescription": {"text": "Unused endpoint: ANY /optimizacion-preventivos"}, "fullDescription": {"text": "`routes/insights_routes.py` declares `ANY /optimizacion-preventivos` 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-692179188f50d8d6", "name": "Unused endpoint: ANY /api/insights/preventive-optimization", "shortDescription": {"text": "Unused endpoint: ANY /api/insights/preventive-optimization"}, "fullDescription": {"text": "`routes/insights_routes.py` declares `ANY /api/insights/preventive-optimization` 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-da10108ae0c2eb71", "name": "Unused endpoint: ANY /api/insights/preventive-optimization/apply", "shortDescription": {"text": "Unused endpoint: ANY /api/insights/preventive-optimization/apply"}, "fullDescription": {"text": "`routes/insights_routes.py` declares `ANY /api/insights/preventive-optimization/apply` 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-adc0494b0bfec492", "name": "Unused endpoint: ANY /cumplimiento-preventivos", "shortDescription": {"text": "Unused endpoint: ANY /cumplimiento-preventivos"}, "fullDescription": {"text": "`routes/insights_routes.py` declares `ANY /cumplimiento-preventivos` 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-3c08555c0a5c27b8", "name": "Unused endpoint: ANY /api/insights/preventive-compliance", "shortDescription": {"text": "Unused endpoint: ANY /api/insights/preventive-compliance"}, "fullDescription": {"text": "`routes/insights_routes.py` declares `ANY /api/insights/preventive-compliance` 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-1dfcc4029e00f629", "name": "Unused endpoint: ANY /api/insights/weekly-summary", "shortDescription": {"text": "Unused endpoint: ANY /api/insights/weekly-summary"}, "fullDescription": {"text": "`routes/insights_routes.py` declares `ANY /api/insights/weekly-summary` 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-cdd7b812a63c1a72", "name": "Unused endpoint: ANY /api/insights/narrative", "shortDescription": {"text": "Unused endpoint: ANY /api/insights/narrative"}, "fullDescription": {"text": "`routes/insights_routes.py` declares `ANY /api/insights/narrative` 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-fd3adebf42b44125", "name": "Unused endpoint: ANY /api/purchase-orders/<int:id>/receive", "shortDescription": {"text": "Unused endpoint: ANY /api/purchase-orders/<int:id>/receive"}, "fullDescription": {"text": "`routes/purchasing_routes.py` declares `ANY /api/purchase-orders/<int:id>/receive` 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-56491214aa673834", "name": "Unused endpoint: ANY /api/purchase-orders/<int:id>/close", "shortDescription": {"text": "Unused endpoint: ANY /api/purchase-orders/<int:id>/close"}, "fullDescription": {"text": "`routes/purchasing_routes.py` declares `ANY /api/purchase-orders/<int:id>/close` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-046ec82f122ea680", "name": "Unused endpoint: ANY /api/purchase-orders/<int:id>/external-code", "shortDescription": {"text": "Unused endpoint: ANY /api/purchase-orders/<int:id>/external-code"}, "fullDescription": {"text": "`routes/purchasing_routes.py` declares `ANY /api/purchase-orders/<int:id>/external-code` 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-b90529b806434502", "name": "Unused endpoint: ANY /operatividad-anual", "shortDescription": {"text": "Unused endpoint: ANY /operatividad-anual"}, "fullDescription": {"text": "`routes/operatividad_routes.py` declares `ANY /operatividad-anual` 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-062016e5f9beaa24", "name": "Unused endpoint: ANY /api/operatividad-anual/filters", "shortDescription": {"text": "Unused endpoint: ANY /api/operatividad-anual/filters"}, "fullDescription": {"text": "`routes/operatividad_routes.py` declares `ANY /api/operatividad-anual/filters` 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-45f81bcb15889ba7", "name": "Unused endpoint: ANY /api/operatividad-anual", "shortDescription": {"text": "Unused endpoint: ANY /api/operatividad-anual"}, "fullDescription": {"text": "`routes/operatividad_routes.py` declares `ANY /api/operatividad-anual` 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-41d193a0d0814205", "name": "Unused endpoint: ANY /api/operatividad-anual/cell", "shortDescription": {"text": "Unused endpoint: ANY /api/operatividad-anual/cell"}, "fullDescription": {"text": "`routes/operatividad_routes.py` declares `ANY /api/operatividad-anual/cell` 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-049d353ba33d5977", "name": "Unused endpoint: ANY /api/hammer-batches", "shortDescription": {"text": "Unused endpoint: ANY /api/hammer-batches"}, "fullDescription": {"text": "`routes/hammer_batches_routes.py` declares `ANY /api/hammer-batches` 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-c6b25b816566a70c", "name": "Unused endpoint: ANY /api/hammer-batches/<int:batch_id>", "shortDescription": {"text": "Unused endpoint: ANY /api/hammer-batches/<int:batch_id>"}, "fullDescription": {"text": "`routes/hammer_batches_routes.py` declares `ANY /api/hammer-batches/<int:batch_id>` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e2d7282e0c5a0d5a", "name": "Unused endpoint: ANY /api/hammer-batches/<int:batch_id>/discard", "shortDescription": {"text": "Unused endpoint: ANY /api/hammer-batches/<int:batch_id>/discard"}, "fullDescription": {"text": "`routes/hammer_batches_routes.py` declares `ANY /api/hammer-batches/<int:batch_id>/discard` 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-c3a11550ffc46b07", "name": "Unused endpoint: ANY /api/hammer-batches/<int:batch_id>/receive", "shortDescription": {"text": "Unused endpoint: ANY /api/hammer-batches/<int:batch_id>/receive"}, "fullDescription": {"text": "`routes/hammer_batches_routes.py` declares `ANY /api/hammer-batches/<int:batch_id>/receive` 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-af5ea95bd24c5837", "name": "Unused endpoint: ANY /api/hammer-batches/change", "shortDescription": {"text": "Unused endpoint: ANY /api/hammer-batches/change"}, "fullDescription": {"text": "`routes/hammer_batches_routes.py` declares `ANY /api/hammer-batches/change` 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-5513cbb48893b780", "name": "Unused endpoint: ANY /api/hammer-batches/state", "shortDescription": {"text": "Unused endpoint: ANY /api/hammer-batches/state"}, "fullDescription": {"text": "`routes/hammer_batches_routes.py` declares `ANY /api/hammer-batches/state` 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-42c0f46eb2a4f4cd", "name": "Unused endpoint: ANY /api/hammer-batches/changes-log", "shortDescription": {"text": "Unused endpoint: ANY /api/hammer-batches/changes-log"}, "fullDescription": {"text": "`routes/hammer_batches_routes.py` declares `ANY /api/hammer-batches/changes-log` 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-9abc063c7e4f935c", "name": "Unused endpoint: ANY /api/hammer-batches/conciliation", "shortDescription": {"text": "Unused endpoint: ANY /api/hammer-batches/conciliation"}, "fullDescription": {"text": "`routes/hammer_batches_routes.py` declares `ANY /api/hammer-batches/conciliation` 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-dd6a7f306b976111", "name": "Unused endpoint: ANY /flujo-planta", "shortDescription": {"text": "Unused endpoint: ANY /flujo-planta"}, "fullDescription": {"text": "`routes/plant_flow_routes.py` declares `ANY /flujo-planta` 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/24738"}, "properties": {"repository": "bryamlazo166/cmms-app", "repoUrl": "https://github.com/bryamlazo166/cmms-app", "branch": "main"}, "results": [{"ruleId": "scanner-08811a6ab760e824", "level": "note", "message": {"text": "Possibly dead Python function: deco"}, "properties": {"repobilityId": "11da05572c448654", "scanner": "scanner-primary", "fingerprint": "08811a6ab760e824", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app.py:708"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-321c66a3a6ece6ab", "level": "note", "message": {"text": "Possibly dead Python function: exempt"}, "properties": {"repobilityId": "2e8654e87b434d9b", "scanner": "scanner-primary", "fingerprint": "321c66a3a6ece6ab", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app.py:712"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2c08676d8a7dd3d3", "level": "note", "message": {"text": "Possibly dead Python function: ping"}, "properties": {"repobilityId": "5b21778574bcfba0", "scanner": "scanner-primary", "fingerprint": "2c08676d8a7dd3d3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app.py:1397"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-383dd9d748d874ee", "level": "note", "message": {"text": "Possibly dead Python function: json_default"}, "properties": {"repobilityId": "f3f373cafaaf9320", "scanner": "scanner-primary", "fingerprint": "383dd9d748d874ee", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/backup_db.py:36"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-337a61b9e1d80169", "level": "note", "message": {"text": "Possibly dead Python function: specialty_matches_filter"}, "properties": {"repobilityId": "acc481fbd925ccc2", "scanner": "scanner-primary", "fingerprint": "337a61b9e1d80169", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/specialty_helpers.py:141"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7711d2f676f90079", "level": "note", "message": {"text": "Possibly dead Python function: decorator"}, "properties": {"repobilityId": "ffbcbc9bc189af1c", "scanner": "scanner-primary", "fingerprint": "7711d2f676f90079", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/rate_limit.py:24"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f785571584185abb", "level": "note", "message": {"text": "Possibly dead Python function: query_work_orders"}, "properties": {"repobilityId": "d4d1c5e6ea4620ff", "scanner": "scanner-primary", "fingerprint": "f785571584185abb", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:71"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bba362e011569aeb", "level": "note", "message": {"text": "Possibly dead Python function: query_notices"}, "properties": {"repobilityId": "0fe99a14613e10f3", "scanner": "scanner-primary", "fingerprint": "bba362e011569aeb", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:161"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9e2b98a389c65d2b", "level": "note", "message": {"text": "Possibly dead Python function: query_ot_personnel"}, "properties": {"repobilityId": "96c0eda8544d10b4", "scanner": "scanner-primary", "fingerprint": "9e2b98a389c65d2b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:226"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-46ec674de6a7485b", "level": "note", "message": {"text": "Possibly dead Python function: query_ot_materials"}, "properties": {"repobilityId": "c6ee6b728bf5895a", "scanner": "scanner-primary", "fingerprint": "46ec674de6a7485b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:242"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6dfbf15eb22b53e9", "level": "note", "message": {"text": "Possibly dead Python function: query_ot_log_entries"}, "properties": {"repobilityId": "fd8ca0ac71965aa4", "scanner": "scanner-primary", "fingerprint": "6dfbf15eb22b53e9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:272"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-37c1c3b78d75ed99", "level": "note", "message": {"text": "Possibly dead Python function: query_lubrication_points"}, "properties": {"repobilityId": "33857d815e983de0", "scanner": "scanner-primary", "fingerprint": "37c1c3b78d75ed99", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:293"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-131c246d4a4ee094", "level": "note", "message": {"text": "Possibly dead Python function: query_lubrication_executions"}, "properties": {"repobilityId": "9ef299c11c65f192", "scanner": "scanner-primary", "fingerprint": "131c246d4a4ee094", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:319"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8b5e5a4a96a36ef9", "level": "note", "message": {"text": "Possibly dead Python function: query_monitoring_points"}, "properties": {"repobilityId": "d6fae3c6e7690867", "scanner": "scanner-primary", "fingerprint": "8b5e5a4a96a36ef9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:345"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-11540fd87a8d955f", "level": "note", "message": {"text": "Possibly dead Python function: query_monitoring_readings"}, "properties": {"repobilityId": "512fbf6069ca6329", "scanner": "scanner-primary", "fingerprint": "11540fd87a8d955f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:375"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8ae6b8bf87750b32", "level": "note", "message": {"text": "Possibly dead Python function: query_inspection_routes"}, "properties": {"repobilityId": "541671b5d8681623", "scanner": "scanner-primary", "fingerprint": "8ae6b8bf87750b32", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:398"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bf24d7eada5609bc", "level": "note", "message": {"text": "Possibly dead Python function: query_inspection_executions"}, "properties": {"repobilityId": "732dcd212baed79a", "scanner": "scanner-primary", "fingerprint": "bf24d7eada5609bc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:420"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-175a4e55d1b5d527", "level": "note", "message": {"text": "Possibly dead Python function: query_thickness"}, "properties": {"repobilityId": "61251e758f6cb2ed", "scanner": "scanner-primary", "fingerprint": "175a4e55d1b5d527", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:469"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-05004413da4e5ba3", "level": "note", "message": {"text": "Possibly dead Python function: query_shutdowns"}, "properties": {"repobilityId": "6059ea7fff1b3e4a", "scanner": "scanner-primary", "fingerprint": "05004413da4e5ba3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:540"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-23f1149b66621309", "level": "note", "message": {"text": "Possibly dead Python function: query_shutdown_ots"}, "properties": {"repobilityId": "c421e0e24a2f28e5", "scanner": "scanner-primary", "fingerprint": "23f1149b66621309", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:567"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d762ad9719d7409b", "level": "note", "message": {"text": "Possibly dead Python function: query_purchases"}, "properties": {"repobilityId": "90a45baae99a4c34", "scanner": "scanner-primary", "fingerprint": "d762ad9719d7409b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:595"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6d560edf6bb4fd14", "level": "note", "message": {"text": "Possibly dead Python function: query_warehouse"}, "properties": {"repobilityId": "feb2b2772980cdad", "scanner": "scanner-primary", "fingerprint": "6d560edf6bb4fd14", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:636"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4b6f1853f9b9d129", "level": "note", "message": {"text": "Possibly dead Python function: query_warehouse_movements"}, "properties": {"repobilityId": "2805d651544c68be", "scanner": "scanner-primary", "fingerprint": "4b6f1853f9b9d129", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:668"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9328791ebe50c4cc", "level": "note", "message": {"text": "Possibly dead Python function: query_equipment_tree"}, "properties": {"repobilityId": "4c14cae2d49b1315", "scanner": "scanner-primary", "fingerprint": "9328791ebe50c4cc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:696"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fe0d4f7f7127186c", "level": "note", "message": {"text": "Possibly dead Python function: query_activities"}, "properties": {"repobilityId": "aba2105691c6d8f3", "scanner": "scanner-primary", "fingerprint": "fe0d4f7f7127186c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:718"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f04a92e65d2b30ac", "level": "note", "message": {"text": "Possibly dead Python function: query_rotative_assets"}, "properties": {"repobilityId": "f2c8f687fa49c36d", "scanner": "scanner-primary", "fingerprint": "f04a92e65d2b30ac", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:767"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6d2560d7c954858c", "level": "note", "message": {"text": "Possibly dead Python function: query_equipos_flat"}, "properties": {"repobilityId": "513045dbb207a176", "scanner": "scanner-primary", "fingerprint": "6d2560d7c954858c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "utils/powerbi_export.py:817"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-91da60e3d89429bd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 static/js/notices.js:124"}, "properties": {"repobilityId": "b84ce61b10836bd5", "scanner": "scanner-primary", "fingerprint": "91da60e3d89429bd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1e4eb45068c9b7e5", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 static/js/thickness.js:465"}, "properties": {"repobilityId": "b1b03d94be830cd8", "scanner": "scanner-primary", "fingerprint": "1e4eb45068c9b7e5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-9eb87d16cf2dfc5b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 static/js/work_orders.js:16"}, "properties": {"repobilityId": "8a81ec4ab61fadcc", "scanner": "scanner-primary", "fingerprint": "9eb87d16cf2dfc5b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-19b7892183cb46f2", "level": "note", "message": {"text": "Insecure pattern 'document_write' in static/js/reports.js:449"}, "properties": {"repobilityId": "b56e4b02e45c1845", "scanner": "scanner-primary", "fingerprint": "19b7892183cb46f2", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/reports.js"}, "region": {"startLine": 449}}}]}, {"ruleId": "scanner-9e05f83b72a03ca5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/reports.js:38"}, "properties": {"repobilityId": "a81c600b21a548d2", "scanner": "scanner-primary", "fingerprint": "9e05f83b72a03ca5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/reports.js"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-bbb56f3eb674b25f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/indicators.js:101"}, "properties": {"repobilityId": "33413ad749d6e0a7", "scanner": "scanner-primary", "fingerprint": "bbb56f3eb674b25f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/indicators.js"}, "region": {"startLine": 101}}}]}, {"ruleId": "scanner-6590776a858e7c13", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/purchasing.js:35"}, "properties": {"repobilityId": "f7b9c397a51a709d", "scanner": "scanner-primary", "fingerprint": "6590776a858e7c13", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/purchasing.js"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-6362ab7587746a9b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/inspections.js:13"}, "properties": {"repobilityId": "51dd035da0b14dcd", "scanner": "scanner-primary", "fingerprint": "6362ab7587746a9b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/inspections.js"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-e5beefc3006bba55", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/activities.js:30"}, "properties": {"repobilityId": "254a2156618424b8", "scanner": "scanner-primary", "fingerprint": "e5beefc3006bba55", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/activities.js"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-28d96b4f1021f121", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/produccion.js:57"}, "properties": {"repobilityId": "9200179a02c8f40c", "scanner": "scanner-primary", "fingerprint": "28d96b4f1021f121", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/produccion.js"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-435834ba688d43be", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in static/js/produccion.js:363"}, "properties": {"repobilityId": "047635ed5ddf1774", "scanner": "scanner-primary", "fingerprint": "435834ba688d43be", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/produccion.js"}, "region": {"startLine": 363}}}]}, {"ruleId": "scanner-d1628aa87bc798b3", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/app.js:257"}, "properties": {"repobilityId": "fd3109b9471b15f1", "scanner": "scanner-primary", "fingerprint": "d1628aa87bc798b3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/app.js"}, "region": {"startLine": 257}}}]}, {"ruleId": "scanner-b84b5b5a91d6bfbd", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard.js:40"}, "properties": {"repobilityId": "9a8c59174355db60", "scanner": "scanner-primary", "fingerprint": "b84b5b5a91d6bfbd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/dashboard.js"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-13e973dc58a13ecc", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/programa_nocturno.js:34"}, "properties": {"repobilityId": "5799e37d1ad642e8", "scanner": "scanner-primary", "fingerprint": "13e973dc58a13ecc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/programa_nocturno.js"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-61151fb142c0ed7d", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in static/js/programa_nocturno.js:39"}, "properties": {"repobilityId": "24c957837f482629", "scanner": "scanner-primary", "fingerprint": "61151fb142c0ed7d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/programa_nocturno.js"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-fd82241ecb9b3840", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/notices.js:58"}, "properties": {"repobilityId": "b17607e139331c27", "scanner": "scanner-primary", "fingerprint": "fd82241ecb9b3840", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/notices.js"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-bf3717bf59ba3bd2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/sidebar.js:31"}, "properties": {"repobilityId": "ca521d87aee74902", "scanner": "scanner-primary", "fingerprint": "bf3717bf59ba3bd2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/sidebar.js"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-b49ba3d1260d6002", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/monitoring.js:45"}, "properties": {"repobilityId": "d60d15e2e5d2f62f", "scanner": "scanner-primary", "fingerprint": "b49ba3d1260d6002", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/monitoring.js"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-ae8f9ed3c6debbf6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/lubrication.js:14"}, "properties": {"repobilityId": "a461a8a4cf6ce032", "scanner": "scanner-primary", "fingerprint": "ae8f9ed3c6debbf6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/lubrication.js"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-771583e3a83ea35c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/shutdowns.js:54"}, "properties": {"repobilityId": "1da2b0bee110b3ec", "scanner": "scanner-primary", "fingerprint": "771583e3a83ea35c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/shutdowns.js"}, "region": {"startLine": 54}}}]}, {"ruleId": "scanner-d8140a533dcd4789", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in static/js/shutdowns.js:155"}, "properties": {"repobilityId": "678a7fdeb8d96ce1", "scanner": "scanner-primary", "fingerprint": "d8140a533dcd4789", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/shutdowns.js"}, "region": {"startLine": 155}}}]}, {"ruleId": "scanner-41ae4f8fc387bd23", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/rotative_assets.js:33"}, "properties": {"repobilityId": "7d1c0591543ad29e", "scanner": "scanner-primary", "fingerprint": "41ae4f8fc387bd23", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/rotative_assets.js"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-71d4bf06bcf93ecf", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in static/js/rotative_assets.js:472"}, "properties": {"repobilityId": "90719d6ca2688a63", "scanner": "scanner-primary", "fingerprint": "71d4bf06bcf93ecf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/rotative_assets.js"}, "region": {"startLine": 472}}}]}, {"ruleId": "scanner-248608f96e78770d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/thickness.js:66"}, "properties": {"repobilityId": "48e032e3ab8cee52", "scanner": "scanner-primary", "fingerprint": "248608f96e78770d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/thickness.js"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-3e14fb7750a6660a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/work_orders.js:303"}, "properties": {"repobilityId": "7ffa3b755baad156", "scanner": "scanner-primary", "fingerprint": "3e14fb7750a6660a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/work_orders.js"}, "region": {"startLine": 303}}}]}, {"ruleId": "scanner-bd237d0e103456e5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/requirements.js:42"}, "properties": {"repobilityId": "00ed8961276a14c9", "scanner": "scanner-primary", "fingerprint": "bd237d0e103456e5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/requirements.js"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-9fe44cbe3a622747", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/cockpit.js:111"}, "properties": {"repobilityId": "f411e253d711f693", "scanner": "scanner-primary", "fingerprint": "9fe44cbe3a622747", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/cockpit.js"}, "region": {"startLine": 111}}}]}, {"ruleId": "scanner-f663a8dd2068c686", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in scripts/fix_js.py:27"}, "properties": {"repobilityId": "48c343c871fd68bb", "scanner": "scanner-primary", "fingerprint": "f663a8dd2068c686", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/fix_js.py"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-6ad53519fae2edc3", "level": "error", "message": {"text": "Possible secret in scripts/debug/probe_pooler.py"}, "properties": {"repobilityId": "caa4ef15d264f502", "scanner": "scanner-primary", "fingerprint": "6ad53519fae2edc3", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/debug/probe_pooler.py"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-1a50467f36b413ec", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "926b5aa2fc342af4", "scanner": "scanner-primary", "fingerprint": "1a50467f36b413ec", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/tests.yml"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-1a50467f36b413ec", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b34e143cdd267736", "scanner": "scanner-primary", "fingerprint": "1a50467f36b413ec", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/tests.yml"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-e21538b56060f0ff", "level": "note", "message": {"text": "Very large file: models.py (2374 lines)"}, "properties": {"repobilityId": "f9d250461a08d929", "scanner": "scanner-primary", "fingerprint": "e21538b56060f0ff", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2808440ccdc84d3a", "level": "note", "message": {"text": "Very large file: app.py (1427 lines)"}, "properties": {"repobilityId": "5a74e6652f3a10d4", "scanner": "scanner-primary", "fingerprint": "2808440ccdc84d3a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1a752c4c0aa61daf", "level": "note", "message": {"text": "Very large file: static/js/app.js (1214 lines)"}, "properties": {"repobilityId": "3f81f930b45ebc4c", "scanner": "scanner-primary", "fingerprint": "1a752c4c0aa61daf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-72e8702aaf1c6138", "level": "note", "message": {"text": "Very large file: static/js/sidebar.js (1153 lines)"}, "properties": {"repobilityId": "a253530f66a35dda", "scanner": "scanner-primary", "fingerprint": "72e8702aaf1c6138", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6b48cf3599a1d18e", "level": "note", "message": {"text": "Very large file: static/js/work_orders.js (4347 lines)"}, "properties": {"repobilityId": "17554a20075890f0", "scanner": "scanner-primary", "fingerprint": "6b48cf3599a1d18e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f2987bb1aa6b43f2", "level": "note", "message": {"text": "Very large file: bot/context.py (1375 lines)"}, "properties": {"repobilityId": "962ecaa022c2c4f7", "scanner": "scanner-primary", "fingerprint": "f2987bb1aa6b43f2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-186a58071ea18bc2", "level": "note", "message": {"text": "Very large file: bot/telegram_bot.py (2084 lines)"}, "properties": {"repobilityId": "a7f91dfd6f28ef23", "scanner": "scanner-primary", "fingerprint": "186a58071ea18bc2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cbee1b089332e293", "level": "note", "message": {"text": "Very large file: routes/work_orders_routes.py (1613 lines)"}, "properties": {"repobilityId": "bc4edd729588d107", "scanner": "scanner-primary", "fingerprint": "cbee1b089332e293", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-63b82e71ed7f6f0f", "level": "note", "message": {"text": "Very large file: routes/reports_routes.py (1395 lines)"}, "properties": {"repobilityId": "f4593a97556d1e17", "scanner": "scanner-primary", "fingerprint": "63b82e71ed7f6f0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-442ed4d9b5cc35d9", "level": "note", "message": {"text": "Very large file: routes/core_routes.py (1784 lines)"}, "properties": {"repobilityId": "e4a79ca497ccec8c", "scanner": "scanner-primary", "fingerprint": "442ed4d9b5cc35d9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e9168d31a440c630", "level": "note", "message": {"text": "Very large file: routes/weekly_plan_routes.py (1318 lines)"}, "properties": {"repobilityId": "130633ee3a771f11", "scanner": "scanner-primary", "fingerprint": "e9168d31a440c630", "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": "ab1a6f184a1d832a", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-01f96f71d9907a8c", "level": "note", "message": {"text": "README lacks setup or run instructions"}, "properties": {"repobilityId": "ca16120e0d6e2051", "scanner": "scanner-primary", "fingerprint": "01f96f71d9907a8c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "be8476fca3a9cf36", "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": "8c6aec3e26a87aac", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "489c77b37307740e", "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": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "26fa60ebe41dda29", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-376f3d87380b58e7", "level": "none", "message": {"text": "Commented-code block (5 lines) in models.py:222"}, "properties": {"repobilityId": "d54ef5c0bf1904a0", "scanner": "scanner-primary", "fingerprint": "376f3d87380b58e7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-48906d80f8f5af63", "level": "note", "message": {"text": "Legacy-named symbol `cmms_v2` in app.py:159"}, "properties": {"repobilityId": "efce7d34c6d5609a", "scanner": "scanner-primary", "fingerprint": "48906d80f8f5af63", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d6dc42047e6eec56", "level": "none", "message": {"text": "Commented-code block (6 lines) in app.py:217"}, "properties": {"repobilityId": "48a15cdf6f5549c6", "scanner": "scanner-primary", "fingerprint": "d6dc42047e6eec56", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-97cde3f9e1ea0739", "level": "none", "message": {"text": "Commented-code block (5 lines) in static/sw.js:1"}, "properties": {"repobilityId": "2e1c928817f33415", "scanner": "scanner-primary", "fingerprint": "97cde3f9e1ea0739", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b98389e0401a55cf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/sw.js:96"}, "properties": {"repobilityId": "578f459f5eed27d7", "scanner": "scanner-primary", "fingerprint": "b98389e0401a55cf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e9e6ddbd4295404b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/reports.js:25"}, "properties": {"repobilityId": "6c1128dab6922df6", "scanner": "scanner-primary", "fingerprint": "e9e6ddbd4295404b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-131020565968e560", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/inspections.js:6"}, "properties": {"repobilityId": "f3fb0beba176cce1", "scanner": "scanner-primary", "fingerprint": "131020565968e560", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5bcb653f7e255685", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/activities.js:6"}, "properties": {"repobilityId": "b39bdf144fdef387", "scanner": "scanner-primary", "fingerprint": "5bcb653f7e255685", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-541a640f5f6c68ef", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/produccion.js:457"}, "properties": {"repobilityId": "472326fd0b879029", "scanner": "scanner-primary", "fingerprint": "541a640f5f6c68ef", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e8dea7ee9378e408", "level": "none", "message": {"text": "Commented-code block (5 lines) in static/js/app.js:460"}, "properties": {"repobilityId": "2f4dd6565d443710", "scanner": "scanner-primary", "fingerprint": "e8dea7ee9378e408", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-64bae2bc757fa2da", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/app.js:187"}, "properties": {"repobilityId": "77c1d9aecc961b8e", "scanner": "scanner-primary", "fingerprint": "64bae2bc757fa2da", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dd92832a6e534e7e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/dashboard.js:203"}, "properties": {"repobilityId": "e0e7a99155f0ec3e", "scanner": "scanner-primary", "fingerprint": "dd92832a6e534e7e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d26790fcd6168e51", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/programa_nocturno.js:532"}, "properties": {"repobilityId": "f303b0cf20370716", "scanner": "scanner-primary", "fingerprint": "d26790fcd6168e51", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-682f5e6c59aee9d9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/notices.js:95"}, "properties": {"repobilityId": "dba91940c853a2fb", "scanner": "scanner-primary", "fingerprint": "682f5e6c59aee9d9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7a4397e0275074ab", "level": "none", "message": {"text": "Commented-code block (5 lines) in static/js/sidebar.js:366"}, "properties": {"repobilityId": "330d75d86e37fadd", "scanner": "scanner-primary", "fingerprint": "7a4397e0275074ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8136c94e488ae085", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/sidebar.js:1114"}, "properties": {"repobilityId": "3be507111674ca12", "scanner": "scanner-primary", "fingerprint": "8136c94e488ae085", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1ea8ef63c98f780a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/lubrication.js:7"}, "properties": {"repobilityId": "8ddebb835c243b2e", "scanner": "scanner-primary", "fingerprint": "1ea8ef63c98f780a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a82b7d34800a30cd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/shutdowns.js:36"}, "properties": {"repobilityId": "bd400f804a817f42", "scanner": "scanner-primary", "fingerprint": "a82b7d34800a30cd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8a88282f59f5ccc8", "level": "none", "message": {"text": "Commented-code block (5 lines) in static/js/rotative_assets.js:690"}, "properties": {"repobilityId": "e9d61e7a27edcc50", "scanner": "scanner-primary", "fingerprint": "8a88282f59f5ccc8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6dfd2518273370b1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/thickness.js:124"}, "properties": {"repobilityId": "3c8f166f89a4e2fc", "scanner": "scanner-primary", "fingerprint": "6dfd2518273370b1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c29f5f4e669e763f", "level": "none", "message": {"text": "Commented-code block (5 lines) in static/js/work_orders.js:533"}, "properties": {"repobilityId": "de95a2bbb1416308", "scanner": "scanner-primary", "fingerprint": "c29f5f4e669e763f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c21516c4b1cf1a8f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/work_orders.js:495"}, "properties": {"repobilityId": "e56132243d253901", "scanner": "scanner-primary", "fingerprint": "c21516c4b1cf1a8f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-94625764a8753674", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/cockpit.js:73"}, "properties": {"repobilityId": "c261df85504ca620", "scanner": "scanner-primary", "fingerprint": "94625764a8753674", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-42b005c2ef9bcbd1", "level": "note", "message": {"text": "Legacy-named symbol `cmms_v2` in scripts/debug/check_tables.py:5"}, "properties": {"repobilityId": "0155be8fc2e6d942", "scanner": "scanner-primary", "fingerprint": "42b005c2ef9bcbd1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6b3277ce32089b1a", "level": "note", "message": {"text": "Legacy-named symbol `cmms_v2` in scripts/debug/quick_check.py:5"}, "properties": {"repobilityId": "f81c3a0e59e5beb7", "scanner": "scanner-primary", "fingerprint": "6b3277ce32089b1a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5f2bc868d93a9e0f", "level": "note", "message": {"text": "Legacy-named symbol `cmms_v2` in scripts/debug/inspect_db.py:5"}, "properties": {"repobilityId": "7148a9c700f12279", "scanner": "scanner-primary", "fingerprint": "5f2bc868d93a9e0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c732863c8dc0e062", "level": "note", "message": {"text": "Legacy-named symbol `cmms_v2` in scripts/migrations/migrate_warehouse.py:5"}, "properties": {"repobilityId": "3063b1af4d7bf094", "scanner": "scanner-primary", "fingerprint": "c732863c8dc0e062", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-362e6d8db9351062", "level": "note", "message": {"text": "Legacy-named symbol `cmms_v2` in scripts/migrations/migrate_notice_annul.py:5"}, "properties": {"repobilityId": "14b0863171f473c0", "scanner": "scanner-primary", "fingerprint": "362e6d8db9351062", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-06cc5ed858de7407", "level": "note", "message": {"text": "Legacy-named symbol `cmms_v2` in scripts/migrations/migrate_warehouse_mgmt.py:5"}, "properties": {"repobilityId": "66c27fcfeb4d3355", "scanner": "scanner-primary", "fingerprint": "06cc5ed858de7407", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ef1e9e9859bbfb56", "level": "note", "message": {"text": "Legacy-named symbol `cmms_v2` in scripts/migrations/migrate_purchase_req.py:5"}, "properties": {"repobilityId": "76a8663c9af38490", "scanner": "scanner-primary", "fingerprint": "ef1e9e9859bbfb56", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-022a276d9dc13767", "level": "note", "message": {"text": "Legacy-named symbol `cmms_v2` in scripts/migrations/migrate_to_supabase.py:15"}, "properties": {"repobilityId": "48fb646ac8b95523", "scanner": "scanner-primary", "fingerprint": "022a276d9dc13767", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f3d898abc6d658e1", "level": "note", "message": {"text": "Legacy-named symbol `cmms_v2` in scripts/migrations/migrate_db.py:4"}, "properties": {"repobilityId": "ff14c3c547d3c4c3", "scanner": "scanner-primary", "fingerprint": "f3d898abc6d658e1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4c52fbddc6076fe1", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 utils/photo_helpers.py:66"}, "properties": {"repobilityId": "bb906f425b27f708", "scanner": "scanner-primary", "fingerprint": "4c52fbddc6076fe1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2ad7d52991660044", "level": "none", "message": {"text": "Commented-code block (5 lines) in bot/context.py:55"}, "properties": {"repobilityId": "e7ff81d8751af404", "scanner": "scanner-primary", "fingerprint": "2ad7d52991660044", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1623532ae4b0a434", "level": "none", "message": {"text": "Commented-code block (5 lines) in bot/resolvers.py:74"}, "properties": {"repobilityId": "b8279db2a111abf7", "scanner": "scanner-primary", "fingerprint": "1623532ae4b0a434", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6c0c5b1850dd4d9a", "level": "none", "message": {"text": "Commented-code block (5 lines) in bot/telegram_bot.py:67"}, "properties": {"repobilityId": "c2f7832f517394ca", "scanner": "scanner-primary", "fingerprint": "6c0c5b1850dd4d9a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-44de54b43620baaa", "level": "none", "message": {"text": "Commented-code block (8 lines) in routes/production_routes.py:629"}, "properties": {"repobilityId": "cc8f25ead37e9344", "scanner": "scanner-primary", "fingerprint": "44de54b43620baaa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-157fd69bdab132ce", "level": "none", "message": {"text": "Commented-code block (6 lines) in routes/lubrication_routes.py:338"}, "properties": {"repobilityId": "fe0419dadadcda4f", "scanner": "scanner-primary", "fingerprint": "157fd69bdab132ce", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f55ea30130f63e29", "level": "none", "message": {"text": "Commented-code block (5 lines) in routes/plant_flow_routes.py:161"}, "properties": {"repobilityId": "433911cd5443aeb5", "scanner": "scanner-primary", "fingerprint": "f55ea30130f63e29", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ebb97d0c6930fe1b", "level": "none", "message": {"text": "Commented-code block (5 lines) in routes/work_orders_routes.py:318"}, "properties": {"repobilityId": "9a45930696303300", "scanner": "scanner-primary", "fingerprint": "ebb97d0c6930fe1b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-74c95936873355c5", "level": "note", "message": {"text": "Legacy-named symbol `powerbi_work_orders_v2` in routes/reports_routes.py:1183"}, "properties": {"repobilityId": "1d382b8188f451b3", "scanner": "scanner-primary", "fingerprint": "74c95936873355c5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d036c3992a894bec", "level": "none", "message": {"text": "Commented-code block (5 lines) in routes/shutdown_routes.py:105"}, "properties": {"repobilityId": "6601fabd4bf008cd", "scanner": "scanner-primary", "fingerprint": "d036c3992a894bec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-417456cff07471fe", "level": "none", "message": {"text": "Commented-code block (7 lines) in routes/core_routes.py:1004"}, "properties": {"repobilityId": "959dc0689aa43d1a", "scanner": "scanner-primary", "fingerprint": "417456cff07471fe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fb6ec9c3aed313ab", "level": "none", "message": {"text": "Commented-code block (5 lines) in routes/weekly_plan_routes.py:347"}, "properties": {"repobilityId": "c27752a89acdbcb8", "scanner": "scanner-primary", "fingerprint": "fb6ec9c3aed313ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aa5f2ac876561fee", "level": "none", "message": {"text": "Commented-code block (6 lines) in routes/admin_routes.py:170"}, "properties": {"repobilityId": "0d20d1eb03c691de", "scanner": "scanner-primary", "fingerprint": "aa5f2ac876561fee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e047ab7af03962f", "level": "note", "message": {"text": "7 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "5a0455f6498c27ad", "scanner": "scanner-primary", "fingerprint": "8e047ab7af03962f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-65186ed837be1097", "level": "note", "message": {"text": "Near-duplicate function bodies in 58 places"}, "properties": {"repobilityId": "a3e620ebde2a33a9", "scanner": "scanner-primary", "fingerprint": "65186ed837be1097", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-33a6b62e30ce7ab4", "level": "note", "message": {"text": "Near-duplicate function bodies in 6 places"}, "properties": {"repobilityId": "e80fade10eb56140", "scanner": "scanner-primary", "fingerprint": "33a6b62e30ce7ab4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "0b76ed3cfbc498a1", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "4e17b3a9e0f77e67", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "fb6bf12fee147964", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "96a06cf3688b06bd", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "6960b4fdef18b1e5", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "dc3dba295ba26b83", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "61969001b02ae03e", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "4336b3461d23dc70", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "276e955c77f5a74c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "dadfb4d5aa9648a9", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "a97d0a6ef56fad59", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "f5a9292215fa8957", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "f8256037b07efa08", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-af0cef51088d6dca", "level": "error", "message": {"text": "Flask mutation route `create_production_goal` without `@login_required` \u2014 routes/production_routes.py:327"}, "properties": {"repobilityId": "a4ca0ac2619bec73", "scanner": "scanner-primary", "fingerprint": "af0cef51088d6dca", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/production_routes.py"}, "region": {"startLine": 327}}}]}, {"ruleId": "scanner-b0bf5f6640b43abb", "level": "error", "message": {"text": "Flask mutation route `update_production_goal` without `@login_required` \u2014 routes/production_routes.py:370"}, "properties": {"repobilityId": "28649b629b6a8c01", "scanner": "scanner-primary", "fingerprint": "b0bf5f6640b43abb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/production_routes.py"}, "region": {"startLine": 370}}}]}, {"ruleId": "scanner-704a2cf3ab0025f2", "level": "error", "message": {"text": "Flask mutation route `delete_production_goal` without `@login_required` \u2014 routes/production_routes.py:394"}, "properties": {"repobilityId": "025dbec1062a3f51", "scanner": "scanner-primary", "fingerprint": "704a2cf3ab0025f2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/production_routes.py"}, "region": {"startLine": 394}}}]}, {"ruleId": "scanner-8cd0cb7e437681ee", "level": "error", "message": {"text": "Flask mutation route `production_ai_diagnosis` without `@login_required` \u2014 routes/production_routes.py:455"}, "properties": {"repobilityId": "5e12fce0b97287f4", "scanner": "scanner-primary", "fingerprint": "8cd0cb7e437681ee", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/production_routes.py"}, "region": {"startLine": 455}}}]}, {"ruleId": "scanner-4052c5209a810c82", "level": "error", "message": {"text": "Flask mutation route `handle_lubrication_points` without `@login_required` \u2014 routes/lubrication_routes.py:190"}, "properties": {"repobilityId": "14d1a74aad26f153", "scanner": "scanner-primary", "fingerprint": "4052c5209a810c82", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/lubrication_routes.py"}, "region": {"startLine": 190}}}]}, {"ruleId": "scanner-a76d7acb9cc476e9", "level": "error", "message": {"text": "Flask mutation route `handle_lubrication_point_id` without `@login_required` \u2014 routes/lubrication_routes.py:261"}, "properties": {"repobilityId": "bc463f2dd805b39a", "scanner": "scanner-primary", "fingerprint": "a76d7acb9cc476e9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/lubrication_routes.py"}, "region": {"startLine": 261}}}]}, {"ruleId": "scanner-0366d10263985254", "level": "error", "message": {"text": "Flask mutation route `handle_lubrication_executions` without `@login_required` \u2014 routes/lubrication_routes.py:307"}, "properties": {"repobilityId": "568a45a779f51de8", "scanner": "scanner-primary", "fingerprint": "0366d10263985254", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/lubrication_routes.py"}, "region": {"startLine": 307}}}]}, {"ruleId": "scanner-998e52d2fbc34b74", "level": "error", "message": {"text": "Flask mutation route `delete_lubrication_execution` without `@login_required` \u2014 routes/lubrication_routes.py:414"}, "properties": {"repobilityId": "daf400abb5041b5a", "scanner": "scanner-primary", "fingerprint": "998e52d2fbc34b74", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/lubrication_routes.py"}, "region": {"startLine": 414}}}]}, {"ruleId": "scanner-84f337a12c47ba8d", "level": "error", "message": {"text": "Flask mutation route `handle_activities` without `@login_required` \u2014 routes/activity_routes.py:8"}, "properties": {"repobilityId": "8b01b166d550d750", "scanner": "scanner-primary", "fingerprint": "84f337a12c47ba8d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/activity_routes.py"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-e2b2c44b9623b008", "level": "error", "message": {"text": "Flask mutation route `handle_activity_id` without `@login_required` \u2014 routes/activity_routes.py:49"}, "properties": {"repobilityId": "8a223d0d4034a87f", "scanner": "scanner-primary", "fingerprint": "e2b2c44b9623b008", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/activity_routes.py"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-ea0458b8187c3032", "level": "error", "message": {"text": "Flask mutation route `handle_milestones` without `@login_required` \u2014 routes/activity_routes.py:78"}, "properties": {"repobilityId": "aeff25e3a55f1502", "scanner": "scanner-primary", "fingerprint": "ea0458b8187c3032", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/activity_routes.py"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-b7af538be443d72b", "level": "error", "message": {"text": "Flask mutation route `handle_milestone_id` without `@login_required` \u2014 routes/activity_routes.py:115"}, "properties": {"repobilityId": "43d68db430b3559a", "scanner": "scanner-primary", "fingerprint": "b7af538be443d72b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/activity_routes.py"}, "region": {"startLine": 115}}}]}, {"ruleId": "scanner-eb5f35fb10a7f7d4", "level": "error", "message": {"text": "Flask mutation route `handle_rotative_assets` without `@login_required` \u2014 routes/rotative_assets_routes.py:59"}, "properties": {"repobilityId": "6f8f41fcdbabc2ca", "scanner": "scanner-primary", "fingerprint": "eb5f35fb10a7f7d4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/rotative_assets_routes.py"}, "region": {"startLine": 59}}}]}, {"ruleId": "scanner-a822c1469e9cd5b2", "level": "error", "message": {"text": "Flask mutation route `handle_rotative_asset_id` without `@login_required` \u2014 routes/rotative_assets_routes.py:120"}, "properties": {"repobilityId": "920a5b8b7d65380f", "scanner": "scanner-primary", "fingerprint": "a822c1469e9cd5b2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/rotative_assets_routes.py"}, "region": {"startLine": 120}}}]}, {"ruleId": "scanner-23768332b50f635a", "level": "error", "message": {"text": "Flask mutation route `install_rotative_asset` without `@login_required` \u2014 routes/rotative_assets_routes.py:156"}, "properties": {"repobilityId": "9681f0385cf890e4", "scanner": "scanner-primary", "fingerprint": "23768332b50f635a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/rotative_assets_routes.py"}, "region": {"startLine": 156}}}]}, {"ruleId": "scanner-fcfddbb4dc3f0286", "level": "error", "message": {"text": "Flask mutation route `remove_rotative_asset` without `@login_required` \u2014 routes/rotative_assets_routes.py:177"}, "properties": {"repobilityId": "d8bc452c2d944c3b", "scanner": "scanner-primary", "fingerprint": "fcfddbb4dc3f0286", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/rotative_assets_routes.py"}, "region": {"startLine": 177}}}]}, {"ruleId": "scanner-ed3f642af9a981a5", "level": "error", "message": {"text": "Flask mutation route `handle_rotative_specs` without `@login_required` \u2014 routes/rotative_assets_routes.py:203"}, "properties": {"repobilityId": "bee8641a7001ac72", "scanner": "scanner-primary", "fingerprint": "ed3f642af9a981a5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/rotative_assets_routes.py"}, "region": {"startLine": 203}}}]}, {"ruleId": "scanner-fcc37aed7d7ad6ab", "level": "error", "message": {"text": "Flask mutation route `delete_rotative_spec` without `@login_required` \u2014 routes/rotative_assets_routes.py:257"}, "properties": {"repobilityId": "795889960df8ed93", "scanner": "scanner-primary", "fingerprint": "fcc37aed7d7ad6ab", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/rotative_assets_routes.py"}, "region": {"startLine": 257}}}]}, {"ruleId": "scanner-d4be663b6d9cb330", "level": "error", "message": {"text": "Flask mutation route `handle_asset_bom` without `@login_required` \u2014 routes/rotative_assets_routes.py:273"}, "properties": {"repobilityId": "fe894ee026a89652", "scanner": "scanner-primary", "fingerprint": "d4be663b6d9cb330", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/rotative_assets_routes.py"}, "region": {"startLine": 273}}}]}, {"ruleId": "scanner-e7b66a7e65280e1a", "level": "error", "message": {"text": "Flask mutation route `delete_asset_bom` without `@login_required` \u2014 routes/rotative_assets_routes.py:334"}, "properties": {"repobilityId": "9fc8ad85fe3dc74b", "scanner": "scanner-primary", "fingerprint": "e7b66a7e65280e1a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/rotative_assets_routes.py"}, "region": {"startLine": 334}}}]}, {"ruleId": "scanner-e362fbff6e106d3d", "level": "error", "message": {"text": "Flask mutation route `swap_rotative_assets` without `@login_required` \u2014 routes/rotative_assets_routes.py:345"}, "properties": {"repobilityId": "873665e8c183a849", "scanner": "scanner-primary", "fingerprint": "e362fbff6e106d3d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/rotative_assets_routes.py"}, "region": {"startLine": 345}}}]}, {"ruleId": "scanner-f0edfad89bc156d0", "level": "error", "message": {"text": "Flask mutation route `upload_excel` without `@login_required` \u2014 routes/data_import_routes.py:207"}, "properties": {"repobilityId": "fabb9c09d3527c16", "scanner": "scanner-primary", "fingerprint": "f0edfad89bc156d0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/data_import_routes.py"}, "region": {"startLine": 207}}}]}, {"ruleId": "scanner-37b4857410021e74", "level": "error", "message": {"text": "Flask mutation route `bulk_paste` without `@login_required` \u2014 routes/data_import_routes.py:251"}, "properties": {"repobilityId": "78b0cdf28277e00f", "scanner": "scanner-primary", "fingerprint": "37b4857410021e74", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/data_import_routes.py"}, "region": {"startLine": 251}}}]}, {"ruleId": "scanner-d42a99bfc7cd0772", "level": "error", "message": {"text": "Flask mutation route `bulk_paste_hierarchy` without `@login_required` \u2014 routes/data_import_routes.py:343"}, "properties": {"repobilityId": "fcec6b1be2a4d723", "scanner": "scanner-primary", "fingerprint": "d42a99bfc7cd0772", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/data_import_routes.py"}, "region": {"startLine": 343}}}]}, {"ruleId": "scanner-c89f4d997a6cd1f4", "level": "error", "message": {"text": "Flask mutation route `apply_optimization` without `@login_required` \u2014 routes/insights_routes.py:87"}, "properties": {"repobilityId": "a5d46758a7f1ad8f", "scanner": "scanner-primary", "fingerprint": "c89f4d997a6cd1f4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/insights_routes.py"}, "region": {"startLine": 87}}}]}, {"ruleId": "scanner-bbcba1a005f119e9", "level": "error", "message": {"text": "Flask mutation route `insights_narrative` without `@login_required` \u2014 routes/insights_routes.py:389"}, "properties": {"repobilityId": "f2a115e5a00a49d4", "scanner": "scanner-primary", "fingerprint": "bbcba1a005f119e9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/insights_routes.py"}, "region": {"startLine": 389}}}]}, {"ruleId": "scanner-251b4abf1e75007a", "level": "error", "message": {"text": "Flask mutation route `handle_requests` without `@login_required` \u2014 routes/purchasing_routes.py:14"}, "properties": {"repobilityId": "5d941613af2d2643", "scanner": "scanner-primary", "fingerprint": "251b4abf1e75007a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/purchasing_routes.py"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-22d3142476085b9a", "level": "error", "message": {"text": "Flask mutation route `handle_orders` without `@login_required` \u2014 routes/purchasing_routes.py:52"}, "properties": {"repobilityId": "c137281d14567d11", "scanner": "scanner-primary", "fingerprint": "22d3142476085b9a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/purchasing_routes.py"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-08817183a2412bf6", "level": "error", "message": {"text": "Flask mutation route `receive_po_items` without `@login_required` \u2014 routes/purchasing_routes.py:157"}, "properties": {"repobilityId": "2b7c49d105f35ccf", "scanner": "scanner-primary", "fingerprint": "08817183a2412bf6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/purchasing_routes.py"}, "region": {"startLine": 157}}}]}, {"ruleId": "scanner-ecb109a11e05a410", "level": "error", "message": {"text": "Flask mutation route `close_po` without `@login_required` \u2014 routes/purchasing_routes.py:172"}, "properties": {"repobilityId": "3a16d65209e48792", "scanner": "scanner-primary", "fingerprint": "ecb109a11e05a410", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/purchasing_routes.py"}, "region": {"startLine": 172}}}]}, {"ruleId": "scanner-65178a57735073e5", "level": "error", "message": {"text": "Flask mutation route `update_po_external_code` without `@login_required` \u2014 routes/purchasing_routes.py:185"}, "properties": {"repobilityId": "baa78e213a0e9e55", "scanner": "scanner-primary", "fingerprint": "65178a57735073e5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/purchasing_routes.py"}, "region": {"startLine": 185}}}]}, {"ruleId": "scanner-3f146558fd2c2645", "level": "error", "message": {"text": "Flask mutation route `handle_hammer_batches` without `@login_required` \u2014 routes/hammer_batches_routes.py:71"}, "properties": {"repobilityId": "f163781d977dd74f", "scanner": "scanner-primary", "fingerprint": "3f146558fd2c2645", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/hammer_batches_routes.py"}, "region": {"startLine": 71}}}]}, {"ruleId": "scanner-eef075ebfb87dc75", "level": "error", "message": {"text": "Flask mutation route `handle_hammer_batch_id` without `@login_required` \u2014 routes/hammer_batches_routes.py:120"}, "properties": {"repobilityId": "494b88f3aa3a5bcd", "scanner": "scanner-primary", "fingerprint": "eef075ebfb87dc75", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/hammer_batches_routes.py"}, "region": {"startLine": 120}}}]}, {"ruleId": "scanner-533aa1e7392666c3", "level": "error", "message": {"text": "Flask mutation route `discard_hammer_batch` without `@login_required` \u2014 routes/hammer_batches_routes.py:147"}, "properties": {"repobilityId": "b484b447c55e4b3f", "scanner": "scanner-primary", "fingerprint": "533aa1e7392666c3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/hammer_batches_routes.py"}, "region": {"startLine": 147}}}]}, {"ruleId": "scanner-2515a9eec8a5bfba", "level": "error", "message": {"text": "Flask mutation route `receive_refilled_batch` without `@login_required` \u2014 routes/hammer_batches_routes.py:179"}, "properties": {"repobilityId": "f24bbb19c6900f41", "scanner": "scanner-primary", "fingerprint": "2515a9eec8a5bfba", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/hammer_batches_routes.py"}, "region": {"startLine": 179}}}]}, {"ruleId": "scanner-c9db35b3a99144d1", "level": "error", "message": {"text": "Flask mutation route `change_hammer_batch` without `@login_required` \u2014 routes/hammer_batches_routes.py:207"}, "properties": {"repobilityId": "1b2c6e4fa17950d5", "scanner": "scanner-primary", "fingerprint": "c9db35b3a99144d1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/hammer_batches_routes.py"}, "region": {"startLine": 207}}}]}, {"ruleId": "scanner-3998974626eb1a62", "level": "error", "message": {"text": "Flask mutation route `api_plant_flow_bulk_update` without `@login_required` \u2014 routes/plant_flow_routes.py:428"}, "properties": {"repobilityId": "b70de8a611cc4137", "scanner": "scanner-primary", "fingerprint": "3998974626eb1a62", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/plant_flow_routes.py"}, "region": {"startLine": 428}}}]}, {"ruleId": "scanner-ff65c2ba425b1da9", "level": "error", "message": {"text": "Flask mutation route `api_plant_flow_seed_from_pdf` without `@login_required` \u2014 routes/plant_flow_routes.py:627"}, "properties": {"repobilityId": "578085bc896f3ee6", "scanner": "scanner-primary", "fingerprint": "ff65c2ba425b1da9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/plant_flow_routes.py"}, "region": {"startLine": 627}}}]}, {"ruleId": "scanner-4871e70fe5d45957", "level": "error", "message": {"text": "Flask mutation route `api_bypass_create` without `@login_required` \u2014 routes/plant_flow_routes.py:735"}, "properties": {"repobilityId": "bdaa9ed2e75a0777", "scanner": "scanner-primary", "fingerprint": "4871e70fe5d45957", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/plant_flow_routes.py"}, "region": {"startLine": 735}}}]}, {"ruleId": "scanner-34fbe7cc6599cb96", "level": "error", "message": {"text": "Flask mutation route `api_bypass_delete` without `@login_required` \u2014 routes/plant_flow_routes.py:771"}, "properties": {"repobilityId": "6fdd8ec3e0bdbb20", "scanner": "scanner-primary", "fingerprint": "34fbe7cc6599cb96", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/plant_flow_routes.py"}, "region": {"startLine": 771}}}]}, {"ruleId": "scanner-8244f24c224db050", "level": "error", "message": {"text": "Flask mutation route `handle_inspection_routes` without `@login_required` \u2014 routes/inspection_routes.py:17"}, "properties": {"repobilityId": "10da4bf8f0f89b62", "scanner": "scanner-primary", "fingerprint": "8244f24c224db050", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/inspection_routes.py"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-dec94bd699605750", "level": "error", "message": {"text": "Flask mutation route `handle_inspection_route_id` without `@login_required` \u2014 routes/inspection_routes.py:65"}, "properties": {"repobilityId": "d393b131142d8795", "scanner": "scanner-primary", "fingerprint": "dec94bd699605750", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/inspection_routes.py"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-456b44282cbaf991", "level": "error", "message": {"text": "Flask mutation route `duplicate_inspection_route` without `@login_required` \u2014 routes/inspection_routes.py:90"}, "properties": {"repobilityId": "24f01ddac85c60ae", "scanner": "scanner-primary", "fingerprint": "456b44282cbaf991", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/inspection_routes.py"}, "region": {"startLine": 90}}}]}, {"ruleId": "scanner-655c813202dfd768", "level": "error", "message": {"text": "Flask mutation route `handle_inspection_items` without `@login_required` \u2014 routes/inspection_routes.py:247"}, "properties": {"repobilityId": "0945f6dafdaf495f", "scanner": "scanner-primary", "fingerprint": "655c813202dfd768", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/inspection_routes.py"}, "region": {"startLine": 247}}}]}, {"ruleId": "scanner-10b8b6cef3beed33", "level": "error", "message": {"text": "Flask mutation route `handle_inspection_item_id` without `@login_required` \u2014 routes/inspection_routes.py:281"}, "properties": {"repobilityId": "564d479cb5475016", "scanner": "scanner-primary", "fingerprint": "10b8b6cef3beed33", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/inspection_routes.py"}, "region": {"startLine": 281}}}]}, {"ruleId": "scanner-67e01888a8d8632d", "level": "error", "message": {"text": "Flask mutation route `handle_inspection_executions` without `@login_required` \u2014 routes/inspection_routes.py:303"}, "properties": {"repobilityId": "315eec568c13471e", "scanner": "scanner-primary", "fingerprint": "67e01888a8d8632d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/inspection_routes.py"}, "region": {"startLine": 303}}}]}, {"ruleId": "scanner-b246985c5da0aa5e", "level": "error", "message": {"text": "Flask mutation route `generate_preventive_ots` without `@login_required` \u2014 routes/work_orders_routes.py:111"}, "properties": {"repobilityId": "cd5fac1d7ad4ce1a", "scanner": "scanner-primary", "fingerprint": "b246985c5da0aa5e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/work_orders_routes.py"}, "region": {"startLine": 111}}}]}, {"ruleId": "scanner-98f14505f49043e0", "level": "error", "message": {"text": "Flask mutation route `handle_ot_log` without `@login_required` \u2014 routes/work_orders_routes.py:206"}, "properties": {"repobilityId": "cdc5985e584af0d7", "scanner": "scanner-primary", "fingerprint": "98f14505f49043e0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/work_orders_routes.py"}, "region": {"startLine": 206}}}]}, {"ruleId": "scanner-bcda2f57dc2476db", "level": "error", "message": {"text": "Flask mutation route `delete_ot_log` without `@login_required` \u2014 routes/work_orders_routes.py:240"}, "properties": {"repobilityId": "1e1ef4c5345c0ef0", "scanner": "scanner-primary", "fingerprint": "bcda2f57dc2476db", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/work_orders_routes.py"}, "region": {"startLine": 240}}}]}, {"ruleId": "scanner-c6aba6f50d5922b8", "level": "error", "message": {"text": "Flask mutation route `update_ot_report` without `@login_required` \u2014 routes/work_orders_routes.py:314"}, "properties": {"repobilityId": "29e39b692fb0d5b3", "scanner": "scanner-primary", "fingerprint": "c6aba6f50d5922b8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/work_orders_routes.py"}, "region": {"startLine": 314}}}]}, {"ruleId": "scanner-5a7d8dd2f8f31b9a", "level": "error", "message": {"text": "Flask mutation route `update_ot_conformity` without `@login_required` \u2014 routes/work_orders_routes.py:344"}, "properties": {"repobilityId": "4c335dcf048d0a8c", "scanner": "scanner-primary", "fingerprint": "5a7d8dd2f8f31b9a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/work_orders_routes.py"}, "region": {"startLine": 344}}}]}, {"ruleId": "scanner-656f3590358d1ef3", "level": "error", "message": {"text": "Flask mutation route `handle_ot_personnel` without `@login_required` \u2014 routes/work_orders_routes.py:456"}, "properties": {"repobilityId": "c6fe57bb120d4f17", "scanner": "scanner-primary", "fingerprint": "656f3590358d1ef3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/work_orders_routes.py"}, "region": {"startLine": 456}}}]}, {"ruleId": "scanner-29bd417ea09c9c90", "level": "error", "message": {"text": "Flask mutation route `handle_ot_personnel_id` without `@login_required` \u2014 routes/work_orders_routes.py:555"}, "properties": {"repobilityId": "a7083895bc01a868", "scanner": "scanner-primary", "fingerprint": "29bd417ea09c9c90", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/work_orders_routes.py"}, "region": {"startLine": 555}}}]}, {"ruleId": "scanner-7eabee68a5d360fc", "level": "error", "message": {"text": "Flask mutation route `handle_ot_materials` without `@login_required` \u2014 routes/work_orders_routes.py:576"}, "properties": {"repobilityId": "f84a83d0bb2a8de7", "scanner": "scanner-primary", "fingerprint": "7eabee68a5d360fc", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/work_orders_routes.py"}, "region": {"startLine": 576}}}]}, {"ruleId": "scanner-e86a40187d553314", "level": "error", "message": {"text": "Flask mutation route `handle_ot_material_id` without `@login_required` \u2014 routes/work_orders_routes.py:672"}, "properties": {"repobilityId": "42dbbb440c4f403b", "scanner": "scanner-primary", "fingerprint": "e86a40187d553314", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/work_orders_routes.py"}, "region": {"startLine": 672}}}]}, {"ruleId": "scanner-2c9145cd36102eff", "level": "error", "message": {"text": "Flask mutation route `handle_daily_round` without `@login_required` \u2014 routes/work_orders_routes.py:849"}, "properties": {"repobilityId": "e95028efe0244704", "scanner": "scanner-primary", "fingerprint": "2c9145cd36102eff", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/work_orders_routes.py"}, "region": {"startLine": 849}}}]}, {"ruleId": "scanner-0790d360d33c8f78", "level": "error", "message": {"text": "Flask mutation route `handle_work_orders` without `@login_required` \u2014 routes/work_orders_routes.py:904"}, "properties": {"repobilityId": "c9d57d2c77d75a3d", "scanner": "scanner-primary", "fingerprint": "0790d360d33c8f78", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/work_orders_routes.py"}, "region": {"startLine": 904}}}]}, {"ruleId": "scanner-05afab586f920802", "level": "error", "message": {"text": "Flask mutation route `patch_wot_hours` without `@login_required` \u2014 routes/work_orders_routes.py:1300"}, "properties": {"repobilityId": "9f56141db0c8bc66", "scanner": "scanner-primary", "fingerprint": "05afab586f920802", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/work_orders_routes.py"}, "region": {"startLine": 1300}}}]}, {"ruleId": "scanner-8e71e68390b0c3f9", "level": "error", "message": {"text": "Flask mutation route `handle_wot_id` without `@login_required` \u2014 routes/work_orders_routes.py:1442"}, "properties": {"repobilityId": "0950d466cc5fd202", "scanner": "scanner-primary", "fingerprint": "8e71e68390b0c3f9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/work_orders_routes.py"}, "region": {"startLine": 1442}}}]}, {"ruleId": "scanner-cacfbb90b08e012e", "level": "error", "message": {"text": "Flask mutation route `handle_notices` without `@login_required` \u2014 routes/notices_routes.py:19"}, "properties": {"repobilityId": "506d80936259f569", "scanner": "scanner-primary", "fingerprint": "cacfbb90b08e012e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/notices_routes.py"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-4b0c8819471fb25b", "level": "error", "message": {"text": "Flask mutation route `handle_notice_id` without `@login_required` \u2014 routes/notices_routes.py:235"}, "properties": {"repobilityId": "4b8c8323f0041d39", "scanner": "scanner-primary", "fingerprint": "4b0c8819471fb25b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/notices_routes.py"}, "region": {"startLine": 235}}}]}, {"ruleId": "scanner-9330a06ac30e9ab2", "level": "error", "message": {"text": "Flask mutation route `patch_notice_reported_at` without `@login_required` \u2014 routes/notices_routes.py:285"}, "properties": {"repobilityId": "60e4329d13dc7d9a", "scanner": "scanner-primary", "fingerprint": "9330a06ac30e9ab2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/notices_routes.py"}, "region": {"startLine": 285}}}]}, {"ruleId": "scanner-bb5b3365e0df9a9b", "level": "error", "message": {"text": "Flask mutation route `handle_providers` without `@login_required` \u2014 routes/master_data_routes.py:39"}, "properties": {"repobilityId": "23026a3e4a897de6", "scanner": "scanner-primary", "fingerprint": "bb5b3365e0df9a9b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/master_data_routes.py"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-3a3ef391bf73e20c", "level": "error", "message": {"text": "Flask mutation route `handle_provider_id` without `@login_required` \u2014 routes/master_data_routes.py:50"}, "properties": {"repobilityId": "daff2c72e6246ada", "scanner": "scanner-primary", "fingerprint": "3a3ef391bf73e20c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/master_data_routes.py"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-2e9849cd36715c9d", "level": "error", "message": {"text": "Flask mutation route `handle_technicians` without `@login_required` \u2014 routes/master_data_routes.py:73"}, "properties": {"repobilityId": "545659d4f996ca83", "scanner": "scanner-primary", "fingerprint": "2e9849cd36715c9d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/master_data_routes.py"}, "region": {"startLine": 73}}}]}, {"ruleId": "scanner-c355c7e98b36ea24", "level": "error", "message": {"text": "Flask mutation route `handle_technician_id` without `@login_required` \u2014 routes/master_data_routes.py:88"}, "properties": {"repobilityId": "0d20c3d13f9d6339", "scanner": "scanner-primary", "fingerprint": "c355c7e98b36ea24", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/master_data_routes.py"}, "region": {"startLine": 88}}}]}, {"ruleId": "scanner-8fa52309f040a32e", "level": "error", "message": {"text": "Flask mutation route `handle_areas` without `@login_required` \u2014 routes/master_data_routes.py:111"}, "properties": {"repobilityId": "a43dd0c83afb5b1e", "scanner": "scanner-primary", "fingerprint": "8fa52309f040a32e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/master_data_routes.py"}, "region": {"startLine": 111}}}]}, {"ruleId": "scanner-04642d1ed465f69c", "level": "error", "message": {"text": "Flask mutation route `handle_area_id` without `@login_required` \u2014 routes/master_data_routes.py:117"}, "properties": {"repobilityId": "1f909c6b34a522ce", "scanner": "scanner-primary", "fingerprint": "04642d1ed465f69c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/master_data_routes.py"}, "region": {"startLine": 117}}}]}, {"ruleId": "scanner-44cd315f27404661", "level": "error", "message": {"text": "Flask mutation route `handle_lines` without `@login_required` \u2014 routes/master_data_routes.py:123"}, "properties": {"repobilityId": "12b7be7f003a67b6", "scanner": "scanner-primary", "fingerprint": "44cd315f27404661", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/master_data_routes.py"}, "region": {"startLine": 123}}}]}, {"ruleId": "scanner-afecda0143065cdd", "level": "error", "message": {"text": "Flask mutation route `handle_line_id` without `@login_required` \u2014 routes/master_data_routes.py:129"}, "properties": {"repobilityId": "7d12c1e1169e8c25", "scanner": "scanner-primary", "fingerprint": "afecda0143065cdd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/master_data_routes.py"}, "region": {"startLine": 129}}}]}, {"ruleId": "scanner-96725b41c09cf7a7", "level": "error", "message": {"text": "Flask mutation route `merge_lines` without `@login_required` \u2014 routes/master_data_routes.py:135"}, "properties": {"repobilityId": "17cc86bd6f867a8e", "scanner": "scanner-primary", "fingerprint": "96725b41c09cf7a7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/master_data_routes.py"}, "region": {"startLine": 135}}}]}, {"ruleId": "scanner-17370da0f5773c0a", "level": "error", "message": {"text": "Flask mutation route `handle_equipments` without `@login_required` \u2014 routes/master_data_routes.py:229"}, "properties": {"repobilityId": "767abc201572cae9", "scanner": "scanner-primary", "fingerprint": "17370da0f5773c0a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/master_data_routes.py"}, "region": {"startLine": 229}}}]}, {"ruleId": "scanner-a88b92068f27bd56", "level": "error", "message": {"text": "Flask mutation route `handle_equipment_id` without `@login_required` \u2014 routes/master_data_routes.py:235"}, "properties": {"repobilityId": "606be7ec0ed8f78e", "scanner": "scanner-primary", "fingerprint": "a88b92068f27bd56", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/master_data_routes.py"}, "region": {"startLine": 235}}}]}, {"ruleId": "scanner-3f43f7456fd606d8", "level": "error", "message": {"text": "Flask mutation route `bulk_set_equipment_responsibility` without `@login_required` \u2014 routes/master_data_routes.py:241"}, "properties": {"repobilityId": "7a2d44b00f65c507", "scanner": "scanner-primary", "fingerprint": "3f43f7456fd606d8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/master_data_routes.py"}, "region": {"startLine": 241}}}]}, {"ruleId": "scanner-4911136bad747f5d", "level": "error", "message": {"text": "Flask mutation route `handle_systems` without `@login_required` \u2014 routes/master_data_routes.py:268"}, "properties": {"repobilityId": "8f7626f65129e8e8", "scanner": "scanner-primary", "fingerprint": "4911136bad747f5d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/master_data_routes.py"}, "region": {"startLine": 268}}}]}, {"ruleId": "scanner-e4065cfcd17da8bf", "level": "error", "message": {"text": "Flask mutation route `handle_system_id` without `@login_required` \u2014 routes/master_data_routes.py:274"}, "properties": {"repobilityId": "31ed0a1841c44c3c", "scanner": "scanner-primary", "fingerprint": "e4065cfcd17da8bf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/master_data_routes.py"}, "region": {"startLine": 274}}}]}, {"ruleId": "scanner-e3d2e66e7e6e58df", "level": "error", "message": {"text": "Flask mutation route `handle_components` without `@login_required` \u2014 routes/master_data_routes.py:280"}, "properties": {"repobilityId": "d81c594fd2992d8e", "scanner": "scanner-primary", "fingerprint": "e3d2e66e7e6e58df", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/master_data_routes.py"}, "region": {"startLine": 280}}}]}, {"ruleId": "scanner-4c42145ac0d03c14", "level": "error", "message": {"text": "Flask mutation route `handle_component_id` without `@login_required` \u2014 routes/master_data_routes.py:286"}, "properties": {"repobilityId": "be45c3113ea77f5e", "scanner": "scanner-primary", "fingerprint": "4c42145ac0d03c14", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/master_data_routes.py"}, "region": {"startLine": 286}}}]}, {"ruleId": "scanner-ec0ae2b6e91b1895", "level": "error", "message": {"text": "Flask mutation route `handle_spare_parts` without `@login_required` \u2014 routes/master_data_routes.py:292"}, "properties": {"repobilityId": "d2b7fbac2c615e5f", "scanner": "scanner-primary", "fingerprint": "ec0ae2b6e91b1895", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/master_data_routes.py"}, "region": {"startLine": 292}}}]}, {"ruleId": "scanner-a7b3157806933a06", "level": "error", "message": {"text": "Flask mutation route `handle_spare_part_id` without `@login_required` \u2014 routes/master_data_routes.py:298"}, "properties": {"repobilityId": "909f8c414ac91179", "scanner": "scanner-primary", "fingerprint": "a7b3157806933a06", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/master_data_routes.py"}, "region": {"startLine": 298}}}]}, {"ruleId": "scanner-13b48ff0de42c930", "level": "error", "message": {"text": "Flask mutation route `login` without `@login_required` \u2014 routes/auth_routes.py:25"}, "properties": {"repobilityId": "a2c31663640a5358", "scanner": "scanner-primary", "fingerprint": "13b48ff0de42c930", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/auth_routes.py"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-cfd31bd8cccbde17", "level": "error", "message": {"text": "Flask mutation route `handle_shutdowns` without `@login_required` \u2014 routes/shutdown_routes.py:31"}, "properties": {"repobilityId": "05858ceacea98836", "scanner": "scanner-primary", "fingerprint": "cfd31bd8cccbde17", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/shutdown_routes.py"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-5779ad63445c6de6", "level": "error", "message": {"text": "Flask mutation route `handle_shutdown_detail` without `@login_required` \u2014 routes/shutdown_routes.py:124"}, "properties": {"repobilityId": "ad3e565fd01590a1", "scanner": "scanner-primary", "fingerprint": "5779ad63445c6de6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/shutdown_routes.py"}, "region": {"startLine": 124}}}]}, {"ruleId": "scanner-b5eb483efd3375ea", "level": "error", "message": {"text": "Flask mutation route `create_ot_in_shutdown` without `@login_required` \u2014 routes/shutdown_routes.py:283"}, "properties": {"repobilityId": "617feb516e319107", "scanner": "scanner-primary", "fingerprint": "b5eb483efd3375ea", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/shutdown_routes.py"}, "region": {"startLine": 283}}}]}, {"ruleId": "scanner-6b33e0f478be4c09", "level": "error", "message": {"text": "Flask mutation route `add_ot_to_shutdown` without `@login_required` \u2014 routes/shutdown_routes.py:364"}, "properties": {"repobilityId": "9dc3c2550073be79", "scanner": "scanner-primary", "fingerprint": "6b33e0f478be4c09", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/shutdown_routes.py"}, "region": {"startLine": 364}}}]}, {"ruleId": "scanner-26ba360f14106081", "level": "error", "message": {"text": "Flask mutation route `remove_ot_from_shutdown` without `@login_required` \u2014 routes/shutdown_routes.py:384"}, "properties": {"repobilityId": "82d496c9eea0a6a3", "scanner": "scanner-primary", "fingerprint": "26ba360f14106081", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/shutdown_routes.py"}, "region": {"startLine": 384}}}]}, {"ruleId": "scanner-ee0c4ae157c6740b", "level": "error", "message": {"text": "Flask mutation route `handle_shutdown_templates` without `@login_required` \u2014 routes/shutdown_routes.py:524"}, "properties": {"repobilityId": "c394aebbc894164b", "scanner": "scanner-primary", "fingerprint": "ee0c4ae157c6740b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/shutdown_routes.py"}, "region": {"startLine": 524}}}]}, {"ruleId": "scanner-c7d7ef6a59d2c81d", "level": "error", "message": {"text": "Flask mutation route `handle_shutdown_template_detail` without `@login_required` \u2014 routes/shutdown_routes.py:556"}, "properties": {"repobilityId": "837f4abffc2ceb9d", "scanner": "scanner-primary", "fingerprint": "c7d7ef6a59d2c81d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/shutdown_routes.py"}, "region": {"startLine": 556}}}]}, {"ruleId": "scanner-6581b760c9935a33", "level": "error", "message": {"text": "Flask mutation route `duplicate_shutdown_template` without `@login_required` \u2014 routes/shutdown_routes.py:585"}, "properties": {"repobilityId": "97712f84906e49c0", "scanner": "scanner-primary", "fingerprint": "6581b760c9935a33", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/shutdown_routes.py"}, "region": {"startLine": 585}}}]}, {"ruleId": "scanner-47c347765ec4b9e9", "level": "error", "message": {"text": "Flask mutation route `reorder_template_items` without `@login_required` \u2014 routes/shutdown_routes.py:628"}, "properties": {"repobilityId": "bf74835f4e234afb", "scanner": "scanner-primary", "fingerprint": "47c347765ec4b9e9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/shutdown_routes.py"}, "region": {"startLine": 628}}}]}, {"ruleId": "scanner-abafb513d982e689", "level": "error", "message": {"text": "Flask mutation route `add_template_item` without `@login_required` \u2014 routes/shutdown_routes.py:647"}, "properties": {"repobilityId": "ac68fa88e53ce428", "scanner": "scanner-primary", "fingerprint": "abafb513d982e689", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/shutdown_routes.py"}, "region": {"startLine": 647}}}]}, {"ruleId": "scanner-59d30319a731fb7f", "level": "error", "message": {"text": "Flask mutation route `handle_template_item` without `@login_required` \u2014 routes/shutdown_routes.py:706"}, "properties": {"repobilityId": "2e9429b3cfaa0d90", "scanner": "scanner-primary", "fingerprint": "59d30319a731fb7f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/shutdown_routes.py"}, "region": {"startLine": 706}}}]}, {"ruleId": "scanner-e68c3528668336c1", "level": "error", "message": {"text": "Flask mutation route `apply_template_to_shutdown` without `@login_required` \u2014 routes/shutdown_routes.py:781"}, "properties": {"repobilityId": "f270b3e9bbe7cf7f", "scanner": "scanner-primary", "fingerprint": "e68c3528668336c1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/shutdown_routes.py"}, "region": {"startLine": 781}}}]}, {"ruleId": "scanner-7fe6ae05478dc89c", "level": "error", "message": {"text": "Flask mutation route `handle_photos` without `@login_required` \u2014 routes/core_routes.py:702"}, "properties": {"repobilityId": "cfcdae343231a107", "scanner": "scanner-primary", "fingerprint": "7fe6ae05478dc89c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/core_routes.py"}, "region": {"startLine": 702}}}]}, {"ruleId": "scanner-d858acf98877a779", "level": "error", "message": {"text": "Flask mutation route `delete_photo` without `@login_required` \u2014 routes/core_routes.py:767"}, "properties": {"repobilityId": "651adcdc60761cc1", "scanner": "scanner-primary", "fingerprint": "d858acf98877a779", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/core_routes.py"}, "region": {"startLine": 767}}}]}, {"ruleId": "scanner-4767d8482893bd38", "level": "error", "message": {"text": "Flask mutation route `handle_specs` without `@login_required` \u2014 routes/core_routes.py:823"}, "properties": {"repobilityId": "cb8c447c0de5e5ed", "scanner": "scanner-primary", "fingerprint": "4767d8482893bd38", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/core_routes.py"}, "region": {"startLine": 823}}}]}, {"ruleId": "scanner-563d1399d7959f92", "level": "error", "message": {"text": "Flask mutation route `update_spec` without `@login_required` \u2014 routes/core_routes.py:847"}, "properties": {"repobilityId": "40d98498fee9ccea", "scanner": "scanner-primary", "fingerprint": "563d1399d7959f92", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/core_routes.py"}, "region": {"startLine": 847}}}]}, {"ruleId": "scanner-ba5bd19cadd29600", "level": "error", "message": {"text": "Flask mutation route `delete_spec` without `@login_required` \u2014 routes/core_routes.py:864"}, "properties": {"repobilityId": "0dff0f0767bc6935", "scanner": "scanner-primary", "fingerprint": "ba5bd19cadd29600", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/core_routes.py"}, "region": {"startLine": 864}}}]}, {"ruleId": "scanner-28306e377b0edc5c", "level": "error", "message": {"text": "Flask mutation route `replicate_specs` without `@login_required` \u2014 routes/core_routes.py:875"}, "properties": {"repobilityId": "d03b71e10b391f70", "scanner": "scanner-primary", "fingerprint": "28306e377b0edc5c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/core_routes.py"}, "region": {"startLine": 875}}}]}, {"ruleId": "scanner-3a06c3f4a8ee90cd", "level": "error", "message": {"text": "Flask mutation route `handle_doc_links` without `@login_required` \u2014 routes/core_routes.py:942"}, "properties": {"repobilityId": "2c746f4dcf1c5fa2", "scanner": "scanner-primary", "fingerprint": "3a06c3f4a8ee90cd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/core_routes.py"}, "region": {"startLine": 942}}}]}, {"ruleId": "scanner-b0d49bbfb959d55f", "level": "error", "message": {"text": "Flask mutation route `delete_doc_link` without `@login_required` \u2014 routes/core_routes.py:968"}, "properties": {"repobilityId": "08aff0dc219c629b", "scanner": "scanner-primary", "fingerprint": "b0d49bbfb959d55f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/core_routes.py"}, "region": {"startLine": 968}}}]}, {"ruleId": "scanner-517b0f53b288f93b", "level": "error", "message": {"text": "Flask mutation route `create_failure_catalog` without `@login_required` \u2014 routes/core_routes.py:1121"}, "properties": {"repobilityId": "953d8112122ec06b", "scanner": "scanner-primary", "fingerprint": "517b0f53b288f93b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/core_routes.py"}, "region": {"startLine": 1121}}}]}, {"ruleId": "scanner-6d8cc294f3fa32c3", "level": "error", "message": {"text": "Flask mutation route `update_failure_catalog` without `@login_required` \u2014 routes/core_routes.py:1141"}, "properties": {"repobilityId": "b2f9ef30b95e562c", "scanner": "scanner-primary", "fingerprint": "6d8cc294f3fa32c3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/core_routes.py"}, "region": {"startLine": 1141}}}]}, {"ruleId": "scanner-273d239979bc98e6", "level": "error", "message": {"text": "Flask mutation route `delete_failure_catalog` without `@login_required` \u2014 routes/core_routes.py:1163"}, "properties": {"repobilityId": "1a7814de3f733c16", "scanner": "scanner-primary", "fingerprint": "273d239979bc98e6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/core_routes.py"}, "region": {"startLine": 1163}}}]}, {"ruleId": "scanner-34bb0d4b86f5e895", "level": "error", "message": {"text": "Flask mutation route `increment_failure_catalog` without `@login_required` \u2014 routes/core_routes.py:1173"}, "properties": {"repobilityId": "e2eeeb2f6dcf3a34", "scanner": "scanner-primary", "fingerprint": "34bb0d4b86f5e895", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/core_routes.py"}, "region": {"startLine": 1173}}}]}, {"ruleId": "scanner-137de13f19c807a6", "level": "error", "message": {"text": "Flask mutation route `seed_failure_catalog` without `@login_required` \u2014 routes/core_routes.py:1183"}, "properties": {"repobilityId": "4d9385ba6e0feafa", "scanner": "scanner-primary", "fingerprint": "137de13f19c807a6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/core_routes.py"}, "region": {"startLine": 1183}}}]}, {"ruleId": "scanner-596f6304e05f1dc0", "level": "error", "message": {"text": "Flask mutation route `mark_notifications_read` without `@login_required` \u2014 routes/core_routes.py:1479"}, "properties": {"repobilityId": "65da8bbb3edc9544", "scanner": "scanner-primary", "fingerprint": "596f6304e05f1dc0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/core_routes.py"}, "region": {"startLine": 1479}}}]}, {"ruleId": "scanner-2dfa861f6677bf64", "level": "error", "message": {"text": "Flask mutation route `scan_notifications` without `@login_required` \u2014 routes/core_routes.py:1497"}, "properties": {"repobilityId": "edb02b1c1813149b", "scanner": "scanner-primary", "fingerprint": "2dfa861f6677bf64", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/core_routes.py"}, "region": {"startLine": 1497}}}]}, {"ruleId": "scanner-ee5938cee3c4b0dc", "level": "error", "message": {"text": "Flask mutation route `import_warehouse_excel` without `@login_required` \u2014 routes/warehouse_routes.py:245"}, "properties": {"repobilityId": "b9cda3aad55a14a1", "scanner": "scanner-primary", "fingerprint": "ee5938cee3c4b0dc", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/warehouse_routes.py"}, "region": {"startLine": 245}}}]}, {"ruleId": "scanner-56adff81895863bb", "level": "error", "message": {"text": "Flask mutation route `calculate_inventory_params` without `@login_required` \u2014 routes/warehouse_routes.py:393"}, "properties": {"repobilityId": "674c834736885940", "scanner": "scanner-primary", "fingerprint": "56adff81895863bb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/warehouse_routes.py"}, "region": {"startLine": 393}}}]}, {"ruleId": "scanner-158d52e91b920494", "level": "error", "message": {"text": "Flask mutation route `handle_warehouse_movements` without `@login_required` \u2014 routes/warehouse_routes.py:516"}, "properties": {"repobilityId": "08ec9ffbe6c2beb6", "scanner": "scanner-primary", "fingerprint": "158d52e91b920494", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/warehouse_routes.py"}, "region": {"startLine": 516}}}]}, {"ruleId": "scanner-52a047283c4f5714", "level": "error", "message": {"text": "Flask mutation route `handle_monitoring_points` without `@login_required` \u2014 routes/monitoring_routes.py:20"}, "properties": {"repobilityId": "22f4dffd4895932b", "scanner": "scanner-primary", "fingerprint": "52a047283c4f5714", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/monitoring_routes.py"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-13fbec8d45025e27", "level": "error", "message": {"text": "Flask mutation route `handle_monitoring_point_id` without `@login_required` \u2014 routes/monitoring_routes.py:112"}, "properties": {"repobilityId": "802decca911db48c", "scanner": "scanner-primary", "fingerprint": "13fbec8d45025e27", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/monitoring_routes.py"}, "region": {"startLine": 112}}}]}, {"ruleId": "scanner-902ba11f9ebfcad8", "level": "error", "message": {"text": "Flask mutation route `handle_monitoring_readings` without `@login_required` \u2014 routes/monitoring_routes.py:149"}, "properties": {"repobilityId": "c64baecdc92fc989", "scanner": "scanner-primary", "fingerprint": "902ba11f9ebfcad8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/monitoring_routes.py"}, "region": {"startLine": 149}}}]}, {"ruleId": "scanner-58126bfbffed5af2", "level": "error", "message": {"text": "Flask mutation route `wp_create` without `@login_required` \u2014 routes/weekly_plan_routes.py:145"}, "properties": {"repobilityId": "95026f6047a3a22d", "scanner": "scanner-primary", "fingerprint": "58126bfbffed5af2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/weekly_plan_routes.py"}, "region": {"startLine": 145}}}]}, {"ruleId": "scanner-329d5556140d752b", "level": "error", "message": {"text": "Flask mutation route `wp_update` without `@login_required` \u2014 routes/weekly_plan_routes.py:201"}, "properties": {"repobilityId": "42dff10b2449b5aa", "scanner": "scanner-primary", "fingerprint": "329d5556140d752b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/weekly_plan_routes.py"}, "region": {"startLine": 201}}}]}, {"ruleId": "scanner-72d578be314c0cfb", "level": "error", "message": {"text": "Flask mutation route `wp_delete` without `@login_required` \u2014 routes/weekly_plan_routes.py:222"}, "properties": {"repobilityId": "dfb78fe6025c9dda", "scanner": "scanner-primary", "fingerprint": "72d578be314c0cfb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/weekly_plan_routes.py"}, "region": {"startLine": 222}}}]}, {"ruleId": "scanner-b3688e0f8e1bc5a6", "level": "error", "message": {"text": "Flask mutation route `wp_publish` without `@login_required` \u2014 routes/weekly_plan_routes.py:234"}, "properties": {"repobilityId": "3544e79483e81600", "scanner": "scanner-primary", "fingerprint": "b3688e0f8e1bc5a6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/weekly_plan_routes.py"}, "region": {"startLine": 234}}}]}, {"ruleId": "scanner-f69ab2ad460a19b9", "level": "error", "message": {"text": "Flask mutation route `wp_auto_plan` without `@login_required` \u2014 routes/weekly_plan_routes.py:258"}, "properties": {"repobilityId": "d23dc31e78e752c6", "scanner": "scanner-primary", "fingerprint": "f69ab2ad460a19b9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/weekly_plan_routes.py"}, "region": {"startLine": 258}}}]}, {"ruleId": "scanner-2c10549aca970ffa", "level": "error", "message": {"text": "Flask mutation route `wp_item_add` without `@login_required` \u2014 routes/weekly_plan_routes.py:481"}, "properties": {"repobilityId": "2ef23a75238d49c4", "scanner": "scanner-primary", "fingerprint": "2c10549aca970ffa", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/weekly_plan_routes.py"}, "region": {"startLine": 481}}}]}, {"ruleId": "scanner-96b067564b7f443a", "level": "error", "message": {"text": "Flask mutation route `wp_item_update` without `@login_required` \u2014 routes/weekly_plan_routes.py:508"}, "properties": {"repobilityId": "5cf57e984b0ab631", "scanner": "scanner-primary", "fingerprint": "96b067564b7f443a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/weekly_plan_routes.py"}, "region": {"startLine": 508}}}]}, {"ruleId": "scanner-4217d09fd05faff1", "level": "error", "message": {"text": "Flask mutation route `wp_item_delete` without `@login_required` \u2014 routes/weekly_plan_routes.py:531"}, "properties": {"repobilityId": "0ea0632d9bcd7256", "scanner": "scanner-primary", "fingerprint": "4217d09fd05faff1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/weekly_plan_routes.py"}, "region": {"startLine": 531}}}]}, {"ruleId": "scanner-9e11b0c1e682dc3c", "level": "error", "message": {"text": "Flask mutation route `wp_item_execute` without `@login_required` \u2014 routes/weekly_plan_routes.py:640"}, "properties": {"repobilityId": "e6f851bc29b10a76", "scanner": "scanner-primary", "fingerprint": "9e11b0c1e682dc3c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/weekly_plan_routes.py"}, "region": {"startLine": 640}}}]}, {"ruleId": "scanner-096121643b05c17b", "level": "error", "message": {"text": "Flask mutation route `wp_public_execute` without `@login_required` \u2014 routes/weekly_plan_routes.py:690"}, "properties": {"repobilityId": "43e8d1fcedc140a6", "scanner": "scanner-primary", "fingerprint": "096121643b05c17b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/weekly_plan_routes.py"}, "region": {"startLine": 690}}}]}, {"ruleId": "scanner-cc07eef36ef276c3", "level": "error", "message": {"text": "Flask mutation route `handle_thickness_points` without `@login_required` \u2014 routes/thickness_routes.py:50"}, "properties": {"repobilityId": "987e2f4bb9a12547", "scanner": "scanner-primary", "fingerprint": "cc07eef36ef276c3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/thickness_routes.py"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-a978bd826fa99ec9", "level": "error", "message": {"text": "Flask mutation route `update_thickness_point` without `@login_required` \u2014 routes/thickness_routes.py:78"}, "properties": {"repobilityId": "09055e9457b98c59", "scanner": "scanner-primary", "fingerprint": "a978bd826fa99ec9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/thickness_routes.py"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-bc6894647fcf06a3", "level": "error", "message": {"text": "Flask mutation route `handle_thickness_inspections` without `@login_required` \u2014 routes/thickness_routes.py:93"}, "properties": {"repobilityId": "72f901bd52870010", "scanner": "scanner-primary", "fingerprint": "bc6894647fcf06a3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/thickness_routes.py"}, "region": {"startLine": 93}}}]}, {"ruleId": "scanner-4e5d87ce1862a841", "level": "error", "message": {"text": "Flask mutation route `update_thickness_pdf_url` without `@login_required` \u2014 routes/thickness_routes.py:216"}, "properties": {"repobilityId": "7e325917ea878b0c", "scanner": "scanner-primary", "fingerprint": "4e5d87ce1862a841", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/thickness_routes.py"}, "region": {"startLine": 216}}}]}, {"ruleId": "scanner-44b34d0dd6d877bb", "level": "error", "message": {"text": "Flask mutation route `edit_thickness_inspection` without `@login_required` \u2014 routes/thickness_routes.py:231"}, "properties": {"repobilityId": "e28817a6c2592b46", "scanner": "scanner-primary", "fingerprint": "44b34d0dd6d877bb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/thickness_routes.py"}, "region": {"startLine": 231}}}]}, {"ruleId": "scanner-6db3579ece1a0043", "level": "error", "message": {"text": "Flask mutation route `handle_thickness_inspection_detail` without `@login_required` \u2014 routes/thickness_routes.py:310"}, "properties": {"repobilityId": "dbec30c36ef85236", "scanner": "scanner-primary", "fingerprint": "6db3579ece1a0043", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/thickness_routes.py"}, "region": {"startLine": 310}}}]}, {"ruleId": "scanner-e648e8adbf70fe91", "level": "error", "message": {"text": "Flask mutation route `upload_thickness_template` without `@login_required` \u2014 routes/thickness_routes.py:668"}, "properties": {"repobilityId": "4165507d5818eae8", "scanner": "scanner-primary", "fingerprint": "e648e8adbf70fe91", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/thickness_routes.py"}, "region": {"startLine": 668}}}]}, {"ruleId": "scanner-36bb3ab463a1d639", "level": "error", "message": {"text": "Flask mutation route `handle_tools` without `@login_required` \u2014 routes/tools_routes.py:9"}, "properties": {"repobilityId": "bc8ab12832ddbb5b", "scanner": "scanner-primary", "fingerprint": "36bb3ab463a1d639", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/tools_routes.py"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-ea82a6fc372e1144", "level": "error", "message": {"text": "Flask mutation route `handle_tool_id` without `@login_required` \u2014 routes/tools_routes.py:34"}, "properties": {"repobilityId": "4429b9dbd6da34f8", "scanner": "scanner-primary", "fingerprint": "ea82a6fc372e1144", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/tools_routes.py"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-b907a490d29d12ac", "level": "error", "message": {"text": "Flask mutation route `import_tools_excel` without `@login_required` \u2014 routes/tools_routes.py:125"}, "properties": {"repobilityId": "3c139468dc7fd1f7", "scanner": "scanner-primary", "fingerprint": "b907a490d29d12ac", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/tools_routes.py"}, "region": {"startLine": 125}}}]}, {"ruleId": "scanner-da74022b872abcab", "level": "error", "message": {"text": "Flask mutation route `motor_tests` without `@login_required` \u2014 routes/motors_routes.py:156"}, "properties": {"repobilityId": "feb1bbc033189315", "scanner": "scanner-primary", "fingerprint": "da74022b872abcab", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/motors_routes.py"}, "region": {"startLine": 156}}}]}, {"ruleId": "scanner-96f069938a64eaf9", "level": "error", "message": {"text": "Flask mutation route `motor_config` without `@login_required` \u2014 routes/motors_routes.py:286"}, "properties": {"repobilityId": "1c6fb6b5a2572a97", "scanner": "scanner-primary", "fingerprint": "96f069938a64eaf9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/motors_routes.py"}, "region": {"startLine": 286}}}]}, {"ruleId": "scanner-05c5cb7cecd1aaf9", "level": "error", "message": {"text": "Flask mutation route `manage_motors` without `@login_required` \u2014 routes/motors_routes.py:334"}, "properties": {"repobilityId": "ace478886ad9137d", "scanner": "scanner-primary", "fingerprint": "05c5cb7cecd1aaf9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/motors_routes.py"}, "region": {"startLine": 334}}}]}, {"ruleId": "scanner-04f26f33aa5ece65", "level": "error", "message": {"text": "Flask mutation route `initialize_db` without `@login_required` \u2014 routes/admin_routes.py:10"}, "properties": {"repobilityId": "aed990201630bc35", "scanner": "scanner-primary", "fingerprint": "04f26f33aa5ece65", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/admin_routes.py"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-867a31bc17cff0d4", "level": "error", "message": {"text": "Flask mutation route `handle_requirements` without `@login_required` \u2014 routes/requirements_routes.py:27"}, "properties": {"repobilityId": "f9e9f092299a979e", "scanner": "scanner-primary", "fingerprint": "867a31bc17cff0d4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/requirements_routes.py"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-e5636952223c789c", "level": "error", "message": {"text": "Flask mutation route `handle_requirement` without `@login_required` \u2014 routes/requirements_routes.py:94"}, "properties": {"repobilityId": "ca6acb50368345ee", "scanner": "scanner-primary", "fingerprint": "e5636952223c789c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/requirements_routes.py"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-53dddc0d920b26d7", "level": "error", "message": {"text": "Flask mutation route `convert_requirement` without `@login_required` \u2014 routes/requirements_routes.py:146"}, "properties": {"repobilityId": "615713b362ece9a5", "scanner": "scanner-primary", "fingerprint": "53dddc0d920b26d7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/requirements_routes.py"}, "region": {"startLine": 146}}}]}, {"ruleId": "scanner-af309ecfa3152560", "level": "error", "message": {"text": "Dangling fetch: GET /api/indicators/area/${areaId}/equipments?${dateParams()} (static/js/indicators.js:66)"}, "properties": {"repobilityId": "855a4087c6912c94", "scanner": "scanner-primary", "fingerprint": "af309ecfa3152560", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7ce84bcf2edf9996", "level": "error", "message": {"text": "Dangling fetch: GET /api/indicators/equipment/${equipId}/failures?${dateParams()} (static/js/indicators.js:78)"}, "properties": {"repobilityId": "5dbc387c0627e425", "scanner": "scanner-primary", "fingerprint": "7ce84bcf2edf9996", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6e2281dd5544c91a", "level": "error", "message": {"text": "Dangling fetch: PUT /api/purchase-orders/${poId}/external-code (static/js/purchasing.js:198)"}, "properties": {"repobilityId": "b2b44e4383e50a78", "scanner": "scanner-primary", "fingerprint": "6e2281dd5544c91a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6000feb67149300b", "level": "error", "message": {"text": "Dangling fetch: POST /api/purchase-orders/${activeReceivePO.id}/receive (static/js/purchasing.js:332)"}, "properties": {"repobilityId": "0e00e7cf185f9742", "scanner": "scanner-primary", "fingerprint": "6000feb67149300b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cd836666720d118b", "level": "error", "message": {"text": "Dangling fetch: GET /api/work-orders/by-code/${encodeURIComponent(otCode)} (static/js/purchasing.js:377)"}, "properties": {"repobilityId": "6ac2054c25433ae1", "scanner": "scanner-primary", "fingerprint": "cd836666720d118b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b4fd48d8d3285177", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/production/goals/${id} (static/js/produccion.js:477)"}, "properties": {"repobilityId": "3ff991613c014073", "scanner": "scanner-primary", "fingerprint": "b4fd48d8d3285177", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bbe71e82dea097d8", "level": "error", "message": {"text": "Dangling fetch: GET /api/specs/${apiT}/${id} (static/js/app.js:746)"}, "properties": {"repobilityId": "e089aa0646486505", "scanner": "scanner-primary", "fingerprint": "bbe71e82dea097d8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1240da5f41d764c4", "level": "error", "message": {"text": "Dangling fetch: PUT /api/specs/${_editingSpecId.apiType}/${_editingSpecId.specId}/update (static/js/app.js:785)"}, "properties": {"repobilityId": "449b36d1b369f417", "scanner": "scanner-primary", "fingerprint": "1240da5f41d764c4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-da86778926ba7626", "level": "error", "message": {"text": "Dangling fetch: POST /api/specs/${_apiType(type)}/${id} (static/js/app.js:792)"}, "properties": {"repobilityId": "273b75027cacc4ac", "scanner": "scanner-primary", "fingerprint": "da86778926ba7626", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-59887b632ffc2f9f", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/specs/${apiType}/${specId}/delete (static/js/app.js:806)"}, "properties": {"repobilityId": "c3dc4440e4a197a6", "scanner": "scanner-primary", "fingerprint": "59887b632ffc2f9f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9aa9adb70d0a5aba", "level": "error", "message": {"text": "Dangling fetch: GET /api/specs/${apiT}/${id} (static/js/app.js:1044)"}, "properties": {"repobilityId": "9f78de26e195cdc8", "scanner": "scanner-primary", "fingerprint": "9aa9adb70d0a5aba", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1e6d8d65dad2bbac", "level": "error", "message": {"text": "Dangling fetch: POST /api/specs/${apiT}/${id} (static/js/app.js:1056)"}, "properties": {"repobilityId": "ea4814ecbcd69581", "scanner": "scanner-primary", "fingerprint": "1e6d8d65dad2bbac", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a56d70b205c8047e", "level": "error", "message": {"text": "Dangling fetch: GET /api/doc-links/${apiT}/${id} (static/js/app.js:1074)"}, "properties": {"repobilityId": "d5da73ad1094bf79", "scanner": "scanner-primary", "fingerprint": "a56d70b205c8047e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6ad5c76d366ff849", "level": "error", "message": {"text": "Dangling fetch: POST /api/doc-links/${_apiType(type)}/${id} (static/js/app.js:1101)"}, "properties": {"repobilityId": "dd8302aca1d27bb4", "scanner": "scanner-primary", "fingerprint": "6ad5c76d366ff849", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3022b28e007ff9ff", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/doc-links/${docId} (static/js/app.js:1113)"}, "properties": {"repobilityId": "40a4d339d7f2dcad", "scanner": "scanner-primary", "fingerprint": "3022b28e007ff9ff", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3926db5bfe43b7ae", "level": "error", "message": {"text": "Dangling fetch: POST /api/lines/${sourceId}/merge-into/${targetId} (static/js/app.js:1193)"}, "properties": {"repobilityId": "1afd7f09be8d7bac", "scanner": "scanner-primary", "fingerprint": "3926db5bfe43b7ae", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0fa692b3e7f26bd4", "level": "error", "message": {"text": "Dangling fetch: GET /api/weekly-plans/${id} (static/js/programa_nocturno.js:60)"}, "properties": {"repobilityId": "b8f12958314283e1", "scanner": "scanner-primary", "fingerprint": "0fa692b3e7f26bd4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-07e771ca091368f2", "level": "error", "message": {"text": "Dangling fetch: PUT /api/weekly-plans/${_state.plan.id}/items/${itemId} (static/js/programa_nocturno.js:174)"}, "properties": {"repobilityId": "0b1634ed9d527222", "scanner": "scanner-primary", "fingerprint": "07e771ca091368f2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-90066ea235dd1e06", "level": "error", "message": {"text": "Dangling fetch: POST /api/weekly-plans/${_state.plan.id}/auto-plan (static/js/programa_nocturno.js:250)"}, "properties": {"repobilityId": "f58b4d38ee05310c", "scanner": "scanner-primary", "fingerprint": "90066ea235dd1e06", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-59a8edf9013945d3", "level": "error", "message": {"text": "Dangling fetch: POST /api/weekly-plans/${_state.plan.id}/publish (static/js/programa_nocturno.js:269)"}, "properties": {"repobilityId": "080286986781b30d", "scanner": "scanner-primary", "fingerprint": "59a8edf9013945d3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ae2e733551e26d2e", "level": "error", "message": {"text": "Dangling fetch: GET /api/weekly-plans/${_state.plan.id}/matrix (static/js/programa_nocturno.js:333)"}, "properties": {"repobilityId": "b3328a7c249f95b0", "scanner": "scanner-primary", "fingerprint": "ae2e733551e26d2e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cf634a2778bcec10", "level": "error", "message": {"text": "Dangling fetch: POST /api/weekly-plans/${_state.plan.id}/items/${it.id}/execute (static/js/programa_nocturno.js:445)"}, "properties": {"repobilityId": "463aa09378a654ef", "scanner": "scanner-primary", "fingerprint": "cf634a2778bcec10", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7645632d638b3915", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/weekly-plans/${_state.plan.id} (static/js/programa_nocturno.js:463)"}, "properties": {"repobilityId": "ecdf62eff36a100b", "scanner": "scanner-primary", "fingerprint": "7645632d638b3915", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8ed5888adfcdddb6", "level": "error", "message": {"text": "Dangling fetch: POST /api/weekly-plans/${_state.plan.id}/items/${itemId}/execute (static/js/programa_nocturno.js:474)"}, "properties": {"repobilityId": "22b1036fa32e5c3c", "scanner": "scanner-primary", "fingerprint": "8ed5888adfcdddb6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7673d45728d3699f", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/weekly-plans/${_state.plan.id}/items/${itemId} (static/js/programa_nocturno.js:490)"}, "properties": {"repobilityId": "38bc9cbe1dbd087b", "scanner": "scanner-primary", "fingerprint": "7673d45728d3699f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6a08fee99b7d3492", "level": "error", "message": {"text": "Dangling fetch: POST /api/weekly-plans/${_state.plan.id}/items (static/js/programa_nocturno.js:576)"}, "properties": {"repobilityId": "8aa529927fc736c2", "scanner": "scanner-primary", "fingerprint": "6a08fee99b7d3492", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6bee05639873cfb9", "level": "error", "message": {"text": "Dangling fetch: GET /api/notices/${id} (static/js/notices.js:524)"}, "properties": {"repobilityId": "10af6bd957266f12", "scanner": "scanner-primary", "fingerprint": "6bee05639873cfb9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-65bfabc964fc70fa", "level": "error", "message": {"text": "Dangling fetch: PUT /api/notices/${id} (static/js/notices.js:915)"}, "properties": {"repobilityId": "74712047c5d762df", "scanner": "scanner-primary", "fingerprint": "65bfabc964fc70fa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ca7fa95a635184e6", "level": "error", "message": {"text": "Dangling fetch: PUT /api/notices/${id} (static/js/notices.js:943)"}, "properties": {"repobilityId": "329389800795e2f4", "scanner": "scanner-primary", "fingerprint": "ca7fa95a635184e6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b322d2b6c8c9ce2e", "level": "error", "message": {"text": "Dangling fetch: GET /api/notices/${noticeId} (static/js/notices.js:971)"}, "properties": {"repobilityId": "6f2b487b92713ca3", "scanner": "scanner-primary", "fingerprint": "b322d2b6c8c9ce2e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e8a110f17edd8d69", "level": "error", "message": {"text": "Dangling fetch: GET /api/photos/notice/${noticeId} (static/js/notices.js:1015)"}, "properties": {"repobilityId": "af17b3fbb0aeb231", "scanner": "scanner-primary", "fingerprint": "e8a110f17edd8d69", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0c200bf08e041932", "level": "error", "message": {"text": "Dangling fetch: POST /api/photos/notice/${noticeId} (static/js/notices.js:1048)"}, "properties": {"repobilityId": "3dba4fd86632339d", "scanner": "scanner-primary", "fingerprint": "0c200bf08e041932", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ad869c4af2461627", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/photos/${photoId} (static/js/notices.js:1070)"}, "properties": {"repobilityId": "4d75e14b1e28ad61", "scanner": "scanner-primary", "fingerprint": "ad869c4af2461627", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-454310d20af4a204", "level": "error", "message": {"text": "Dangling fetch: GET /api/photo-share/generate/notice/${noticeId} (static/js/notices.js:1086)"}, "properties": {"repobilityId": "005299a8d444b6dd", "scanner": "scanner-primary", "fingerprint": "454310d20af4a204", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8d129dadcf780b3e", "level": "error", "message": {"text": "Dangling fetch: GET /api/shutdowns/${shutdownId} (static/js/shutdowns.js:95)"}, "properties": {"repobilityId": "4d24fcd1f29aa666", "scanner": "scanner-primary", "fingerprint": "8d129dadcf780b3e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3cb09b7eb570f8a9", "level": "error", "message": {"text": "Dangling fetch: GET /api/shutdowns/${_activeShutdown.id}/suggestions (static/js/shutdowns.js:345)"}, "properties": {"repobilityId": "a14d141eafd220ac", "scanner": "scanner-primary", "fingerprint": "3cb09b7eb570f8a9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f9e5eb578f1608be", "level": "error", "message": {"text": "Dangling fetch: POST /api/shutdowns/${_activeShutdown.id}/add-ot (static/js/shutdowns.js:370)"}, "properties": {"repobilityId": "835f11e506069852", "scanner": "scanner-primary", "fingerprint": "f9e5eb578f1608be", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-422e44ed9cc4d9d2", "level": "error", "message": {"text": "Dangling fetch: POST /api/shutdowns/${shId}/work-orders (static/js/shutdowns.js:552)"}, "properties": {"repobilityId": "dec7a38f03d99f33", "scanner": "scanner-primary", "fingerprint": "422e44ed9cc4d9d2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-331724329b885783", "level": "error", "message": {"text": "Dangling fetch: GET /api/shutdowns/${shId}/preventive-sources?source_type=${type} (static/js/shutdowns.js:617)"}, "properties": {"repobilityId": "8a9cad3cced15f76", "scanner": "scanner-primary", "fingerprint": "331724329b885783", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-84c98ff5dcf237de", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/shutdowns/${_activeShutdown.id}/remove-ot/${otId} (static/js/shutdowns.js:704)"}, "properties": {"repobilityId": "40efa5a94377837c", "scanner": "scanner-primary", "fingerprint": "84c98ff5dcf237de", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-66968fce4db299da", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/shutdowns/${_activeShutdown.id} (static/js/shutdowns.js:732)"}, "properties": {"repobilityId": "9ce5afd5e0537ecf", "scanner": "scanner-primary", "fingerprint": "66968fce4db299da", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2e0688f303063cf1", "level": "error", "message": {"text": "Dangling fetch: POST /api/shutdowns/${shId}/apply-template/${tplId} (static/js/shutdowns.js:781)"}, "properties": {"repobilityId": "6d0d95637fa56a5c", "scanner": "scanner-primary", "fingerprint": "2e0688f303063cf1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4a2c1fc294e1f513", "level": "error", "message": {"text": "Dangling fetch: POST /api/shutdowns/${shId}/apply-template/${tplId} (static/js/shutdowns.js:879)"}, "properties": {"repobilityId": "1cf0a742e98dcee6", "scanner": "scanner-primary", "fingerprint": "4a2c1fc294e1f513", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-53abfab7bc9d0fbf", "level": "error", "message": {"text": "Dangling fetch: GET /api/thickness/points/${equipmentId} (static/js/thickness.js:124)"}, "properties": {"repobilityId": "f5bebda42a51ce8c", "scanner": "scanner-primary", "fingerprint": "53abfab7bc9d0fbf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8eefb91b6fe22bdf", "level": "error", "message": {"text": "Dangling fetch: GET /api/thickness/inspections/${_editingInspectionId} (static/js/thickness.js:137)"}, "properties": {"repobilityId": "236fea7d29b7357b", "scanner": "scanner-primary", "fingerprint": "8eefb91b6fe22bdf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-478969d5b2194226", "level": "error", "message": {"text": "Dangling fetch: PUT /api/thickness/inspections/${inspectionId}/pdf (static/js/thickness.js:484)"}, "properties": {"repobilityId": "20e08b3c74dc9cf8", "scanner": "scanner-primary", "fingerprint": "478969d5b2194226", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d06a3226d2dc3447", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/thickness/inspections/${inspectionId} (static/js/thickness.js:509)"}, "properties": {"repobilityId": "04eee51c07cd6279", "scanner": "scanner-primary", "fingerprint": "d06a3226d2dc3447", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6592b7e7c77a17bd", "level": "error", "message": {"text": "Dangling fetch: GET /api/thickness/points/${equipmentId} (static/js/thickness.js:533)"}, "properties": {"repobilityId": "cd5dda20dcedd28c", "scanner": "scanner-primary", "fingerprint": "6592b7e7c77a17bd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c04d4a015a77aad1", "level": "error", "message": {"text": "Dangling fetch: GET /api/thickness/analysis/${equipmentId} (static/js/thickness.js:535)"}, "properties": {"repobilityId": "6c4b8dfad6b3f7af", "scanner": "scanner-primary", "fingerprint": "c04d4a015a77aad1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b3fee3434cbc7cc7", "level": "error", "message": {"text": "Dangling fetch: GET /api/thickness/history/${pointId} (static/js/thickness.js:635)"}, "properties": {"repobilityId": "c8ac92a09ee4934f", "scanner": "scanner-primary", "fingerprint": "b3fee3434cbc7cc7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ced5673c00ff65be", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/providers/${id} (static/js/work_orders.js:495)"}, "properties": {"repobilityId": "33c7955e38f2057c", "scanner": "scanner-primary", "fingerprint": "ced5673c00ff65be", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bc8329880cb4f5a7", "level": "error", "message": {"text": "Dangling fetch: POST /api/work_orders/${otId}/materials (static/js/work_orders.js:994)"}, "properties": {"repobilityId": "3d7f2ba755ad529b", "scanner": "scanner-primary", "fingerprint": "bc8329880cb4f5a7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4665d973930a6a4f", "level": "error", "message": {"text": "Dangling fetch: PUT /api/notices/${noticeId} (static/js/work_orders.js:1086)"}, "properties": {"repobilityId": "5badf61a72c1d51b", "scanner": "scanner-primary", "fingerprint": "4665d973930a6a4f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-90cf920f1243aa9f", "level": "error", "message": {"text": "Dangling fetch: PUT /api/work-orders/${id} (static/js/work_orders.js:1220)"}, "properties": {"repobilityId": "26a16e6bfdb34754", "scanner": "scanner-primary", "fingerprint": "90cf920f1243aa9f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fd55d72321482f71", "level": "error", "message": {"text": "Dangling fetch: PUT /api/work-orders/${id} (static/js/work_orders.js:1341)"}, "properties": {"repobilityId": "7c48a63ac64654a2", "scanner": "scanner-primary", "fingerprint": "fd55d72321482f71", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-aa4bb99428902114", "level": "error", "message": {"text": "Dangling fetch: GET /api/work_orders/${ot.id}/materials (static/js/work_orders.js:1419)"}, "properties": {"repobilityId": "acb110ce4df27fbd", "scanner": "scanner-primary", "fingerprint": "aa4bb99428902114", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4c7f31744f404ddf", "level": "error", "message": {"text": "Dangling fetch: GET /api/work_orders/${ot.id}/personnel (static/js/work_orders.js:1489)"}, "properties": {"repobilityId": "302981f837bf20d0", "scanner": "scanner-primary", "fingerprint": "4c7f31744f404ddf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1eb66e08f788cc4b", "level": "error", "message": {"text": "Dangling fetch: PUT /api/work-orders/${activeExecutionOT.id} (static/js/work_orders.js:1867)"}, "properties": {"repobilityId": "db4788f2eff6144d", "scanner": "scanner-primary", "fingerprint": "1eb66e08f788cc4b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2b10665e8a322d38", "level": "error", "message": {"text": "Dangling fetch: PUT /api/notices/${activeExecutionOT.notice_id} (static/js/work_orders.js:1877)"}, "properties": {"repobilityId": "666aca409f91b2da", "scanner": "scanner-primary", "fingerprint": "2b10665e8a322d38", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c06197513b908f79", "level": "error", "message": {"text": "Dangling fetch: POST /api/work_orders/${id}/log (static/js/work_orders.js:1918)"}, "properties": {"repobilityId": "977bc74a6998034c", "scanner": "scanner-primary", "fingerprint": "c06197513b908f79", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-484bd64397e766f5", "level": "error", "message": {"text": "Dangling fetch: GET /api/work_orders/${activeExecutionOT.id}/personnel (static/js/work_orders.js:1954)"}, "properties": {"repobilityId": "aea529412d8307cb", "scanner": "scanner-primary", "fingerprint": "484bd64397e766f5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7fb6d6df730df711", "level": "error", "message": {"text": "Dangling fetch: PUT /api/work-orders/${id} (static/js/work_orders.js:2162)"}, "properties": {"repobilityId": "21b17757b3002073", "scanner": "scanner-primary", "fingerprint": "7fb6d6df730df711", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f4bfdbae51e0d423", "level": "error", "message": {"text": "Dangling fetch: PUT /api/work_orders/${id}/personnel/${p.id} (static/js/work_orders.js:2173)"}, "properties": {"repobilityId": "f0226cabfd583273", "scanner": "scanner-primary", "fingerprint": "f4bfdbae51e0d423", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b348870431f61a79", "level": "error", "message": {"text": "Dangling fetch: POST /api/work_orders/${id}/personnel (static/js/work_orders.js:2180)"}, "properties": {"repobilityId": "3c1285e23514455a", "scanner": "scanner-primary", "fingerprint": "b348870431f61a79", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b30a824cd00a354f", "level": "error", "message": {"text": "Dangling fetch: POST /api/work_orders/${id}/log (static/js/work_orders.js:2197)"}, "properties": {"repobilityId": "e889c8d8e6d46281", "scanner": "scanner-primary", "fingerprint": "b30a824cd00a354f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ef2cf9e7e6c59fb0", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/work-orders/${id}/hours (static/js/work_orders.js:2252)"}, "properties": {"repobilityId": "a215de461d214854", "scanner": "scanner-primary", "fingerprint": "ef2cf9e7e6c59fb0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-750bc0b2fc04b816", "level": "error", "message": {"text": "Dangling fetch: GET /api/work_orders/${id}/personnel (static/js/work_orders.js:2273)"}, "properties": {"repobilityId": "5a58678797723b73", "scanner": "scanner-primary", "fingerprint": "750bc0b2fc04b816", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ddf9ddb94cd1ed08", "level": "error", "message": {"text": "Dangling fetch: GET /api/photo-share/generate/work_order/${otId} (static/js/work_orders.js:2300)"}, "properties": {"repobilityId": "b50298ae78366ff9", "scanner": "scanner-primary", "fingerprint": "ddf9ddb94cd1ed08", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f92a7d0251df48c3", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/technicians/${id} (static/js/work_orders.js:2452)"}, "properties": {"repobilityId": "6dd470c2e570f771", "scanner": "scanner-primary", "fingerprint": "f92a7d0251df48c3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e050d39dbebc43d8", "level": "error", "message": {"text": "Dangling fetch: GET /api/photos/notice/${id} (static/js/work_orders.js:2652)"}, "properties": {"repobilityId": "4d2cd097882a772e", "scanner": "scanner-primary", "fingerprint": "e050d39dbebc43d8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3b051bea0f2c1e65", "level": "error", "message": {"text": "Dangling fetch: PUT /api/notices/${noticeId} (static/js/work_orders.js:2674)"}, "properties": {"repobilityId": "40ab18169df10475", "scanner": "scanner-primary", "fingerprint": "3b051bea0f2c1e65", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f8a618a9c0eb53c6", "level": "error", "message": {"text": "Dangling fetch: PUT /api/notices/${noticeId} (static/js/work_orders.js:2688)"}, "properties": {"repobilityId": "01a80753eb756c04", "scanner": "scanner-primary", "fingerprint": "f8a618a9c0eb53c6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5ba7fa438af9ba26", "level": "error", "message": {"text": "Dangling fetch: GET /api/notices/${noticeId} (static/js/work_orders.js:2703)"}, "properties": {"repobilityId": "1cb6f6aa9387cd78", "scanner": "scanner-primary", "fingerprint": "5ba7fa438af9ba26", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0873d2d6b1e15ee4", "level": "error", "message": {"text": "Dangling fetch: GET /api/work_orders/${otId}/personnel (static/js/work_orders.js:2783)"}, "properties": {"repobilityId": "b56c06b4452c799f", "scanner": "scanner-primary", "fingerprint": "0873d2d6b1e15ee4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8ba6487d724854a3", "level": "error", "message": {"text": "Dangling fetch: GET /api/work_orders/${otId}/log (static/js/work_orders.js:2858)"}, "properties": {"repobilityId": "d9c046f4ee7f1f76", "scanner": "scanner-primary", "fingerprint": "8ba6487d724854a3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bace259f7007fdb3", "level": "error", "message": {"text": "Dangling fetch: POST /api/work_orders/${activeExecutionOT.id}/log (static/js/work_orders.js:2905)"}, "properties": {"repobilityId": "e9202596210472b4", "scanner": "scanner-primary", "fingerprint": "bace259f7007fdb3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3aa6922bef6f739e", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/work_orders/${activeExecutionOT.id}/log/${logId} (static/js/work_orders.js:2921)"}, "properties": {"repobilityId": "40b6a3a1274850a6", "scanner": "scanner-primary", "fingerprint": "3aa6922bef6f739e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f7b459821f9412a8", "level": "error", "message": {"text": "Dangling fetch: PUT /api/work_orders/${activeExecutionOT.id}/conformity (static/js/work_orders.js:3024)"}, "properties": {"repobilityId": "4acce63a913408a9", "scanner": "scanner-primary", "fingerprint": "f7b459821f9412a8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-850315298335a01a", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/work_orders/${activeExecutionOT.id}/conformity (static/js/work_orders.js:3049)"}, "properties": {"repobilityId": "744e4ca8e81a9d72", "scanner": "scanner-primary", "fingerprint": "850315298335a01a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-94d63d9f59fa15d1", "level": "error", "message": {"text": "Dangling fetch: PUT /api/work_orders/${activeExecutionOT.id}/report (static/js/work_orders.js:3078)"}, "properties": {"repobilityId": "9fa8a48c60640208", "scanner": "scanner-primary", "fingerprint": "94d63d9f59fa15d1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e0c19fe14d20a20b", "level": "error", "message": {"text": "Dangling fetch: POST /api/work_orders/${otId}/materials (static/js/work_orders.js:3409)"}, "properties": {"repobilityId": "9881dd4dc3efb607", "scanner": "scanner-primary", "fingerprint": "e0c19fe14d20a20b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-351b3efe2c58d438", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/work_orders/${otId}/materials/${id} (static/js/work_orders.js:3430)"}, "properties": {"repobilityId": "4a7f802952c1e1c1", "scanner": "scanner-primary", "fingerprint": "351b3efe2c58d438", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d816f242b2576c28", "level": "error", "message": {"text": "Dangling fetch: GET /api/work_orders/${otId}/personnel (static/js/work_orders.js:3440)"}, "properties": {"repobilityId": "2707e9c4f816e526", "scanner": "scanner-primary", "fingerprint": "d816f242b2576c28", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d1219281f0409231", "level": "error", "message": {"text": "Dangling fetch: POST /api/work_orders/${otId}/personnel (static/js/work_orders.js:3566)"}, "properties": {"repobilityId": "075a2c0e6f337b42", "scanner": "scanner-primary", "fingerprint": "d1219281f0409231", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-932ebec70e96c657", "level": "error", "message": {"text": "Dangling fetch: GET /api/work_orders/${otId}/materials (static/js/work_orders.js:3581)"}, "properties": {"repobilityId": "bd62d1c2379ab6fc", "scanner": "scanner-primary", "fingerprint": "932ebec70e96c657", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8ec262b542c73fc9", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/work_orders/${otId}/materials/${id} (static/js/work_orders.js:3648)"}, "properties": {"repobilityId": "f63bbced2de79d48", "scanner": "scanner-primary", "fingerprint": "8ec262b542c73fc9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8edd84dae185dd3e", "level": "error", "message": {"text": "Dangling fetch: GET /api/work_orders/${otId}/personnel (static/js/work_orders.js:3658)"}, "properties": {"repobilityId": "642fbf49f76eab06", "scanner": "scanner-primary", "fingerprint": "8edd84dae185dd3e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-97bdcca54341737f", "level": "error", "message": {"text": "Dangling fetch: POST /api/work_orders/${otId}/personnel (static/js/work_orders.js:3847)"}, "properties": {"repobilityId": "7b8d885659e1dde8", "scanner": "scanner-primary", "fingerprint": "97bdcca54341737f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-757eb8c8895170c3", "level": "error", "message": {"text": "Dangling fetch: GET /api/photos/work_order/${otId} (static/js/work_orders.js:4261)"}, "properties": {"repobilityId": "a5ced9c7a8ef54bd", "scanner": "scanner-primary", "fingerprint": "757eb8c8895170c3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-65af4a6a04169e44", "level": "error", "message": {"text": "Dangling fetch: POST /api/photos/work_order/${activeExecutionOT.id} (static/js/work_orders.js:4292)"}, "properties": {"repobilityId": "3ce4f79be1c4a4ab", "scanner": "scanner-primary", "fingerprint": "65af4a6a04169e44", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-12ee0188ace1215a", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/photos/${photoId} (static/js/work_orders.js:4314)"}, "properties": {"repobilityId": "90c8cd71ba31f8d8", "scanner": "scanner-primary", "fingerprint": "12ee0188ace1215a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dd34b8304db67726", "level": "error", "message": {"text": "Dangling fetch: GET /api/photos/notice/${noticeId} (static/js/work_orders.js:4331)"}, "properties": {"repobilityId": "131a1b80ad3b7893", "scanner": "scanner-primary", "fingerprint": "dd34b8304db67726", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cde59710d8acb154", "level": "error", "message": {"text": "Dangling fetch: POST /api/requirements/${id}/convert (static/js/requirements.js:246)"}, "properties": {"repobilityId": "0bc02975c97294a9", "scanner": "scanner-primary", "fingerprint": "cde59710d8acb154", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3e40eccf4bb30c1b", "level": "note", "message": {"text": "Unused endpoint: ANY /produccion"}, "properties": {"repobilityId": "a1502331ce83cd14", "scanner": "scanner-primary", "fingerprint": "3e40eccf4bb30c1b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dd999ff5469faece", "level": "note", "message": {"text": "Unused endpoint: ANY /api/production/goals"}, "properties": {"repobilityId": "de79b7d92163b34d", "scanner": "scanner-primary", "fingerprint": "dd999ff5469faece", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f8440c98e34019a9", "level": "note", "message": {"text": "Unused endpoint: ANY /api/production/goals/<int:goal_id>"}, "properties": {"repobilityId": "aed3b0460edfa363", "scanner": "scanner-primary", "fingerprint": "f8440c98e34019a9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ac1501991b99e38d", "level": "note", "message": {"text": "Unused endpoint: ANY /api/production/export"}, "properties": {"repobilityId": "bd943d734bd36d22", "scanner": "scanner-primary", "fingerprint": "ac1501991b99e38d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9c038f4b5fdb9818", "level": "note", "message": {"text": "Unused endpoint: ANY /api/lubrication/points"}, "properties": {"repobilityId": "c19f6b0812e9791b", "scanner": "scanner-primary", "fingerprint": "9c038f4b5fdb9818", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a4080c29825448cf", "level": "note", "message": {"text": "Unused endpoint: ANY /api/lubrication/points/<int:point_id>"}, "properties": {"repobilityId": "3575ea62bf76e90d", "scanner": "scanner-primary", "fingerprint": "a4080c29825448cf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2a358a145419330f", "level": "note", "message": {"text": "Unused endpoint: ANY /api/lubrication/executions"}, "properties": {"repobilityId": "ecd32fdae2fca733", "scanner": "scanner-primary", "fingerprint": "2a358a145419330f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ed7770b0781de658", "level": "note", "message": {"text": "Unused endpoint: ANY /api/lubrication/executions/<int:exec_id>"}, "properties": {"repobilityId": "adb4f1481764aa26", "scanner": "scanner-primary", "fingerprint": "ed7770b0781de658", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-291bfffb6cb442b2", "level": "note", "message": {"text": "Unused endpoint: ANY /api/lubrication/dashboard"}, "properties": {"repobilityId": "b096a8be851a0d48", "scanner": "scanner-primary", "fingerprint": "291bfffb6cb442b2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-75f3083417e2c21f", "level": "note", "message": {"text": "Unused endpoint: ANY /api/activities"}, "properties": {"repobilityId": "f360ef45e15b1e53", "scanner": "scanner-primary", "fingerprint": "75f3083417e2c21f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3a3fdb18a9686240", "level": "note", "message": {"text": "Unused endpoint: ANY /api/activities/<int:act_id>"}, "properties": {"repobilityId": "df9b2d718b65da7a", "scanner": "scanner-primary", "fingerprint": "3a3fdb18a9686240", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bb0d7383c1da6dad", "level": "note", "message": {"text": "Unused endpoint: ANY /api/activities/<int:act_id>/milestones"}, "properties": {"repobilityId": "959a8e5169c1cbed", "scanner": "scanner-primary", "fingerprint": "bb0d7383c1da6dad", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e6398110e8a725a4", "level": "note", "message": {"text": "Unused endpoint: ANY /api/milestones/<int:ms_id>"}, "properties": {"repobilityId": "bc046b3b5856881b", "scanner": "scanner-primary", "fingerprint": "e6398110e8a725a4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6e939e0fd6a2b209", "level": "note", "message": {"text": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>"}, "properties": {"repobilityId": "53f3d3738a5ae0dc", "scanner": "scanner-primary", "fingerprint": "6e939e0fd6a2b209", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-926673127f79cf3f", "level": "note", "message": {"text": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>/install"}, "properties": {"repobilityId": "71b7760629cda687", "scanner": "scanner-primary", "fingerprint": "926673127f79cf3f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-deef3b603ceebadb", "level": "note", "message": {"text": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>/remove"}, "properties": {"repobilityId": "64a58d5856cb97e6", "scanner": "scanner-primary", "fingerprint": "deef3b603ceebadb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d1de84eb25fa8e73", "level": "note", "message": {"text": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>/history"}, "properties": {"repobilityId": "8a4f40b03ef2b496", "scanner": "scanner-primary", "fingerprint": "d1de84eb25fa8e73", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aad7dd60210ee379", "level": "note", "message": {"text": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>/specs"}, "properties": {"repobilityId": "535f9118cd78564a", "scanner": "scanner-primary", "fingerprint": "aad7dd60210ee379", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-052054dc779112e2", "level": "note", "message": {"text": "Unused endpoint: ANY /api/rotative-assets/specs/<int:spec_id>"}, "properties": {"repobilityId": "ff536541e433aa4d", "scanner": "scanner-primary", "fingerprint": "052054dc779112e2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-165262d394ea26b3", "level": "note", "message": {"text": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>/bom"}, "properties": {"repobilityId": "8496e8aee104b3c8", "scanner": "scanner-primary", "fingerprint": "165262d394ea26b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cdc5dda33287c975", "level": "note", "message": {"text": "Unused endpoint: ANY /api/rotative-assets/bom/<int:bom_id>"}, "properties": {"repobilityId": "ef7a3e1e963bb144", "scanner": "scanner-primary", "fingerprint": "cdc5dda33287c975", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b71efe2fceb20be6", "level": "note", "message": {"text": "Unused endpoint: ANY /api/rotative-assets/swap"}, "properties": {"repobilityId": "d856b37b35aaf7c0", "scanner": "scanner-primary", "fingerprint": "b71efe2fceb20be6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d9e52d3fdc5dfab1", "level": "note", "message": {"text": "Unused endpoint: ANY /api/rotative-assets/<int:asset_id>/full-history"}, "properties": {"repobilityId": "dc11cc5ee202efa3", "scanner": "scanner-primary", "fingerprint": "d9e52d3fdc5dfab1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e5c343c03bcd699c", "level": "note", "message": {"text": "Unused endpoint: ANY /api/export-data"}, "properties": {"repobilityId": "d9e50cef653e7c39", "scanner": "scanner-primary", "fingerprint": "e5c343c03bcd699c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-85c334bb7d067da3", "level": "note", "message": {"text": "Unused endpoint: ANY /api/export-hierarchy-complete"}, "properties": {"repobilityId": "e325fd3068ed4611", "scanner": "scanner-primary", "fingerprint": "85c334bb7d067da3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c5caca404880ec81", "level": "note", "message": {"text": "Unused endpoint: ANY /api/download-template"}, "properties": {"repobilityId": "ca242c28097799ba", "scanner": "scanner-primary", "fingerprint": "c5caca404880ec81", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b961dc24e98e1102", "level": "note", "message": {"text": "Unused endpoint: ANY /insights"}, "properties": {"repobilityId": "45aeb276cdcbbe7c", "scanner": "scanner-primary", "fingerprint": "b961dc24e98e1102", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0c80383a701f450b", "level": "note", "message": {"text": "Unused endpoint: ANY /optimizacion-preventivos"}, "properties": {"repobilityId": "65b8c02d26e4b545", "scanner": "scanner-primary", "fingerprint": "0c80383a701f450b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-692179188f50d8d6", "level": "note", "message": {"text": "Unused endpoint: ANY /api/insights/preventive-optimization"}, "properties": {"repobilityId": "8fcb56bb0a2181c3", "scanner": "scanner-primary", "fingerprint": "692179188f50d8d6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-da10108ae0c2eb71", "level": "note", "message": {"text": "Unused endpoint: ANY /api/insights/preventive-optimization/apply"}, "properties": {"repobilityId": "7e4d26c81482d4ae", "scanner": "scanner-primary", "fingerprint": "da10108ae0c2eb71", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-adc0494b0bfec492", "level": "note", "message": {"text": "Unused endpoint: ANY /cumplimiento-preventivos"}, "properties": {"repobilityId": "9dcb09ba612983e9", "scanner": "scanner-primary", "fingerprint": "adc0494b0bfec492", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3c08555c0a5c27b8", "level": "note", "message": {"text": "Unused endpoint: ANY /api/insights/preventive-compliance"}, "properties": {"repobilityId": "a2c1e87c074f9e43", "scanner": "scanner-primary", "fingerprint": "3c08555c0a5c27b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1dfcc4029e00f629", "level": "note", "message": {"text": "Unused endpoint: ANY /api/insights/weekly-summary"}, "properties": {"repobilityId": "475e690900cbe3a3", "scanner": "scanner-primary", "fingerprint": "1dfcc4029e00f629", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cdd7b812a63c1a72", "level": "note", "message": {"text": "Unused endpoint: ANY /api/insights/narrative"}, "properties": {"repobilityId": "d3c2bad9a1a4e41a", "scanner": "scanner-primary", "fingerprint": "cdd7b812a63c1a72", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd3adebf42b44125", "level": "note", "message": {"text": "Unused endpoint: ANY /api/purchase-orders/<int:id>/receive"}, "properties": {"repobilityId": "7fd0856b152833c4", "scanner": "scanner-primary", "fingerprint": "fd3adebf42b44125", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-56491214aa673834", "level": "note", "message": {"text": "Unused endpoint: ANY /api/purchase-orders/<int:id>/close"}, "properties": {"repobilityId": "f9da40c2db6f9555", "scanner": "scanner-primary", "fingerprint": "56491214aa673834", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-046ec82f122ea680", "level": "note", "message": {"text": "Unused endpoint: ANY /api/purchase-orders/<int:id>/external-code"}, "properties": {"repobilityId": "375dc13f36c584e6", "scanner": "scanner-primary", "fingerprint": "046ec82f122ea680", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b90529b806434502", "level": "note", "message": {"text": "Unused endpoint: ANY /operatividad-anual"}, "properties": {"repobilityId": "56b33f8bc4458fc1", "scanner": "scanner-primary", "fingerprint": "b90529b806434502", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-062016e5f9beaa24", "level": "note", "message": {"text": "Unused endpoint: ANY /api/operatividad-anual/filters"}, "properties": {"repobilityId": "3f2096da45eaf49f", "scanner": "scanner-primary", "fingerprint": "062016e5f9beaa24", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-45f81bcb15889ba7", "level": "note", "message": {"text": "Unused endpoint: ANY /api/operatividad-anual"}, "properties": {"repobilityId": "2e71b5a0712278ba", "scanner": "scanner-primary", "fingerprint": "45f81bcb15889ba7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-41d193a0d0814205", "level": "note", "message": {"text": "Unused endpoint: ANY /api/operatividad-anual/cell"}, "properties": {"repobilityId": "b3ef41bacc1c725d", "scanner": "scanner-primary", "fingerprint": "41d193a0d0814205", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-049d353ba33d5977", "level": "note", "message": {"text": "Unused endpoint: ANY /api/hammer-batches"}, "properties": {"repobilityId": "2cbd8b064b6fe614", "scanner": "scanner-primary", "fingerprint": "049d353ba33d5977", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c6b25b816566a70c", "level": "note", "message": {"text": "Unused endpoint: ANY /api/hammer-batches/<int:batch_id>"}, "properties": {"repobilityId": "19c91d3c80604495", "scanner": "scanner-primary", "fingerprint": "c6b25b816566a70c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e2d7282e0c5a0d5a", "level": "note", "message": {"text": "Unused endpoint: ANY /api/hammer-batches/<int:batch_id>/discard"}, "properties": {"repobilityId": "548718b9f2b5cae2", "scanner": "scanner-primary", "fingerprint": "e2d7282e0c5a0d5a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c3a11550ffc46b07", "level": "note", "message": {"text": "Unused endpoint: ANY /api/hammer-batches/<int:batch_id>/receive"}, "properties": {"repobilityId": "be43d70b8e57ea0c", "scanner": "scanner-primary", "fingerprint": "c3a11550ffc46b07", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-af5ea95bd24c5837", "level": "note", "message": {"text": "Unused endpoint: ANY /api/hammer-batches/change"}, "properties": {"repobilityId": "11d750d9973cd471", "scanner": "scanner-primary", "fingerprint": "af5ea95bd24c5837", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5513cbb48893b780", "level": "note", "message": {"text": "Unused endpoint: ANY /api/hammer-batches/state"}, "properties": {"repobilityId": "19b8df47627292bf", "scanner": "scanner-primary", "fingerprint": "5513cbb48893b780", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-42c0f46eb2a4f4cd", "level": "note", "message": {"text": "Unused endpoint: ANY /api/hammer-batches/changes-log"}, "properties": {"repobilityId": "e6414d893569c13e", "scanner": "scanner-primary", "fingerprint": "42c0f46eb2a4f4cd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9abc063c7e4f935c", "level": "note", "message": {"text": "Unused endpoint: ANY /api/hammer-batches/conciliation"}, "properties": {"repobilityId": "16dcf1cd0584dc58", "scanner": "scanner-primary", "fingerprint": "9abc063c7e4f935c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dd6a7f306b976111", "level": "note", "message": {"text": "Unused endpoint: ANY /flujo-planta"}, "properties": {"repobilityId": "a0f277fc1da842c2", "scanner": "scanner-primary", "fingerprint": "dd6a7f306b976111", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}