{"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-0de3ac4aef1f604d", "name": "Possibly dead Python function: require_farm_access", "shortDescription": {"text": "Possibly dead Python function: require_farm_access"}, "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-d63da3583b14afc0", "name": "Dockerfile runs as root: Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-de3c1f217d72a063", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-07046a2c62d1c25a", "name": "Insecure pattern 'direct_innerhtml_assignment' in index.html:1198", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in index.html:1198"}, "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-09771699eb09d5f7", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/fusion-page.js:45", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/fusion-page.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-88724c1147138fc5", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/fotos.js:38", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/fotos.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-f5aabcace8f26db4", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/field.js:466", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/field.js:466"}, "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-c23fd3ed7401e341", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/resiliencia.js:60", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/resiliencia.js:60"}, "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-31ee861f7d418fda", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/efectividad-intervenciones.js:25", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/efectividad-intervenciones.js:25"}, "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-62419518a05d09d5", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/recommendations.js:72", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/recommendations.js:72"}, "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-4335e5b0ae2ec947", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/coop-progreso-mensual.js:91", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/coop-progreso-mensual.js:91"}, "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-e9b3d533ee430982", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/carbon.js:41", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/carbon.js:41"}, "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-c26c4740a4431e2b", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/cerebro-analytics.js:111", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/cerebro-analytics.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-37ecd40dfaf80ecd", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/confianza-tratamientos.js:76", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/confianza-tratamientos.js:76"}, "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-e9edca44522c8ae9", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/intel.js:64", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/intel.js:64"}, "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-f4ed806bd01fb44d", "name": "Insecure pattern 'insert_adjacent_html' in frontend/intel.js:657", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in frontend/intel.js:657"}, "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-ad8a9fd107863906", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/ejecutivo.js:96", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/ejecutivo.js:96"}, "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-f7654c89d65124cb", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/regional.js:76", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/regional.js:76"}, "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-5f7ed64fd4754e12", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/trayectoria.js:31", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/trayectoria.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-7a65b3247c6f2c2e", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/rotation.js:61", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/rotation.js:61"}, "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-a6ab966dce460b7d", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/knowledge.js:66", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/knowledge.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-f7648c3444d9b9ff", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/anomalies.js:42", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/anomalies.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-542755e2499e7575", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/alertas-estacionales.js:50", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/alertas-estacionales.js:50"}, "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-1ee7575c5855f0a8", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/diversidad-cultivos.js:96", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/diversidad-cultivos.js:96"}, "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-ab29ed674cfb5c65", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/completitud-global.js:79", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/completitud-global.js:79"}, "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-26362ef8cb88dfd1", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/indice-estres.js:92", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/indice-estres.js:92"}, "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-aa994ffd4af40492", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/prioridad-riesgo.js:23", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/prioridad-riesgo.js:23"}, "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-08983abf1743787e", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/walkthrough.html:252", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/walkthrough.html:252"}, "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-007ef3fbfa16f127", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/intelligence-page.js:54", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/intelligence-page.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-09efdae82e48f985", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/onboarding.js:94", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/onboarding.js:94"}, "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-365cd8df83d85793", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/frescura-sensores.js:27", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/frescura-sensores.js: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-db7211805b0442d8", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/thermal-dashboard.js:76", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/thermal-dashboard.js:76"}, "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-49ddd86928045a47", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/regenerative.js:39", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/regenerative.js:39"}, "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-e544cb749cd74eee", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/historial-enfermedades.js:75", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/historial-enfermedades.js:75"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b5d568d357a2e107", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/whatsapp-demo.js:72", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/whatsapp-demo.js:72"}, "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-9f9a6177da207427", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/calculadora-suelo.js:51", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/calculadora-suelo.js:51"}, "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-2174d574fee1fc8a", "name": "Insecure pattern 'local_storage_auth_token' in frontend/login.js:147", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/login.js:147"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7bf54022b195f1fe", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/flights.js:54", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/flights.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-2abb66e8f9af2caa", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/microbiome.js:57", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/microbiome.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-d8882a27ead983f9", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/tek-page.js:28", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/tek-page.js:28"}, "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-5a8f808a88e0d358", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/coop-evidencia.js:52", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/coop-evidencia.js:52"}, "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-99d107439b9cd15d", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/disease.js:67", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/disease.js:67"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d5d2f2426be3c2ae", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/management.js:52", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/management.js:52"}, "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-65d30bc59c07ca0d", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/intervenciones.js:31", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/intervenciones.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-cea83e1db53604a2", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/notifications.js:47", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/notifications.js:47"}, "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-d01852ea70d4b7cb", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/soil-import.js:35", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/soil-import.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-991e709617d12491", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/mapa.js:291", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/mapa.js:291"}, "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-474e575281290585", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/plan-accion.js:30", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/plan-accion.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-cd59f253039396c6", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/alertas-clima.js:46", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/alertas-clima.js:46"}, "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-7b7031c1e3909cf9", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/alineacion-tek.js:24", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/alineacion-tek.js:24"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b3c34b3a6dbc1d56", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/prediccion-salud.js:79", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/prediccion-salud.js:79"}, "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-95f09a85a217fde2", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/completitud.js:53", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/completitud.js:53"}, "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-9ed9c1aacc7f2b9a", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/irrigation.js:60", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/irrigation.js:60"}, "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-9e709154903723af", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/roi-tratamientos.js:62", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/roi-tratamientos.js:62"}, "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-250319f7d824b79f", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/precision-ia.js:79", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/precision-ia.js:79"}, "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-7408e832b2515cb4", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/mission.js:48", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/mission.js:48"}, "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-a54796c12419ed94", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/actions.js:90", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/actions.js:90"}, "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-d86a9fbc6011fd17", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/resumen.js:111", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/resumen.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-ba28f0f4ef92f740", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/app.js:125", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/app.js:125"}, "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-1825513506b8a522", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/calendario-campo.js:20", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/calendario-campo.js:20"}, "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-dcea0800b9c3bf18", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/auth-guard.js:38", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/auth-guard.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-4eeb81304014a968", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/api-docs.js:55", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/api-docs.js:55"}, "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-cbc699f147cf8365", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/yield.js:55", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/yield.js:55"}, "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-80d7375face2ef97", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/hitos-regenerativos.js:36", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/hitos-regenerativos.js:36"}, "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-196968c6d7aa9c38", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/efectividad-global.js:173", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/efectividad-global.js:173"}, "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-585a05209e84a057", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/clima.js:76", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/clima.js:76"}, "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-8fae20fb9a3787f1", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/economic-impact.js:465", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/economic-impact.js:465"}, "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-ee630f30e221a062", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/soil-history.js:77", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/soil-history.js:77"}, "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-3aedb6b27cc061a7", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/ranking-miembros.js:29", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/ranking-miembros.js:29"}, "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-037af7b1ec19364f", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/timeline.js:80", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/timeline.js:80"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-39a8869c69d9e0b2", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/reportes.js:19", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/reportes.js:19"}, "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-52d83d52dab19b41", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/seasonal.js:49", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/seasonal.js:49"}, "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-235ae2089030ecad", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/calendario.js:38", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/calendario.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-7659ba2925b836cf", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/reporte-anual.js:52", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/reporte-anual.js:52"}, "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-a6fc05cd8017c5e3", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/exportar.js:38", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/exportar.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-1c266560245f5375", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/impacto-agricultor.js:41", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/impacto-agricultor.js:41"}, "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-65faf47d095f57f7", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/cooperativa.js:26", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/cooperativa.js:26"}, "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-ca72f614994eb616", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/correlacion-ndvi.js:22", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/correlacion-ndvi.js:22"}, "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-a1cf30e721bc8f2b", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/nutrientes-suelo.js:80", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/nutrientes-suelo.js:80"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aa27dc96128eac0e", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/efectividad.js:35", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/efectividad.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-3a82efdb1c417bba", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/demo-fodecijal.js:47", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/demo-fodecijal.js:47"}, "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-224c9ef61e4c3a32", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/comparar.js:111", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/comparar.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-74919fbe012d8682", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/historial-alertas.js:87", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/historial-alertas.js:87"}, "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-1c23f7288f1023f2", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/escalaciones-alertas.js:54", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/escalaciones-alertas.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-531bf627aa37dd30", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/tour.js:222", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/tour.js:222"}, "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-71518fe6d082af6a", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/status.js:104", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/status.js:104"}, "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-9bb39d0a3d02dc4b", "name": "Very large file: frontend/field.js (2450 lines)", "shortDescription": {"text": "Very large file: frontend/field.js (2450 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-4c08b2f871b2e9a2", "name": "Very large file: frontend/i18n.js (2602 lines)", "shortDescription": {"text": "Very large file: frontend/i18n.js (2602 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-63d96d4f83001f06", "name": "Very large file: frontend/app.js (1309 lines)", "shortDescription": {"text": "Very large file: frontend/app.js (1309 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-cd739837c40a3bcb", "name": "Very large file: src/cultivos/services/intelligence/analytics.py (1815 lines)", "shortDescription": {"text": "Very large file: src/cultivos/services/intelligence/analytics.py (1815 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-d8030a0beb68d809", "name": "Very large file: src/cultivos/db/seeds.py (1665 lines)", "shortDescription": {"text": "Very large file: src/cultivos/db/seeds.py (1665 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-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 11 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 55 placeholder/mock markers across 11 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2885c35a36658f8d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/fotos.js:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/fotos.js:16"}, "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-ff6b38dfcf217404", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/field.js:2158", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/field.js:2158"}, "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-351661dba945bb15", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/efectividad-intervenciones.js:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/efectividad-intervenciones.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-2ab24b7287bb4e66", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/cerebro-analytics.js:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/cerebro-analytics.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-694a13ae0f9fe68e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/intel.js:737", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/intel.js:737"}, "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-6d8d7d907a12ee2e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/ejecutivo.js:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/ejecutivo.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-76ed4f49331439a1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/trayectoria.js:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/trayectoria.js:9"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-34fb153759ee68f6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/knowledge.js:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/knowledge.js:56"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-762d9e29db081625", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/indice-estres.js:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/indice-estres.js:20"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5a76553aea5deb37", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/prioridad-riesgo.js:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/prioridad-riesgo.js:11"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cfcd94fc7816a8b5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/onboarding.js:203", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/onboarding.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-63a1365aaf3990d8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/frescura-sensores.js:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/frescura-sensores.js:9"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-19886ef95768c4fc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/login.js:117", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/login.js:117"}, "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-2e96ddfece5710cd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/alert-config.js:137", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/alert-config.js:137"}, "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-1bd09cf9487526d5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/management.js:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/management.js:35"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2a3bea5ab57a4649", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/plan-accion.js:12", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/plan-accion.js:12"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-668e77bfe3c9d1bf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/alineacion-tek.js:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/alineacion-tek.js:15"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d5ceac0d4098ca83", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/prediccion-salud.js:14", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/prediccion-salud.js:14"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-228e93d5cd40daa3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/precision-ia.js:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/precision-ia.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-17ec03550ac6cbfb", "name": "Commented-code block (5 lines) in frontend/i18n.js:2529", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/i18n.js:2529"}, "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-fb4bedc091da5ff7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/app.js:588", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/app.js:588"}, "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-6153bc96174bfb99", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/calendario-campo.js:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/calendario-campo.js:24"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ef2a199ee2d1f19e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/calendario.js:8", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/calendario.js:8"}, "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-0722addf1ef54c98", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/reporte-anual.js:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/reporte-anual.js:24"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-49f678e65e38875b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/exportar.js:96", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/exportar.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-6ff2823eb7e0a5fc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/cooperativa.js:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/cooperativa.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-7913a7cd13847e9e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/escalaciones-alertas.js:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/escalaciones-alertas.js:11"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-99f20dc02c790824", "name": "Legacy-named symbol `hs_old` in tests/test_dashboard.py:25", "shortDescription": {"text": "Legacy-named symbol `hs_old` in tests/test_dashboard.py:25"}, "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-523dcc0bd8b83b0d", "name": "Legacy-named symbol `test_no_currency_code_in_user_copy` in tests/test_nb_fs_farmer_savings.py:37", "shortDescription": {"text": "Legacy-named symbol `test_no_currency_code_in_user_copy` in tests/test_nb_fs_farmer_savings.py:37"}, "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-4211cdd57dd1eeda", "name": "Commented-code block (5 lines) in tests/test_cr14_back_button.py:26", "shortDescription": {"text": "Commented-code block (5 lines) in tests/test_cr14_back_button.py:26"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-376181260f05ae35", "name": "Commented-code block (5 lines) in tests/test_seasonal_benchmark.py:19", "shortDescription": {"text": "Commented-code block (5 lines) in tests/test_seasonal_benchmark.py:19"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b56cc735d7651771", "name": "Commented-code block (6 lines) in design/mockups/insight-card/tweaks-panel.jsx:12", "shortDescription": {"text": "Commented-code block (6 lines) in design/mockups/insight-card/tweaks-panel.jsx:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-06e528a63e417869", "name": "Commented-code block (6 lines) in design/mockups/weekly-brief/tweaks-panel.jsx:12", "shortDescription": {"text": "Commented-code block (6 lines) in design/mockups/weekly-brief/tweaks-panel.jsx:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b55a093d74bed5d1", "name": "Commented-code block (6 lines) in web/public/mockups/insight-card/tweaks-panel.jsx:12", "shortDescription": {"text": "Commented-code block (6 lines) in web/public/mockups/insight-card/tweaks-panel.jsx:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b619b867723c9f89", "name": "Commented-code block (6 lines) in web/public/mockups/weekly-brief/tweaks-panel.jsx:12", "shortDescription": {"text": "Commented-code block (6 lines) in web/public/mockups/weekly-brief/tweaks-panel.jsx:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6851fa3123b4587a", "name": "Commented-code block (6 lines) in src/cultivos/app.py:216", "shortDescription": {"text": "Commented-code block (6 lines) in src/cultivos/app.py:216"}, "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-533031d7166e6d00", "name": "Commented-code block (10 lines) in src/cultivos/api/__init__.py:90", "shortDescription": {"text": "Commented-code block (10 lines) in src/cultivos/api/__init__.py:90"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-319e66a630e14977", "name": "2 env vars used in code but missing from .env.example", "shortDescription": {"text": "2 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ENABLE_SENTRY_DEBUG`, `GEMINI_API_KEY`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "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:\nsrc/cultivos/app.py:dispatch, src/cultivos/app.py:dispatch\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-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nsrc/cultivos/api/field_alertas_criticas.py:get_alertas_criticas, src/cultivos/api/field_accion.py:get_field_accion_siguiente, src/cultivos/api/field_resumen.py:get_field_resumen, src/cultivos/api/field_trayectoria.py:get_field_trayectoria_semana\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:\nsrc/cultivos/api/farm_digest.py:get_farm_digest, src/cultivos/api/irrigation_efficiency.py:get_farm_irrigation_efficiency, src/cultivos/api/farm_saludo_diario.py:get_saludo_diario\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-388bfe83627807f0", "name": "FastAPI POST `create_notification` without auth dependency \u2014 src/cultivos/api/notifications.py:20", "shortDescription": {"text": "FastAPI POST `create_notification` without auth dependency \u2014 src/cultivos/api/notifications.py:20"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3e370ae6742007ff", "name": "FastAPI POST `acknowledge_notification` without auth dependency \u2014 src/cultivos/api/notifications.py:55", "shortDescription": {"text": "FastAPI POST `acknowledge_notification` without auth dependency \u2014 src/cultivos/api/notifications.py:55"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f213b88d5d05ab93", "name": "FastAPI POST `generate_portfolio_report` without auth dependency \u2014 src/cultivos/api/portfolio_report.py:17", "shortDescription": {"text": "FastAPI POST `generate_portfolio_report` without auth dependency \u2014 src/cultivos/api/portfolio_report.py:17"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d9491b224976c670", "name": "FastAPI POST `create_observation` without auth dependency \u2014 src/cultivos/api/observations.py:40", "shortDescription": {"text": "FastAPI POST `create_observation` without auth dependency \u2014 src/cultivos/api/observations.py:40"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f1d0cfa830b079a5", "name": "FastAPI POST `compute_soil_amendment` without auth dependency \u2014 src/cultivos/api/soil_amendment.py:11", "shortDescription": {"text": "FastAPI POST `compute_soil_amendment` without auth dependency \u2014 src/cultivos/api/soil_amendment.py:11"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e52c47da3abbddb5", "name": "FastAPI POST `create_alert_config` without auth dependency \u2014 src/cultivos/api/alert_config.py:45", "shortDescription": {"text": "FastAPI POST `create_alert_config` without auth dependency \u2014 src/cultivos/api/alert_config.py:45"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d0fe62382af02c33", "name": "FastAPI PUT `update_alert_config` without auth dependency \u2014 src/cultivos/api/alert_config.py:70", "shortDescription": {"text": "FastAPI PUT `update_alert_config` without auth dependency \u2014 src/cultivos/api/alert_config.py:70"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e44a89e94f487231", "name": "FastAPI POST `generate_farm_report` without auth dependency \u2014 src/cultivos/api/reports.py:23", "shortDescription": {"text": "FastAPI POST `generate_farm_report` without auth dependency \u2014 src/cultivos/api/reports.py:23"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6f3edcc5dedb670a", "name": "FastAPI POST `generate_treatments` without auth dependency \u2014 src/cultivos/api/treatments.py:40", "shortDescription": {"text": "FastAPI POST `generate_treatments` without auth dependency \u2014 src/cultivos/api/treatments.py:40"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6474f6358f75ee44", "name": "FastAPI POST `log_treatment_applied` without auth dependency \u2014 src/cultivos/api/treatments.py:291", "shortDescription": {"text": "FastAPI POST `log_treatment_applied` without auth dependency \u2014 src/cultivos/api/treatments.py:291"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8d7399d4c35e1253", "name": "FastAPI POST `compute_field_health` without auth dependency \u2014 src/cultivos/api/health.py:28", "shortDescription": {"text": "FastAPI POST `compute_field_health` without auth dependency \u2014 src/cultivos/api/health.py:28"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0150790c1e50da72", "name": "FastAPI POST `submit_feedback` without auth dependency \u2014 src/cultivos/api/feedback.py:27", "shortDescription": {"text": "FastAPI POST `submit_feedback` without auth dependency \u2014 src/cultivos/api/feedback.py:27"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f035ec6a649d2b71", "name": "FastAPI POST `log_flight` without auth dependency \u2014 src/cultivos/api/flights.py:50", "shortDescription": {"text": "FastAPI POST `log_flight` without auth dependency \u2014 src/cultivos/api/flights.py:50"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-827e22f575b751d6", "name": "FastAPI POST `upload_photo` without auth dependency \u2014 src/cultivos/api/photos.py:25", "shortDescription": {"text": "FastAPI POST `upload_photo` without auth dependency \u2014 src/cultivos/api/photos.py:25"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b009178d3fcbb40c", "name": "FastAPI DELETE `delete_photo` without auth dependency \u2014 src/cultivos/api/photos.py:75", "shortDescription": {"text": "FastAPI DELETE `delete_photo` without auth dependency \u2014 src/cultivos/api/photos.py:75"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7ada634cb6f49846", "name": "FastAPI POST `diagnose_problem` without auth dependency \u2014 src/cultivos/api/intel.py:446", "shortDescription": {"text": "FastAPI POST `diagnose_problem` without auth dependency \u2014 src/cultivos/api/intel.py:446"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e7875cfe6d3215b5", "name": "FastAPI POST `fertilizer_for_stress` without auth dependency \u2014 src/cultivos/api/intel.py:485", "shortDescription": {"text": "FastAPI POST `fertilizer_for_stress` without auth dependency \u2014 src/cultivos/api/intel.py:485"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-24a89b1929779ec0", "name": "FastAPI POST `farmer_query` without auth dependency \u2014 src/cultivos/api/demo.py:83", "shortDescription": {"text": "FastAPI POST `farmer_query` without auth dependency \u2014 src/cultivos/api/demo.py:83"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e71a3053def601c2", "name": "FastAPI POST `create_harvest` without auth dependency \u2014 src/cultivos/api/harvests.py:85", "shortDescription": {"text": "FastAPI POST `create_harvest` without auth dependency \u2014 src/cultivos/api/harvests.py:85"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ffc83652fb93bc89", "name": "FastAPI POST `create_microbiome_record` without auth dependency \u2014 src/cultivos/api/microbiome.py:27", "shortDescription": {"text": "FastAPI POST `create_microbiome_record` without auth dependency \u2014 src/cultivos/api/microbiome.py:27"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6071253927069bb1", "name": "FastAPI POST `post_tek_adoption` without auth dependency \u2014 src/cultivos/api/tek_adoption.py:35", "shortDescription": {"text": "FastAPI POST `post_tek_adoption` without auth dependency \u2014 src/cultivos/api/tek_adoption.py:35"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-288c7da267829bd1", "name": "FastAPI POST `check_and_create_alerts` without auth dependency \u2014 src/cultivos/api/alerts.py:26", "shortDescription": {"text": "FastAPI POST `check_and_create_alerts` without auth dependency \u2014 src/cultivos/api/alerts.py:26"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e44c613b106be456", "name": "FastAPI POST `check_irrigation_alerts` without auth dependency \u2014 src/cultivos/api/alerts.py:101", "shortDescription": {"text": "FastAPI POST `check_irrigation_alerts` without auth dependency \u2014 src/cultivos/api/alerts.py:101"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6d17c300278c1858", "name": "FastAPI POST `check_anomaly_alerts` without auth dependency \u2014 src/cultivos/api/alerts.py:205", "shortDescription": {"text": "FastAPI POST `check_anomaly_alerts` without auth dependency \u2014 src/cultivos/api/alerts.py:205"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6b9c122e3aaedbcc", "name": "FastAPI POST `create_weather_record` without auth dependency \u2014 src/cultivos/api/weather.py:25", "shortDescription": {"text": "FastAPI POST `create_weather_record` without auth dependency \u2014 src/cultivos/api/weather.py:25"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-16405269482459b6", "name": "FastAPI POST `identify_disease` without auth dependency \u2014 src/cultivos/api/disease.py:36", "shortDescription": {"text": "FastAPI POST `identify_disease` without auth dependency \u2014 src/cultivos/api/disease.py:36"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ecbc2df1f0f4f6bd", "name": "FastAPI POST `create_soil_analysis` without auth dependency \u2014 src/cultivos/api/soil.py:28", "shortDescription": {"text": "FastAPI POST `create_soil_analysis` without auth dependency \u2014 src/cultivos/api/soil.py:28"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a4f5c1f74456caf0", "name": "FastAPI POST `import_soil_csv` without auth dependency \u2014 src/cultivos/api/soil.py:44", "shortDescription": {"text": "FastAPI POST `import_soil_csv` without auth dependency \u2014 src/cultivos/api/soil.py:44"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d130b91a983e21b0", "name": "FastAPI PUT `update_soil_analysis` without auth dependency \u2014 src/cultivos/api/soil.py:126", "shortDescription": {"text": "FastAPI PUT `update_soil_analysis` without auth dependency \u2014 src/cultivos/api/soil.py:126"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a1f04dc2c1c3f10a", "name": "FastAPI DELETE `delete_soil_analysis` without auth dependency \u2014 src/cultivos/api/soil.py:150", "shortDescription": {"text": "FastAPI DELETE `delete_soil_analysis` without auth dependency \u2014 src/cultivos/api/soil.py:150"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ced07b929b7ab2a3", "name": "FastAPI POST `create_cooperative` without auth dependency \u2014 src/cultivos/api/cooperatives.py:68", "shortDescription": {"text": "FastAPI POST `create_cooperative` without auth dependency \u2014 src/cultivos/api/cooperatives.py:68"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-237c10bfa1b9443a", "name": "FastAPI PUT `update_cooperative` without auth dependency \u2014 src/cultivos/api/cooperatives.py:103", "shortDescription": {"text": "FastAPI PUT `update_cooperative` without auth dependency \u2014 src/cultivos/api/cooperatives.py:103"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d7573366f31389d9", "name": "FastAPI DELETE `delete_cooperative` without auth dependency \u2014 src/cultivos/api/cooperatives.py:116", "shortDescription": {"text": "FastAPI DELETE `delete_cooperative` without auth dependency \u2014 src/cultivos/api/cooperatives.py:116"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-850406e9bbb9c7a5", "name": "FastAPI POST `sensor_fusion` without auth dependency \u2014 src/cultivos/api/fusion.py:62", "shortDescription": {"text": "FastAPI POST `sensor_fusion` without auth dependency \u2014 src/cultivos/api/fusion.py:62"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2093bd9ca031d799", "name": "FastAPI PUT `update_farm` without auth dependency \u2014 src/cultivos/api/farms.py:139", "shortDescription": {"text": "FastAPI PUT `update_farm` without auth dependency \u2014 src/cultivos/api/farms.py:139"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6d64de215b678bfc", "name": "FastAPI DELETE `delete_farm` without auth dependency \u2014 src/cultivos/api/farms.py:152", "shortDescription": {"text": "FastAPI DELETE `delete_farm` without auth dependency \u2014 src/cultivos/api/farms.py:152"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a7cae34dedbd9dbf", "name": "FastAPI POST `create_field` without auth dependency \u2014 src/cultivos/api/farms.py:204", "shortDescription": {"text": "FastAPI POST `create_field` without auth dependency \u2014 src/cultivos/api/farms.py:204"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-402efeb30fcecfd7", "name": "FastAPI PUT `update_field` without auth dependency \u2014 src/cultivos/api/farms.py:239", "shortDescription": {"text": "FastAPI PUT `update_field` without auth dependency \u2014 src/cultivos/api/farms.py:239"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e9948de42352d119", "name": "FastAPI DELETE `delete_field` without auth dependency \u2014 src/cultivos/api/farms.py:256", "shortDescription": {"text": "FastAPI DELETE `delete_field` without auth dependency \u2014 src/cultivos/api/farms.py:256"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7a2d70668f82ef44", "name": "FastAPI POST `record_carbon_baseline` without auth dependency \u2014 src/cultivos/api/farms.py:517", "shortDescription": {"text": "FastAPI POST `record_carbon_baseline` without auth dependency \u2014 src/cultivos/api/farms.py:517"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0152f990b50b60dd", "name": "FastAPI POST `analyze_ndvi` without auth dependency \u2014 src/cultivos/api/ndvi.py:29", "shortDescription": {"text": "FastAPI POST `analyze_ndvi` without auth dependency \u2014 src/cultivos/api/ndvi.py:29"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fdc4c1383f503d27", "name": "FastAPI POST `analyze_thermal` without auth dependency \u2014 src/cultivos/api/thermal.py:29", "shortDescription": {"text": "FastAPI POST `analyze_thermal` without auth dependency \u2014 src/cultivos/api/thermal.py:29"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f10f9c9a13a50c2a", "name": "Dangling fetch: GET /api/intel/export (frontend/intel.js:737)", "shortDescription": {"text": "Dangling fetch: GET /api/intel/export (frontend/intel.js:737)"}, "fullDescription": {"text": "`frontend/intel.js:737` calls `GET /api/intel/export` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/intel/export`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-34e28795b6b4062b", "name": "Dangling fetch: GET /api/system/health-detailed (frontend/api-status.js:8)", "shortDescription": {"text": "Dangling fetch: GET /api/system/health-detailed (frontend/api-status.js:8)"}, "fullDescription": {"text": "`frontend/api-status.js:8` calls `GET /api/system/health-detailed` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/system/health-detailed`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1f6b44972f06c251", "name": "Dangling fetch: GET /api/knowledge/crops (frontend/onboarding.js:19)", "shortDescription": {"text": "Dangling fetch: GET /api/knowledge/crops (frontend/onboarding.js:19)"}, "fullDescription": {"text": "`frontend/onboarding.js:19` calls `GET /api/knowledge/crops` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/knowledge/crops`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-14d669ba88408c30", "name": "Dangling fetch: POST /api/intel/soil-amendment (frontend/calculadora-suelo.js:28)", "shortDescription": {"text": "Dangling fetch: POST /api/intel/soil-amendment (frontend/calculadora-suelo.js:28)"}, "fullDescription": {"text": "`frontend/calculadora-suelo.js:28` calls `POST /api/intel/soil-amendment` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/intel/soil-amendment`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-54d6a7a75e81566c", "name": "Dangling fetch: PUT /api/farms/${farmId}/alert-config (frontend/alert-config.js:137)", "shortDescription": {"text": "Dangling fetch: PUT /api/farms/${farmId}/alert-config (frontend/alert-config.js:137)"}, "fullDescription": {"text": "`frontend/alert-config.js:137` calls `PUT /api/farms/${farmId}/alert-config` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/farms/<p>/alert-config`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dee2bb0dc6916ce2", "name": "Dangling fetch: POST /api/farms/${farmId}/notifications/${notifId}/acknowledge (frontend/notifications.js:171)", "shortDescription": {"text": "Dangling fetch: POST /api/farms/${farmId}/notifications/${notifId}/acknowledge (frontend/notifications.js:171)"}, "fullDescription": {"text": "`frontend/notifications.js:171` calls `POST /api/farms/${farmId}/notifications/${notifId}/acknowledge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/farms/<p>/notifications/<p>/acknowledge`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1b2eef20f46a7ed3", "name": "Dangling fetch: GET /api/farms/${selectedFarmId}/export?format=csv (frontend/app.js:1101)", "shortDescription": {"text": "Dangling fetch: GET /api/farms/${selectedFarmId}/export?format=csv (frontend/app.js:1101)"}, "fullDescription": {"text": "`frontend/app.js:1101` calls `GET /api/farms/${selectedFarmId}/export?format=csv` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/farms/<p>/export`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3472b0504db670a0", "name": "Dangling fetch: POST /api/farms/${selectedFarmId}/report (frontend/app.js:1130)", "shortDescription": {"text": "Dangling fetch: POST /api/farms/${selectedFarmId}/report (frontend/app.js:1130)"}, "fullDescription": {"text": "`frontend/app.js:1130` calls `POST /api/farms/${selectedFarmId}/report` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/farms/<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-471fb22913579405", "name": "Dangling fetch: POST /api/reports/portfolio (frontend/app.js:1156)", "shortDescription": {"text": "Dangling fetch: POST /api/reports/portfolio (frontend/app.js:1156)"}, "fullDescription": {"text": "`frontend/app.js:1156` calls `POST /api/reports/portfolio` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/reports/portfolio`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-860000184f82b19d", "name": "Dangling fetch: GET /api/cooperatives (frontend/ranking-miembros.js:13)", "shortDescription": {"text": "Dangling fetch: GET /api/cooperatives (frontend/ranking-miembros.js:13)"}, "fullDescription": {"text": "`frontend/ranking-miembros.js:13` calls `GET /api/cooperatives` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cooperatives`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2defda1749eeabce", "name": "Dangling fetch: POST /api/reports/portfolio (frontend/reportes.js:59)", "shortDescription": {"text": "Dangling fetch: POST /api/reports/portfolio (frontend/reportes.js:59)"}, "fullDescription": {"text": "`frontend/reportes.js:59` calls `POST /api/reports/portfolio` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/reports/portfolio`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-41a886dc8d40f21d", "name": "Dangling fetch: GET /api/alerts/history (frontend/historial-alertas.js:134)", "shortDescription": {"text": "Dangling fetch: GET /api/alerts/history (frontend/historial-alertas.js:134)"}, "fullDescription": {"text": "`frontend/historial-alertas.js:134` calls `GET /api/alerts/history` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/alerts/history`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0ea119cfee224495", "name": "Dangling fetch: GET /api/alerts/analytics (frontend/historial-alertas.js:169)", "shortDescription": {"text": "Dangling fetch: GET /api/alerts/analytics (frontend/historial-alertas.js:169)"}, "fullDescription": {"text": "`frontend/historial-alertas.js:169` calls `GET /api/alerts/analytics` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/alerts/analytics`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4756b4c4da7d2088", "name": "Unused endpoint: GET /api/health", "shortDescription": {"text": "Unused endpoint: GET /api/health"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /api/health` 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-9ff6d8b7a61de4c4", "name": "Unused endpoint: GET /api/sentry-debug", "shortDescription": {"text": "Unused endpoint: GET /api/sentry-debug"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /api/sentry-debug` 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-a91deebe1ad91e08", "name": "Unused endpoint: GET /api/readiness", "shortDescription": {"text": "Unused endpoint: GET /api/readiness"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /api/readiness` 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-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /` 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-b5990848e550f868", "name": "Unused endpoint: GET /intel", "shortDescription": {"text": "Unused endpoint: GET /intel"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /intel` 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-902bfc14e3fa5a34", "name": "Unused endpoint: GET /campo", "shortDescription": {"text": "Unused endpoint: GET /campo"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /campo` 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-157604b431902532", "name": "Unused endpoint: GET /demo", "shortDescription": {"text": "Unused endpoint: GET /demo"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /demo` 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-f4ee524de299c537", "name": "Unused endpoint: GET /conocimiento", "shortDescription": {"text": "Unused endpoint: GET /conocimiento"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /conocimiento` 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-6a4dfcad3eb1618a", "name": "Unused endpoint: GET /login", "shortDescription": {"text": "Unused endpoint: GET /login"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /login` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-19fad9c652d8768e", "name": "Unused endpoint: GET /gestion", "shortDescription": {"text": "Unused endpoint: GET /gestion"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /gestion` 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-de6149dcc9fb3c0f", "name": "Unused endpoint: GET /recomendaciones", "shortDescription": {"text": "Unused endpoint: GET /recomendaciones"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /recomendaciones` 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-ec60216b20540dee", "name": "Unused endpoint: GET /vuelos", "shortDescription": {"text": "Unused endpoint: GET /vuelos"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /vuelos` 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-4fe11f34edba3564", "name": "Unused endpoint: GET /notificaciones", "shortDescription": {"text": "Unused endpoint: GET /notificaciones"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /notificaciones` 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-b78452c282ec53f6", "name": "Unused endpoint: GET /estado", "shortDescription": {"text": "Unused endpoint: GET /estado"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /estado` 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-16eeaf7850a2c6f9", "name": "Unused endpoint: GET /importar-suelo", "shortDescription": {"text": "Unused endpoint: GET /importar-suelo"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /importar-suelo` 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-9cfe9631ff1825ec", "name": "Unused endpoint: GET /impacto-economico", "shortDescription": {"text": "Unused endpoint: GET /impacto-economico"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /impacto-economico` 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-06181e6a5c5d779e", "name": "Unused endpoint: GET /docs-api", "shortDescription": {"text": "Unused endpoint: GET /docs-api"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /docs-api` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-30a91661f990c41c", "name": "Unused endpoint: GET /suelo", "shortDescription": {"text": "Unused endpoint: GET /suelo"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /suelo` 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-90209b45e547fba3", "name": "Unused endpoint: GET /historial", "shortDescription": {"text": "Unused endpoint: GET /historial"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /historial` 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-b8cc386d3657ce88", "name": "Unused endpoint: GET /onboarding", "shortDescription": {"text": "Unused endpoint: GET /onboarding"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /onboarding` 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-4bbc2f721b392c25", "name": "Unused endpoint: GET /recorrido", "shortDescription": {"text": "Unused endpoint: GET /recorrido"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /recorrido` 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-4542f3b8526b136c", "name": "Unused endpoint: GET /alertas-config", "shortDescription": {"text": "Unused endpoint: GET /alertas-config"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /alertas-config` 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-e6614216500dbc78", "name": "Unused endpoint: GET /termica", "shortDescription": {"text": "Unused endpoint: GET /termica"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /termica` 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-4fc90a5c2e37ecd7", "name": "Unused endpoint: GET /regenerativo", "shortDescription": {"text": "Unused endpoint: GET /regenerativo"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /regenerativo` 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-26ea9652beee0625", "name": "Unused endpoint: GET /carbono", "shortDescription": {"text": "Unused endpoint: GET /carbono"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /carbono` 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-d79231b0db9b956e", "name": "Unused endpoint: GET /anomalias", "shortDescription": {"text": "Unused endpoint: GET /anomalias"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /anomalias` 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-dc62d211421f586d", "name": "Unused endpoint: GET /microbioma", "shortDescription": {"text": "Unused endpoint: GET /microbioma"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /microbioma` 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-029c4a99cbbfa9d5", "name": "Unused endpoint: GET /rotacion", "shortDescription": {"text": "Unused endpoint: GET /rotacion"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /rotacion` 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-9d1503caafc5d3e5", "name": "Unused endpoint: GET /mision", "shortDescription": {"text": "Unused endpoint: GET /mision"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /mision` 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-281a4522f3ce15a4", "name": "Unused endpoint: GET /riego", "shortDescription": {"text": "Unused endpoint: GET /riego"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /riego` 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-0e7db8be634817dc", "name": "Unused endpoint: GET /enfermedades", "shortDescription": {"text": "Unused endpoint: GET /enfermedades"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /enfermedades` 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-bf0bed51c7f8a3db", "name": "Unused endpoint: GET /tek", "shortDescription": {"text": "Unused endpoint: GET /tek"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /tek` 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-471c558239c56576", "name": "Unused endpoint: GET /fusion", "shortDescription": {"text": "Unused endpoint: GET /fusion"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /fusion` 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-131d24e583bd5711", "name": "Unused endpoint: GET /inteligencia", "shortDescription": {"text": "Unused endpoint: GET /inteligencia"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /inteligencia` 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-99d64a1d311dca43", "name": "Unused endpoint: GET /estaciones", "shortDescription": {"text": "Unused endpoint: GET /estaciones"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /estaciones` 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-9fea50f9f1034ca2", "name": "Unused endpoint: GET /rendimiento", "shortDescription": {"text": "Unused endpoint: GET /rendimiento"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /rendimiento` 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-3e714d34f11865f5", "name": "Unused endpoint: GET /acciones", "shortDescription": {"text": "Unused endpoint: GET /acciones"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /acciones` 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-037c0b2befe9a5f5", "name": "Unused endpoint: GET /completitud", "shortDescription": {"text": "Unused endpoint: GET /completitud"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /completitud` 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-52e086bb06fd378c", "name": "Unused endpoint: GET /completitud-global", "shortDescription": {"text": "Unused endpoint: GET /completitud-global"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /completitud-global` 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-fd55f9cf10b4d833", "name": "Unused endpoint: GET /alertas-estacionales", "shortDescription": {"text": "Unused endpoint: GET /alertas-estacionales"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /alertas-estacionales` 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-3aea19881e0c922f", "name": "Unused endpoint: GET /intervenciones", "shortDescription": {"text": "Unused endpoint: GET /intervenciones"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /intervenciones` 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-c35e8c9af9a64dcb", "name": "Unused endpoint: GET /efectividad", "shortDescription": {"text": "Unused endpoint: GET /efectividad"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /efectividad` 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-c1ac85b243b28524", "name": "Unused endpoint: GET /regional", "shortDescription": {"text": "Unused endpoint: GET /regional"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /regional` 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-465ace269774b8ae", "name": "Unused endpoint: GET /reportes", "shortDescription": {"text": "Unused endpoint: GET /reportes"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /reportes` 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-e395a91742c801bb", "name": "Unused endpoint: GET /exportar", "shortDescription": {"text": "Unused endpoint: GET /exportar"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /exportar` 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-f91158ba9cb44679", "name": "Unused endpoint: GET /calendario", "shortDescription": {"text": "Unused endpoint: GET /calendario"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /calendario` 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-8b770efe69cd7426", "name": "Unused endpoint: GET /mapa", "shortDescription": {"text": "Unused endpoint: GET /mapa"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /mapa` 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-cd37d1414854ca59", "name": "Unused endpoint: GET /efectividad-global", "shortDescription": {"text": "Unused endpoint: GET /efectividad-global"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /efectividad-global` 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-9c6d9752967ef6a1", "name": "Unused endpoint: GET /clima", "shortDescription": {"text": "Unused endpoint: GET /clima"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /clima` 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-be97b15fcffcde8b", "name": "Unused endpoint: GET /comparar", "shortDescription": {"text": "Unused endpoint: GET /comparar"}, "fullDescription": {"text": "`src/cultivos/app.py` declares `GET /comparar` 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/19183"}, "properties": {"repository": "SebSanGar/cultivOS", "repoUrl": "https://github.com/SebSanGar/cultivOS", "branch": "main"}, "results": [{"ruleId": "scanner-0de3ac4aef1f604d", "level": "note", "message": {"text": "Possibly dead Python function: require_farm_access"}, "properties": {"repobilityId": "5fcc6e2e5530d096", "scanner": "scanner-primary", "fingerprint": "0de3ac4aef1f604d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/auth.py:124"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d63da3583b14afc0", "level": "warning", "message": {"text": "Dockerfile runs as root: Dockerfile"}, "properties": {"repobilityId": "a2ed1bd120e507db", "scanner": "scanner-primary", "fingerprint": "d63da3583b14afc0", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-de3c1f217d72a063", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "82c4f19981eb734a", "scanner": "scanner-primary", "fingerprint": "de3c1f217d72a063", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-de3c1f217d72a063", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "fce251f8ae939c49", "scanner": "scanner-primary", "fingerprint": "de3c1f217d72a063", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-07046a2c62d1c25a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in index.html:1198"}, "properties": {"repobilityId": "f91708437a3a5445", "scanner": "scanner-primary", "fingerprint": "07046a2c62d1c25a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index.html"}, "region": {"startLine": 1198}}}]}, {"ruleId": "scanner-09771699eb09d5f7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/fusion-page.js:45"}, "properties": {"repobilityId": "112ea1afe9cdf141", "scanner": "scanner-primary", "fingerprint": "09771699eb09d5f7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/fusion-page.js"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-88724c1147138fc5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/fotos.js:38"}, "properties": {"repobilityId": "f92ea11e7fd370a3", "scanner": "scanner-primary", "fingerprint": "88724c1147138fc5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/fotos.js"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-f5aabcace8f26db4", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/field.js:466"}, "properties": {"repobilityId": "c14e274b5f7b8554", "scanner": "scanner-primary", "fingerprint": "f5aabcace8f26db4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/field.js"}, "region": {"startLine": 466}}}]}, {"ruleId": "scanner-c23fd3ed7401e341", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/resiliencia.js:60"}, "properties": {"repobilityId": "f6179da6a06f1a48", "scanner": "scanner-primary", "fingerprint": "c23fd3ed7401e341", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/resiliencia.js"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-31ee861f7d418fda", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/efectividad-intervenciones.js:25"}, "properties": {"repobilityId": "9074ccdc769186f7", "scanner": "scanner-primary", "fingerprint": "31ee861f7d418fda", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/efectividad-intervenciones.js"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-62419518a05d09d5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/recommendations.js:72"}, "properties": {"repobilityId": "ee99ae283359f591", "scanner": "scanner-primary", "fingerprint": "62419518a05d09d5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/recommendations.js"}, "region": {"startLine": 72}}}]}, {"ruleId": "scanner-4335e5b0ae2ec947", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/coop-progreso-mensual.js:91"}, "properties": {"repobilityId": "862754bba0cc5163", "scanner": "scanner-primary", "fingerprint": "4335e5b0ae2ec947", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/coop-progreso-mensual.js"}, "region": {"startLine": 91}}}]}, {"ruleId": "scanner-e9b3d533ee430982", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/carbon.js:41"}, "properties": {"repobilityId": "3cbb9000b227a010", "scanner": "scanner-primary", "fingerprint": "e9b3d533ee430982", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/carbon.js"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-c26c4740a4431e2b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/cerebro-analytics.js:111"}, "properties": {"repobilityId": "8d6981de04dc1921", "scanner": "scanner-primary", "fingerprint": "c26c4740a4431e2b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/cerebro-analytics.js"}, "region": {"startLine": 111}}}]}, {"ruleId": "scanner-37ecd40dfaf80ecd", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/confianza-tratamientos.js:76"}, "properties": {"repobilityId": "30a53875dcb69e3e", "scanner": "scanner-primary", "fingerprint": "37ecd40dfaf80ecd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/confianza-tratamientos.js"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-e9edca44522c8ae9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/intel.js:64"}, "properties": {"repobilityId": "cb3e707a65ae9191", "scanner": "scanner-primary", "fingerprint": "e9edca44522c8ae9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/intel.js"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-f4ed806bd01fb44d", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in frontend/intel.js:657"}, "properties": {"repobilityId": "6dc5c96120e7c36e", "scanner": "scanner-primary", "fingerprint": "f4ed806bd01fb44d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/intel.js"}, "region": {"startLine": 657}}}]}, {"ruleId": "scanner-ad8a9fd107863906", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/ejecutivo.js:96"}, "properties": {"repobilityId": "e10286a4b0fcd808", "scanner": "scanner-primary", "fingerprint": "ad8a9fd107863906", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/ejecutivo.js"}, "region": {"startLine": 96}}}]}, {"ruleId": "scanner-f7654c89d65124cb", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/regional.js:76"}, "properties": {"repobilityId": "8dbea5c48ccd2231", "scanner": "scanner-primary", "fingerprint": "f7654c89d65124cb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/regional.js"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-5f7ed64fd4754e12", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/trayectoria.js:31"}, "properties": {"repobilityId": "3e4d63a88795ff20", "scanner": "scanner-primary", "fingerprint": "5f7ed64fd4754e12", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/trayectoria.js"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-7a65b3247c6f2c2e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/rotation.js:61"}, "properties": {"repobilityId": "8e59ecf5850b295b", "scanner": "scanner-primary", "fingerprint": "7a65b3247c6f2c2e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/rotation.js"}, "region": {"startLine": 61}}}]}, {"ruleId": "scanner-a6ab966dce460b7d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/knowledge.js:66"}, "properties": {"repobilityId": "a59d2032f8cf2196", "scanner": "scanner-primary", "fingerprint": "a6ab966dce460b7d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/knowledge.js"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-f7648c3444d9b9ff", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/anomalies.js:42"}, "properties": {"repobilityId": "96a575835754cca2", "scanner": "scanner-primary", "fingerprint": "f7648c3444d9b9ff", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/anomalies.js"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-542755e2499e7575", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/alertas-estacionales.js:50"}, "properties": {"repobilityId": "b7a9daf1bfdaa71e", "scanner": "scanner-primary", "fingerprint": "542755e2499e7575", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/alertas-estacionales.js"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-1ee7575c5855f0a8", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/diversidad-cultivos.js:96"}, "properties": {"repobilityId": "4e2f7a10c3d66be2", "scanner": "scanner-primary", "fingerprint": "1ee7575c5855f0a8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/diversidad-cultivos.js"}, "region": {"startLine": 96}}}]}, {"ruleId": "scanner-ab29ed674cfb5c65", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/completitud-global.js:79"}, "properties": {"repobilityId": "c9d5c0433044feba", "scanner": "scanner-primary", "fingerprint": "ab29ed674cfb5c65", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/completitud-global.js"}, "region": {"startLine": 79}}}]}, {"ruleId": "scanner-26362ef8cb88dfd1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/indice-estres.js:92"}, "properties": {"repobilityId": "6defa707f8f74b5c", "scanner": "scanner-primary", "fingerprint": "26362ef8cb88dfd1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/indice-estres.js"}, "region": {"startLine": 92}}}]}, {"ruleId": "scanner-aa994ffd4af40492", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/prioridad-riesgo.js:23"}, "properties": {"repobilityId": "ba854ae90d42e0ff", "scanner": "scanner-primary", "fingerprint": "aa994ffd4af40492", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/prioridad-riesgo.js"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-08983abf1743787e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/walkthrough.html:252"}, "properties": {"repobilityId": "a7771593fcebbc10", "scanner": "scanner-primary", "fingerprint": "08983abf1743787e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/walkthrough.html"}, "region": {"startLine": 252}}}]}, {"ruleId": "scanner-007ef3fbfa16f127", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/intelligence-page.js:54"}, "properties": {"repobilityId": "e2ce83578e7eacd8", "scanner": "scanner-primary", "fingerprint": "007ef3fbfa16f127", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/intelligence-page.js"}, "region": {"startLine": 54}}}]}, {"ruleId": "scanner-09efdae82e48f985", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/onboarding.js:94"}, "properties": {"repobilityId": "3816e15ca3ad6a8f", "scanner": "scanner-primary", "fingerprint": "09efdae82e48f985", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/onboarding.js"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-365cd8df83d85793", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/frescura-sensores.js:27"}, "properties": {"repobilityId": "d6570fe75e82a193", "scanner": "scanner-primary", "fingerprint": "365cd8df83d85793", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/frescura-sensores.js"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-db7211805b0442d8", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/thermal-dashboard.js:76"}, "properties": {"repobilityId": "19e4e4efdbf8a726", "scanner": "scanner-primary", "fingerprint": "db7211805b0442d8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/thermal-dashboard.js"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-49ddd86928045a47", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/regenerative.js:39"}, "properties": {"repobilityId": "56969794e1302d8f", "scanner": "scanner-primary", "fingerprint": "49ddd86928045a47", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/regenerative.js"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-e544cb749cd74eee", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/historial-enfermedades.js:75"}, "properties": {"repobilityId": "1d9b08b78ca64694", "scanner": "scanner-primary", "fingerprint": "e544cb749cd74eee", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/historial-enfermedades.js"}, "region": {"startLine": 75}}}]}, {"ruleId": "scanner-b5d568d357a2e107", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/whatsapp-demo.js:72"}, "properties": {"repobilityId": "649e0cbcbead129e", "scanner": "scanner-primary", "fingerprint": "b5d568d357a2e107", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/whatsapp-demo.js"}, "region": {"startLine": 72}}}]}, {"ruleId": "scanner-9f9a6177da207427", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/calculadora-suelo.js:51"}, "properties": {"repobilityId": "98bd198403a915df", "scanner": "scanner-primary", "fingerprint": "9f9a6177da207427", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/calculadora-suelo.js"}, "region": {"startLine": 51}}}]}, {"ruleId": "scanner-2174d574fee1fc8a", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/login.js:147"}, "properties": {"repobilityId": "ce11a30093977322", "scanner": "scanner-primary", "fingerprint": "2174d574fee1fc8a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/login.js"}, "region": {"startLine": 147}}}]}, {"ruleId": "scanner-7bf54022b195f1fe", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/flights.js:54"}, "properties": {"repobilityId": "dd75d0dac609ce46", "scanner": "scanner-primary", "fingerprint": "7bf54022b195f1fe", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/flights.js"}, "region": {"startLine": 54}}}]}, {"ruleId": "scanner-2abb66e8f9af2caa", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/microbiome.js:57"}, "properties": {"repobilityId": "59031e189e3e5faf", "scanner": "scanner-primary", "fingerprint": "2abb66e8f9af2caa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/microbiome.js"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-d8882a27ead983f9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/tek-page.js:28"}, "properties": {"repobilityId": "33ede6a5f6fb0e4b", "scanner": "scanner-primary", "fingerprint": "d8882a27ead983f9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/tek-page.js"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-5a8f808a88e0d358", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/coop-evidencia.js:52"}, "properties": {"repobilityId": "44f88c8a459e3425", "scanner": "scanner-primary", "fingerprint": "5a8f808a88e0d358", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/coop-evidencia.js"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-99d107439b9cd15d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/disease.js:67"}, "properties": {"repobilityId": "6449b8e4963f0ef3", "scanner": "scanner-primary", "fingerprint": "99d107439b9cd15d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/disease.js"}, "region": {"startLine": 67}}}]}, {"ruleId": "scanner-d5d2f2426be3c2ae", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/management.js:52"}, "properties": {"repobilityId": "c2773eef76fd56e0", "scanner": "scanner-primary", "fingerprint": "d5d2f2426be3c2ae", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/management.js"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-65d30bc59c07ca0d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/intervenciones.js:31"}, "properties": {"repobilityId": "2d4fe6a014254000", "scanner": "scanner-primary", "fingerprint": "65d30bc59c07ca0d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/intervenciones.js"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-cea83e1db53604a2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/notifications.js:47"}, "properties": {"repobilityId": "997a41aae020ed19", "scanner": "scanner-primary", "fingerprint": "cea83e1db53604a2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/notifications.js"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-d01852ea70d4b7cb", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/soil-import.js:35"}, "properties": {"repobilityId": "d39da8b6dba1d1b1", "scanner": "scanner-primary", "fingerprint": "d01852ea70d4b7cb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/soil-import.js"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-991e709617d12491", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/mapa.js:291"}, "properties": {"repobilityId": "2c3eaacfedb1293f", "scanner": "scanner-primary", "fingerprint": "991e709617d12491", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/mapa.js"}, "region": {"startLine": 291}}}]}, {"ruleId": "scanner-474e575281290585", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/plan-accion.js:30"}, "properties": {"repobilityId": "f173c9596cd0e03b", "scanner": "scanner-primary", "fingerprint": "474e575281290585", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/plan-accion.js"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-cd59f253039396c6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/alertas-clima.js:46"}, "properties": {"repobilityId": "6d58a948b0754399", "scanner": "scanner-primary", "fingerprint": "cd59f253039396c6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/alertas-clima.js"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-7b7031c1e3909cf9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/alineacion-tek.js:24"}, "properties": {"repobilityId": "121a27e79d95f186", "scanner": "scanner-primary", "fingerprint": "7b7031c1e3909cf9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/alineacion-tek.js"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-b3c34b3a6dbc1d56", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/prediccion-salud.js:79"}, "properties": {"repobilityId": "f86fb7e3efe7cab4", "scanner": "scanner-primary", "fingerprint": "b3c34b3a6dbc1d56", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/prediccion-salud.js"}, "region": {"startLine": 79}}}]}, {"ruleId": "scanner-95f09a85a217fde2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/completitud.js:53"}, "properties": {"repobilityId": "d37d3f45ecd954a0", "scanner": "scanner-primary", "fingerprint": "95f09a85a217fde2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/completitud.js"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-9ed9c1aacc7f2b9a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/irrigation.js:60"}, "properties": {"repobilityId": "3dce9c291ee74a13", "scanner": "scanner-primary", "fingerprint": "9ed9c1aacc7f2b9a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/irrigation.js"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-9e709154903723af", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/roi-tratamientos.js:62"}, "properties": {"repobilityId": "27ddaca926fe8161", "scanner": "scanner-primary", "fingerprint": "9e709154903723af", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/roi-tratamientos.js"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-250319f7d824b79f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/precision-ia.js:79"}, "properties": {"repobilityId": "7fe222be9cac6b9e", "scanner": "scanner-primary", "fingerprint": "250319f7d824b79f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/precision-ia.js"}, "region": {"startLine": 79}}}]}, {"ruleId": "scanner-7408e832b2515cb4", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/mission.js:48"}, "properties": {"repobilityId": "3b693cf3196e87b2", "scanner": "scanner-primary", "fingerprint": "7408e832b2515cb4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/mission.js"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-a54796c12419ed94", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/actions.js:90"}, "properties": {"repobilityId": "236231adcc8bbf50", "scanner": "scanner-primary", "fingerprint": "a54796c12419ed94", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/actions.js"}, "region": {"startLine": 90}}}]}, {"ruleId": "scanner-d86a9fbc6011fd17", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/resumen.js:111"}, "properties": {"repobilityId": "7271b000e2a05c2a", "scanner": "scanner-primary", "fingerprint": "d86a9fbc6011fd17", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/resumen.js"}, "region": {"startLine": 111}}}]}, {"ruleId": "scanner-ba28f0f4ef92f740", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/app.js:125"}, "properties": {"repobilityId": "35eb56cad5673d49", "scanner": "scanner-primary", "fingerprint": "ba28f0f4ef92f740", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/app.js"}, "region": {"startLine": 125}}}]}, {"ruleId": "scanner-1825513506b8a522", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/calendario-campo.js:20"}, "properties": {"repobilityId": "6f16f2f5f196b124", "scanner": "scanner-primary", "fingerprint": "1825513506b8a522", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/calendario-campo.js"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-dcea0800b9c3bf18", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/auth-guard.js:38"}, "properties": {"repobilityId": "2170ed9d65438d67", "scanner": "scanner-primary", "fingerprint": "dcea0800b9c3bf18", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/auth-guard.js"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-4eeb81304014a968", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/api-docs.js:55"}, "properties": {"repobilityId": "4c005d96b8c3e2d6", "scanner": "scanner-primary", "fingerprint": "4eeb81304014a968", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/api-docs.js"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-cbc699f147cf8365", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/yield.js:55"}, "properties": {"repobilityId": "cdddc12511057d0a", "scanner": "scanner-primary", "fingerprint": "cbc699f147cf8365", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/yield.js"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-80d7375face2ef97", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/hitos-regenerativos.js:36"}, "properties": {"repobilityId": "1f8afdfe7db75cee", "scanner": "scanner-primary", "fingerprint": "80d7375face2ef97", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/hitos-regenerativos.js"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-196968c6d7aa9c38", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/efectividad-global.js:173"}, "properties": {"repobilityId": "245a59de2a5f9513", "scanner": "scanner-primary", "fingerprint": "196968c6d7aa9c38", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/efectividad-global.js"}, "region": {"startLine": 173}}}]}, {"ruleId": "scanner-585a05209e84a057", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/clima.js:76"}, "properties": {"repobilityId": "b0ab95371b0ac2fc", "scanner": "scanner-primary", "fingerprint": "585a05209e84a057", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/clima.js"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-8fae20fb9a3787f1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/economic-impact.js:465"}, "properties": {"repobilityId": "42e804943c3f8606", "scanner": "scanner-primary", "fingerprint": "8fae20fb9a3787f1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/economic-impact.js"}, "region": {"startLine": 465}}}]}, {"ruleId": "scanner-ee630f30e221a062", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/soil-history.js:77"}, "properties": {"repobilityId": "056fe0ad7bea136a", "scanner": "scanner-primary", "fingerprint": "ee630f30e221a062", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/soil-history.js"}, "region": {"startLine": 77}}}]}, {"ruleId": "scanner-3aedb6b27cc061a7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/ranking-miembros.js:29"}, "properties": {"repobilityId": "94d5ee7673aa5fd7", "scanner": "scanner-primary", "fingerprint": "3aedb6b27cc061a7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/ranking-miembros.js"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-037af7b1ec19364f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/timeline.js:80"}, "properties": {"repobilityId": "349f382829e07c80", "scanner": "scanner-primary", "fingerprint": "037af7b1ec19364f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/timeline.js"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-39a8869c69d9e0b2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/reportes.js:19"}, "properties": {"repobilityId": "fdf965609fcced33", "scanner": "scanner-primary", "fingerprint": "39a8869c69d9e0b2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/reportes.js"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-52d83d52dab19b41", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/seasonal.js:49"}, "properties": {"repobilityId": "9bc0fae3a7c26c04", "scanner": "scanner-primary", "fingerprint": "52d83d52dab19b41", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/seasonal.js"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-235ae2089030ecad", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/calendario.js:38"}, "properties": {"repobilityId": "970d8ac7c3dcc5b2", "scanner": "scanner-primary", "fingerprint": "235ae2089030ecad", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/calendario.js"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-7659ba2925b836cf", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/reporte-anual.js:52"}, "properties": {"repobilityId": "924c0be873a1acfe", "scanner": "scanner-primary", "fingerprint": "7659ba2925b836cf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/reporte-anual.js"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-a6fc05cd8017c5e3", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/exportar.js:38"}, "properties": {"repobilityId": "355154afba4b0828", "scanner": "scanner-primary", "fingerprint": "a6fc05cd8017c5e3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/exportar.js"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-1c266560245f5375", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/impacto-agricultor.js:41"}, "properties": {"repobilityId": "7ab93aff74884f38", "scanner": "scanner-primary", "fingerprint": "1c266560245f5375", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/impacto-agricultor.js"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-65faf47d095f57f7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/cooperativa.js:26"}, "properties": {"repobilityId": "21c4c547edc3d5c6", "scanner": "scanner-primary", "fingerprint": "65faf47d095f57f7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/cooperativa.js"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-ca72f614994eb616", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/correlacion-ndvi.js:22"}, "properties": {"repobilityId": "37728bb5e9cff14a", "scanner": "scanner-primary", "fingerprint": "ca72f614994eb616", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/correlacion-ndvi.js"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-a1cf30e721bc8f2b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/nutrientes-suelo.js:80"}, "properties": {"repobilityId": "abfce01746b4c6d5", "scanner": "scanner-primary", "fingerprint": "a1cf30e721bc8f2b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/nutrientes-suelo.js"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-aa27dc96128eac0e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/efectividad.js:35"}, "properties": {"repobilityId": "bf45de4d8f89af21", "scanner": "scanner-primary", "fingerprint": "aa27dc96128eac0e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/efectividad.js"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-3a82efdb1c417bba", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/demo-fodecijal.js:47"}, "properties": {"repobilityId": "88992edeaecaa7fc", "scanner": "scanner-primary", "fingerprint": "3a82efdb1c417bba", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/demo-fodecijal.js"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-224c9ef61e4c3a32", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/comparar.js:111"}, "properties": {"repobilityId": "242f429ecbbf476a", "scanner": "scanner-primary", "fingerprint": "224c9ef61e4c3a32", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/comparar.js"}, "region": {"startLine": 111}}}]}, {"ruleId": "scanner-74919fbe012d8682", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/historial-alertas.js:87"}, "properties": {"repobilityId": "253f462b6fea4390", "scanner": "scanner-primary", "fingerprint": "74919fbe012d8682", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/historial-alertas.js"}, "region": {"startLine": 87}}}]}, {"ruleId": "scanner-1c23f7288f1023f2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/escalaciones-alertas.js:54"}, "properties": {"repobilityId": "03204131b6c0fbf8", "scanner": "scanner-primary", "fingerprint": "1c23f7288f1023f2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/escalaciones-alertas.js"}, "region": {"startLine": 54}}}]}, {"ruleId": "scanner-531bf627aa37dd30", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/tour.js:222"}, "properties": {"repobilityId": "c165198ec431ff3d", "scanner": "scanner-primary", "fingerprint": "531bf627aa37dd30", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/tour.js"}, "region": {"startLine": 222}}}]}, {"ruleId": "scanner-71518fe6d082af6a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/status.js:104"}, "properties": {"repobilityId": "901de570e262cd17", "scanner": "scanner-primary", "fingerprint": "71518fe6d082af6a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/status.js"}, "region": {"startLine": 104}}}]}, {"ruleId": "scanner-9bb39d0a3d02dc4b", "level": "note", "message": {"text": "Very large file: frontend/field.js (2450 lines)"}, "properties": {"repobilityId": "e289607c787d5cf9", "scanner": "scanner-primary", "fingerprint": "9bb39d0a3d02dc4b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4c08b2f871b2e9a2", "level": "note", "message": {"text": "Very large file: frontend/i18n.js (2602 lines)"}, "properties": {"repobilityId": "e48fbb299a0f04e2", "scanner": "scanner-primary", "fingerprint": "4c08b2f871b2e9a2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-63d96d4f83001f06", "level": "note", "message": {"text": "Very large file: frontend/app.js (1309 lines)"}, "properties": {"repobilityId": "f01ee4f42c29b236", "scanner": "scanner-primary", "fingerprint": "63d96d4f83001f06", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cd739837c40a3bcb", "level": "note", "message": {"text": "Very large file: src/cultivos/services/intelligence/analytics.py (1815 lines)"}, "properties": {"repobilityId": "cad1c39ff586f28d", "scanner": "scanner-primary", "fingerprint": "cd739837c40a3bcb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d8030a0beb68d809", "level": "note", "message": {"text": "Very large file: src/cultivos/db/seeds.py (1665 lines)"}, "properties": {"repobilityId": "be88f92219000589", "scanner": "scanner-primary", "fingerprint": "d8030a0beb68d809", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "acd45c4d404c40df", "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": "edd09e8bf777bb1d", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "5695d7596ca16336", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "419edc03004d1686", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "b4feb1513da9e46c", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "98c7d23561170de7", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-2885c35a36658f8d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/fotos.js:16"}, "properties": {"repobilityId": "d21a44ec715c5919", "scanner": "scanner-primary", "fingerprint": "2885c35a36658f8d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ff6b38dfcf217404", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/field.js:2158"}, "properties": {"repobilityId": "a4ac7aed1e234db1", "scanner": "scanner-primary", "fingerprint": "ff6b38dfcf217404", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-351661dba945bb15", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/efectividad-intervenciones.js:7"}, "properties": {"repobilityId": "cd890019266e4406", "scanner": "scanner-primary", "fingerprint": "351661dba945bb15", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2ab24b7287bb4e66", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/cerebro-analytics.js:7"}, "properties": {"repobilityId": "2b9a4b87267a8874", "scanner": "scanner-primary", "fingerprint": "2ab24b7287bb4e66", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-694a13ae0f9fe68e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/intel.js:737"}, "properties": {"repobilityId": "76e87ea616461c1d", "scanner": "scanner-primary", "fingerprint": "694a13ae0f9fe68e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6d8d7d907a12ee2e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/ejecutivo.js:7"}, "properties": {"repobilityId": "1417ad0279c5772c", "scanner": "scanner-primary", "fingerprint": "6d8d7d907a12ee2e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-76ed4f49331439a1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/trayectoria.js:9"}, "properties": {"repobilityId": "3f7362e3e3f6967d", "scanner": "scanner-primary", "fingerprint": "76ed4f49331439a1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-34fb153759ee68f6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/knowledge.js:56"}, "properties": {"repobilityId": "224afa87e746be9b", "scanner": "scanner-primary", "fingerprint": "34fb153759ee68f6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-762d9e29db081625", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/indice-estres.js:20"}, "properties": {"repobilityId": "cf5886f78182b1f6", "scanner": "scanner-primary", "fingerprint": "762d9e29db081625", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5a76553aea5deb37", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/prioridad-riesgo.js:11"}, "properties": {"repobilityId": "0bd0fc8d2f75a37f", "scanner": "scanner-primary", "fingerprint": "5a76553aea5deb37", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cfcd94fc7816a8b5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/onboarding.js:203"}, "properties": {"repobilityId": "64beac8fd92e8874", "scanner": "scanner-primary", "fingerprint": "cfcd94fc7816a8b5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-63a1365aaf3990d8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/frescura-sensores.js:9"}, "properties": {"repobilityId": "007426fc03fe073a", "scanner": "scanner-primary", "fingerprint": "63a1365aaf3990d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-19886ef95768c4fc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/login.js:117"}, "properties": {"repobilityId": "5423844b9698f6c6", "scanner": "scanner-primary", "fingerprint": "19886ef95768c4fc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2e96ddfece5710cd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/alert-config.js:137"}, "properties": {"repobilityId": "2509b4f34ca439a8", "scanner": "scanner-primary", "fingerprint": "2e96ddfece5710cd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1bd09cf9487526d5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/management.js:35"}, "properties": {"repobilityId": "d5b2de910437dc97", "scanner": "scanner-primary", "fingerprint": "1bd09cf9487526d5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2a3bea5ab57a4649", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/plan-accion.js:12"}, "properties": {"repobilityId": "5bc72b9969e9e1b3", "scanner": "scanner-primary", "fingerprint": "2a3bea5ab57a4649", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-668e77bfe3c9d1bf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/alineacion-tek.js:15"}, "properties": {"repobilityId": "ff490980224568d8", "scanner": "scanner-primary", "fingerprint": "668e77bfe3c9d1bf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d5ceac0d4098ca83", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/prediccion-salud.js:14"}, "properties": {"repobilityId": "3c25042c3c014415", "scanner": "scanner-primary", "fingerprint": "d5ceac0d4098ca83", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-228e93d5cd40daa3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/precision-ia.js:7"}, "properties": {"repobilityId": "fc861f140cfb6f32", "scanner": "scanner-primary", "fingerprint": "228e93d5cd40daa3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-17ec03550ac6cbfb", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/i18n.js:2529"}, "properties": {"repobilityId": "7e64858d6b3549c3", "scanner": "scanner-primary", "fingerprint": "17ec03550ac6cbfb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fb4bedc091da5ff7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/app.js:588"}, "properties": {"repobilityId": "d5364c80ef263988", "scanner": "scanner-primary", "fingerprint": "fb4bedc091da5ff7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6153bc96174bfb99", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/calendario-campo.js:24"}, "properties": {"repobilityId": "79e2689e0c5be0e2", "scanner": "scanner-primary", "fingerprint": "6153bc96174bfb99", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ef2a199ee2d1f19e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/calendario.js:8"}, "properties": {"repobilityId": "452cf8ac36acd9c6", "scanner": "scanner-primary", "fingerprint": "ef2a199ee2d1f19e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0722addf1ef54c98", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/reporte-anual.js:24"}, "properties": {"repobilityId": "8c0babf654290f4e", "scanner": "scanner-primary", "fingerprint": "0722addf1ef54c98", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-49f678e65e38875b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/exportar.js:96"}, "properties": {"repobilityId": "be74945c70080733", "scanner": "scanner-primary", "fingerprint": "49f678e65e38875b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6ff2823eb7e0a5fc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/cooperativa.js:7"}, "properties": {"repobilityId": "fdc4733e851ba17c", "scanner": "scanner-primary", "fingerprint": "6ff2823eb7e0a5fc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7913a7cd13847e9e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/escalaciones-alertas.js:11"}, "properties": {"repobilityId": "576fa3c0abdc42bd", "scanner": "scanner-primary", "fingerprint": "7913a7cd13847e9e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-99f20dc02c790824", "level": "note", "message": {"text": "Legacy-named symbol `hs_old` in tests/test_dashboard.py:25"}, "properties": {"repobilityId": "dba7980a5f970b18", "scanner": "scanner-primary", "fingerprint": "99f20dc02c790824", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-523dcc0bd8b83b0d", "level": "note", "message": {"text": "Legacy-named symbol `test_no_currency_code_in_user_copy` in tests/test_nb_fs_farmer_savings.py:37"}, "properties": {"repobilityId": "13f4ab20a4a995c9", "scanner": "scanner-primary", "fingerprint": "523dcc0bd8b83b0d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4211cdd57dd1eeda", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/test_cr14_back_button.py:26"}, "properties": {"repobilityId": "e76bd97e8f14a16a", "scanner": "scanner-primary", "fingerprint": "4211cdd57dd1eeda", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-376181260f05ae35", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/test_seasonal_benchmark.py:19"}, "properties": {"repobilityId": "34b59295fdd12563", "scanner": "scanner-primary", "fingerprint": "376181260f05ae35", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b56cc735d7651771", "level": "none", "message": {"text": "Commented-code block (6 lines) in design/mockups/insight-card/tweaks-panel.jsx:12"}, "properties": {"repobilityId": "29c80b2809858d0b", "scanner": "scanner-primary", "fingerprint": "b56cc735d7651771", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-06e528a63e417869", "level": "none", "message": {"text": "Commented-code block (6 lines) in design/mockups/weekly-brief/tweaks-panel.jsx:12"}, "properties": {"repobilityId": "a4a334c4d61d69f9", "scanner": "scanner-primary", "fingerprint": "06e528a63e417869", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b55a093d74bed5d1", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/public/mockups/insight-card/tweaks-panel.jsx:12"}, "properties": {"repobilityId": "c4e68c5919ac9ac7", "scanner": "scanner-primary", "fingerprint": "b55a093d74bed5d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b619b867723c9f89", "level": "none", "message": {"text": "Commented-code block (6 lines) in web/public/mockups/weekly-brief/tweaks-panel.jsx:12"}, "properties": {"repobilityId": "a553427ef8805dc1", "scanner": "scanner-primary", "fingerprint": "b619b867723c9f89", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6851fa3123b4587a", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/cultivos/app.py:216"}, "properties": {"repobilityId": "b93ca1de28316f0e", "scanner": "scanner-primary", "fingerprint": "6851fa3123b4587a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-533031d7166e6d00", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/cultivos/api/__init__.py:90"}, "properties": {"repobilityId": "2f2e94d864161498", "scanner": "scanner-primary", "fingerprint": "533031d7166e6d00", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-319e66a630e14977", "level": "none", "message": {"text": "2 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d838d1fc5d8231c9", "scanner": "scanner-primary", "fingerprint": "319e66a630e14977", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "788118af015a7331", "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": "24dccb7d64c8315c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "f6cc0d76c0749c5e", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "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": "2bc1bc42d7210827", "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": "0b804a0e8d6fd7f5", "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": "5b3b47d943949b3b", "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": "205ba05868cb38f2", "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": "45d639ab82bb4d3f", "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": "80f65ee1495175ec", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-388bfe83627807f0", "level": "error", "message": {"text": "FastAPI POST `create_notification` without auth dependency \u2014 src/cultivos/api/notifications.py:20"}, "properties": {"repobilityId": "6041932d656c2134", "scanner": "scanner-primary", "fingerprint": "388bfe83627807f0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/notifications.py"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-3e370ae6742007ff", "level": "error", "message": {"text": "FastAPI POST `acknowledge_notification` without auth dependency \u2014 src/cultivos/api/notifications.py:55"}, "properties": {"repobilityId": "4fd3ec5501faba5e", "scanner": "scanner-primary", "fingerprint": "3e370ae6742007ff", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/notifications.py"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-f213b88d5d05ab93", "level": "error", "message": {"text": "FastAPI POST `generate_portfolio_report` without auth dependency \u2014 src/cultivos/api/portfolio_report.py:17"}, "properties": {"repobilityId": "8eeeb149397eced5", "scanner": "scanner-primary", "fingerprint": "f213b88d5d05ab93", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/portfolio_report.py"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-d9491b224976c670", "level": "error", "message": {"text": "FastAPI POST `create_observation` without auth dependency \u2014 src/cultivos/api/observations.py:40"}, "properties": {"repobilityId": "f1f82034095e98dc", "scanner": "scanner-primary", "fingerprint": "d9491b224976c670", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/observations.py"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-f1d0cfa830b079a5", "level": "error", "message": {"text": "FastAPI POST `compute_soil_amendment` without auth dependency \u2014 src/cultivos/api/soil_amendment.py:11"}, "properties": {"repobilityId": "506807801867a1dd", "scanner": "scanner-primary", "fingerprint": "f1d0cfa830b079a5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/soil_amendment.py"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-e52c47da3abbddb5", "level": "error", "message": {"text": "FastAPI POST `create_alert_config` without auth dependency \u2014 src/cultivos/api/alert_config.py:45"}, "properties": {"repobilityId": "19ebb93ab531c09f", "scanner": "scanner-primary", "fingerprint": "e52c47da3abbddb5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/alert_config.py"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-d0fe62382af02c33", "level": "error", "message": {"text": "FastAPI PUT `update_alert_config` without auth dependency \u2014 src/cultivos/api/alert_config.py:70"}, "properties": {"repobilityId": "b487a7332a4aa096", "scanner": "scanner-primary", "fingerprint": "d0fe62382af02c33", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/alert_config.py"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-e44a89e94f487231", "level": "error", "message": {"text": "FastAPI POST `generate_farm_report` without auth dependency \u2014 src/cultivos/api/reports.py:23"}, "properties": {"repobilityId": "9467f5541fdade1b", "scanner": "scanner-primary", "fingerprint": "e44a89e94f487231", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/reports.py"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-6f3edcc5dedb670a", "level": "error", "message": {"text": "FastAPI POST `generate_treatments` without auth dependency \u2014 src/cultivos/api/treatments.py:40"}, "properties": {"repobilityId": "f49839e32c796b15", "scanner": "scanner-primary", "fingerprint": "6f3edcc5dedb670a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/treatments.py"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-6474f6358f75ee44", "level": "error", "message": {"text": "FastAPI POST `log_treatment_applied` without auth dependency \u2014 src/cultivos/api/treatments.py:291"}, "properties": {"repobilityId": "bebebe132d4e207e", "scanner": "scanner-primary", "fingerprint": "6474f6358f75ee44", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/treatments.py"}, "region": {"startLine": 291}}}]}, {"ruleId": "scanner-8d7399d4c35e1253", "level": "error", "message": {"text": "FastAPI POST `compute_field_health` without auth dependency \u2014 src/cultivos/api/health.py:28"}, "properties": {"repobilityId": "b66ce0d5c74a1a7f", "scanner": "scanner-primary", "fingerprint": "8d7399d4c35e1253", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/health.py"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-0150790c1e50da72", "level": "error", "message": {"text": "FastAPI POST `submit_feedback` without auth dependency \u2014 src/cultivos/api/feedback.py:27"}, "properties": {"repobilityId": "e5c9a90a001df9ca", "scanner": "scanner-primary", "fingerprint": "0150790c1e50da72", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/feedback.py"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-f035ec6a649d2b71", "level": "error", "message": {"text": "FastAPI POST `log_flight` without auth dependency \u2014 src/cultivos/api/flights.py:50"}, "properties": {"repobilityId": "0ec71882749a0962", "scanner": "scanner-primary", "fingerprint": "f035ec6a649d2b71", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/flights.py"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-827e22f575b751d6", "level": "error", "message": {"text": "FastAPI POST `upload_photo` without auth dependency \u2014 src/cultivos/api/photos.py:25"}, "properties": {"repobilityId": "d6fce6c5543f2213", "scanner": "scanner-primary", "fingerprint": "827e22f575b751d6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/photos.py"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-b009178d3fcbb40c", "level": "error", "message": {"text": "FastAPI DELETE `delete_photo` without auth dependency \u2014 src/cultivos/api/photos.py:75"}, "properties": {"repobilityId": "065c18d7c11c4b78", "scanner": "scanner-primary", "fingerprint": "b009178d3fcbb40c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/photos.py"}, "region": {"startLine": 75}}}]}, {"ruleId": "scanner-7ada634cb6f49846", "level": "error", "message": {"text": "FastAPI POST `diagnose_problem` without auth dependency \u2014 src/cultivos/api/intel.py:446"}, "properties": {"repobilityId": "c051bf02b2d5edbc", "scanner": "scanner-primary", "fingerprint": "7ada634cb6f49846", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/intel.py"}, "region": {"startLine": 446}}}]}, {"ruleId": "scanner-e7875cfe6d3215b5", "level": "error", "message": {"text": "FastAPI POST `fertilizer_for_stress` without auth dependency \u2014 src/cultivos/api/intel.py:485"}, "properties": {"repobilityId": "54204883f245de47", "scanner": "scanner-primary", "fingerprint": "e7875cfe6d3215b5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/intel.py"}, "region": {"startLine": 485}}}]}, {"ruleId": "scanner-24a89b1929779ec0", "level": "error", "message": {"text": "FastAPI POST `farmer_query` without auth dependency \u2014 src/cultivos/api/demo.py:83"}, "properties": {"repobilityId": "7c905e2f7ef88bbb", "scanner": "scanner-primary", "fingerprint": "24a89b1929779ec0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/demo.py"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-e71a3053def601c2", "level": "error", "message": {"text": "FastAPI POST `create_harvest` without auth dependency \u2014 src/cultivos/api/harvests.py:85"}, "properties": {"repobilityId": "ddc7a8d3c7962a6d", "scanner": "scanner-primary", "fingerprint": "e71a3053def601c2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/harvests.py"}, "region": {"startLine": 85}}}]}, {"ruleId": "scanner-ffc83652fb93bc89", "level": "error", "message": {"text": "FastAPI POST `create_microbiome_record` without auth dependency \u2014 src/cultivos/api/microbiome.py:27"}, "properties": {"repobilityId": "48eb5815705cb294", "scanner": "scanner-primary", "fingerprint": "ffc83652fb93bc89", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/microbiome.py"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-6071253927069bb1", "level": "error", "message": {"text": "FastAPI POST `post_tek_adoption` without auth dependency \u2014 src/cultivos/api/tek_adoption.py:35"}, "properties": {"repobilityId": "c20ede1d1c529489", "scanner": "scanner-primary", "fingerprint": "6071253927069bb1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/tek_adoption.py"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-288c7da267829bd1", "level": "error", "message": {"text": "FastAPI POST `check_and_create_alerts` without auth dependency \u2014 src/cultivos/api/alerts.py:26"}, "properties": {"repobilityId": "abe4e533d967bc3a", "scanner": "scanner-primary", "fingerprint": "288c7da267829bd1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/alerts.py"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-e44c613b106be456", "level": "error", "message": {"text": "FastAPI POST `check_irrigation_alerts` without auth dependency \u2014 src/cultivos/api/alerts.py:101"}, "properties": {"repobilityId": "b980a92548ef8d98", "scanner": "scanner-primary", "fingerprint": "e44c613b106be456", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/alerts.py"}, "region": {"startLine": 101}}}]}, {"ruleId": "scanner-6d17c300278c1858", "level": "error", "message": {"text": "FastAPI POST `check_anomaly_alerts` without auth dependency \u2014 src/cultivos/api/alerts.py:205"}, "properties": {"repobilityId": "70f77f9785f9fbba", "scanner": "scanner-primary", "fingerprint": "6d17c300278c1858", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/alerts.py"}, "region": {"startLine": 205}}}]}, {"ruleId": "scanner-6b9c122e3aaedbcc", "level": "error", "message": {"text": "FastAPI POST `create_weather_record` without auth dependency \u2014 src/cultivos/api/weather.py:25"}, "properties": {"repobilityId": "902cc65f90f4a97e", "scanner": "scanner-primary", "fingerprint": "6b9c122e3aaedbcc", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/weather.py"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-16405269482459b6", "level": "error", "message": {"text": "FastAPI POST `identify_disease` without auth dependency \u2014 src/cultivos/api/disease.py:36"}, "properties": {"repobilityId": "3aae0666962f2dd1", "scanner": "scanner-primary", "fingerprint": "16405269482459b6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/disease.py"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-ecbc2df1f0f4f6bd", "level": "error", "message": {"text": "FastAPI POST `create_soil_analysis` without auth dependency \u2014 src/cultivos/api/soil.py:28"}, "properties": {"repobilityId": "f20c8610b803ac95", "scanner": "scanner-primary", "fingerprint": "ecbc2df1f0f4f6bd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/soil.py"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-a4f5c1f74456caf0", "level": "error", "message": {"text": "FastAPI POST `import_soil_csv` without auth dependency \u2014 src/cultivos/api/soil.py:44"}, "properties": {"repobilityId": "654050a1ce44912c", "scanner": "scanner-primary", "fingerprint": "a4f5c1f74456caf0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/soil.py"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-d130b91a983e21b0", "level": "error", "message": {"text": "FastAPI PUT `update_soil_analysis` without auth dependency \u2014 src/cultivos/api/soil.py:126"}, "properties": {"repobilityId": "46eec816105100b4", "scanner": "scanner-primary", "fingerprint": "d130b91a983e21b0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/soil.py"}, "region": {"startLine": 126}}}]}, {"ruleId": "scanner-a1f04dc2c1c3f10a", "level": "error", "message": {"text": "FastAPI DELETE `delete_soil_analysis` without auth dependency \u2014 src/cultivos/api/soil.py:150"}, "properties": {"repobilityId": "96345d474673f338", "scanner": "scanner-primary", "fingerprint": "a1f04dc2c1c3f10a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/soil.py"}, "region": {"startLine": 150}}}]}, {"ruleId": "scanner-ced07b929b7ab2a3", "level": "error", "message": {"text": "FastAPI POST `create_cooperative` without auth dependency \u2014 src/cultivos/api/cooperatives.py:68"}, "properties": {"repobilityId": "8e3855488b9f16c5", "scanner": "scanner-primary", "fingerprint": "ced07b929b7ab2a3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/cooperatives.py"}, "region": {"startLine": 68}}}]}, {"ruleId": "scanner-237c10bfa1b9443a", "level": "error", "message": {"text": "FastAPI PUT `update_cooperative` without auth dependency \u2014 src/cultivos/api/cooperatives.py:103"}, "properties": {"repobilityId": "a2999ac7756c7bbb", "scanner": "scanner-primary", "fingerprint": "237c10bfa1b9443a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/cooperatives.py"}, "region": {"startLine": 103}}}]}, {"ruleId": "scanner-d7573366f31389d9", "level": "error", "message": {"text": "FastAPI DELETE `delete_cooperative` without auth dependency \u2014 src/cultivos/api/cooperatives.py:116"}, "properties": {"repobilityId": "28542ca0e9d312a9", "scanner": "scanner-primary", "fingerprint": "d7573366f31389d9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/cooperatives.py"}, "region": {"startLine": 116}}}]}, {"ruleId": "scanner-850406e9bbb9c7a5", "level": "error", "message": {"text": "FastAPI POST `sensor_fusion` without auth dependency \u2014 src/cultivos/api/fusion.py:62"}, "properties": {"repobilityId": "bf8bbf95f4a6c52e", "scanner": "scanner-primary", "fingerprint": "850406e9bbb9c7a5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/fusion.py"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-2093bd9ca031d799", "level": "error", "message": {"text": "FastAPI PUT `update_farm` without auth dependency \u2014 src/cultivos/api/farms.py:139"}, "properties": {"repobilityId": "3759406f5cdb3238", "scanner": "scanner-primary", "fingerprint": "2093bd9ca031d799", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/farms.py"}, "region": {"startLine": 139}}}]}, {"ruleId": "scanner-6d64de215b678bfc", "level": "error", "message": {"text": "FastAPI DELETE `delete_farm` without auth dependency \u2014 src/cultivos/api/farms.py:152"}, "properties": {"repobilityId": "e0d54b66e9f04593", "scanner": "scanner-primary", "fingerprint": "6d64de215b678bfc", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/farms.py"}, "region": {"startLine": 152}}}]}, {"ruleId": "scanner-a7cae34dedbd9dbf", "level": "error", "message": {"text": "FastAPI POST `create_field` without auth dependency \u2014 src/cultivos/api/farms.py:204"}, "properties": {"repobilityId": "8d172f5b3d10e2fb", "scanner": "scanner-primary", "fingerprint": "a7cae34dedbd9dbf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/farms.py"}, "region": {"startLine": 204}}}]}, {"ruleId": "scanner-402efeb30fcecfd7", "level": "error", "message": {"text": "FastAPI PUT `update_field` without auth dependency \u2014 src/cultivos/api/farms.py:239"}, "properties": {"repobilityId": "af4d5b5ed9b2e836", "scanner": "scanner-primary", "fingerprint": "402efeb30fcecfd7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/farms.py"}, "region": {"startLine": 239}}}]}, {"ruleId": "scanner-e9948de42352d119", "level": "error", "message": {"text": "FastAPI DELETE `delete_field` without auth dependency \u2014 src/cultivos/api/farms.py:256"}, "properties": {"repobilityId": "1655cd9c87094656", "scanner": "scanner-primary", "fingerprint": "e9948de42352d119", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/farms.py"}, "region": {"startLine": 256}}}]}, {"ruleId": "scanner-7a2d70668f82ef44", "level": "error", "message": {"text": "FastAPI POST `record_carbon_baseline` without auth dependency \u2014 src/cultivos/api/farms.py:517"}, "properties": {"repobilityId": "fb31d53a51fac9c8", "scanner": "scanner-primary", "fingerprint": "7a2d70668f82ef44", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/farms.py"}, "region": {"startLine": 517}}}]}, {"ruleId": "scanner-0152f990b50b60dd", "level": "error", "message": {"text": "FastAPI POST `analyze_ndvi` without auth dependency \u2014 src/cultivos/api/ndvi.py:29"}, "properties": {"repobilityId": "0f517fa6b21cb5b6", "scanner": "scanner-primary", "fingerprint": "0152f990b50b60dd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/ndvi.py"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-fdc4c1383f503d27", "level": "error", "message": {"text": "FastAPI POST `analyze_thermal` without auth dependency \u2014 src/cultivos/api/thermal.py:29"}, "properties": {"repobilityId": "904a84b8266be951", "scanner": "scanner-primary", "fingerprint": "fdc4c1383f503d27", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/cultivos/api/thermal.py"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-f10f9c9a13a50c2a", "level": "error", "message": {"text": "Dangling fetch: GET /api/intel/export (frontend/intel.js:737)"}, "properties": {"repobilityId": "fe8d03de070222bf", "scanner": "scanner-primary", "fingerprint": "f10f9c9a13a50c2a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-34e28795b6b4062b", "level": "error", "message": {"text": "Dangling fetch: GET /api/system/health-detailed (frontend/api-status.js:8)"}, "properties": {"repobilityId": "07ceba29350b51cc", "scanner": "scanner-primary", "fingerprint": "34e28795b6b4062b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1f6b44972f06c251", "level": "error", "message": {"text": "Dangling fetch: GET /api/knowledge/crops (frontend/onboarding.js:19)"}, "properties": {"repobilityId": "2fabafe5474626e9", "scanner": "scanner-primary", "fingerprint": "1f6b44972f06c251", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-14d669ba88408c30", "level": "error", "message": {"text": "Dangling fetch: POST /api/intel/soil-amendment (frontend/calculadora-suelo.js:28)"}, "properties": {"repobilityId": "c248d9550bb57446", "scanner": "scanner-primary", "fingerprint": "14d669ba88408c30", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-54d6a7a75e81566c", "level": "error", "message": {"text": "Dangling fetch: PUT /api/farms/${farmId}/alert-config (frontend/alert-config.js:137)"}, "properties": {"repobilityId": "0a0a9ba7af9dbbfb", "scanner": "scanner-primary", "fingerprint": "54d6a7a75e81566c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dee2bb0dc6916ce2", "level": "error", "message": {"text": "Dangling fetch: POST /api/farms/${farmId}/notifications/${notifId}/acknowledge (frontend/notifications.js:171)"}, "properties": {"repobilityId": "b2e34ef9fcc2d739", "scanner": "scanner-primary", "fingerprint": "dee2bb0dc6916ce2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1b2eef20f46a7ed3", "level": "error", "message": {"text": "Dangling fetch: GET /api/farms/${selectedFarmId}/export?format=csv (frontend/app.js:1101)"}, "properties": {"repobilityId": "267ab6f0d48d5156", "scanner": "scanner-primary", "fingerprint": "1b2eef20f46a7ed3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3472b0504db670a0", "level": "error", "message": {"text": "Dangling fetch: POST /api/farms/${selectedFarmId}/report (frontend/app.js:1130)"}, "properties": {"repobilityId": "eb986738815a28f0", "scanner": "scanner-primary", "fingerprint": "3472b0504db670a0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-471fb22913579405", "level": "error", "message": {"text": "Dangling fetch: POST /api/reports/portfolio (frontend/app.js:1156)"}, "properties": {"repobilityId": "1c9695c79d8c2e45", "scanner": "scanner-primary", "fingerprint": "471fb22913579405", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-860000184f82b19d", "level": "error", "message": {"text": "Dangling fetch: GET /api/cooperatives (frontend/ranking-miembros.js:13)"}, "properties": {"repobilityId": "9719f4cb7014aec7", "scanner": "scanner-primary", "fingerprint": "860000184f82b19d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2defda1749eeabce", "level": "error", "message": {"text": "Dangling fetch: POST /api/reports/portfolio (frontend/reportes.js:59)"}, "properties": {"repobilityId": "0d63cd45e10e2f81", "scanner": "scanner-primary", "fingerprint": "2defda1749eeabce", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-41a886dc8d40f21d", "level": "error", "message": {"text": "Dangling fetch: GET /api/alerts/history (frontend/historial-alertas.js:134)"}, "properties": {"repobilityId": "628d3d833fb971f4", "scanner": "scanner-primary", "fingerprint": "41a886dc8d40f21d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0ea119cfee224495", "level": "error", "message": {"text": "Dangling fetch: GET /api/alerts/analytics (frontend/historial-alertas.js:169)"}, "properties": {"repobilityId": "fcb25559845882e4", "scanner": "scanner-primary", "fingerprint": "0ea119cfee224495", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4756b4c4da7d2088", "level": "note", "message": {"text": "Unused endpoint: GET /api/health"}, "properties": {"repobilityId": "77a0224bf3ef5ac0", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9ff6d8b7a61de4c4", "level": "note", "message": {"text": "Unused endpoint: GET /api/sentry-debug"}, "properties": {"repobilityId": "78d0c44b241a42ec", "scanner": "scanner-primary", "fingerprint": "9ff6d8b7a61de4c4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a91deebe1ad91e08", "level": "note", "message": {"text": "Unused endpoint: GET /api/readiness"}, "properties": {"repobilityId": "cefbc45c94eae85c", "scanner": "scanner-primary", "fingerprint": "a91deebe1ad91e08", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "30bce9c93343faa0", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b5990848e550f868", "level": "note", "message": {"text": "Unused endpoint: GET /intel"}, "properties": {"repobilityId": "db308da1dff9afc5", "scanner": "scanner-primary", "fingerprint": "b5990848e550f868", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-902bfc14e3fa5a34", "level": "note", "message": {"text": "Unused endpoint: GET /campo"}, "properties": {"repobilityId": "14abe9bc1bb0d80f", "scanner": "scanner-primary", "fingerprint": "902bfc14e3fa5a34", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-157604b431902532", "level": "note", "message": {"text": "Unused endpoint: GET /demo"}, "properties": {"repobilityId": "29a3f64fce45b120", "scanner": "scanner-primary", "fingerprint": "157604b431902532", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f4ee524de299c537", "level": "note", "message": {"text": "Unused endpoint: GET /conocimiento"}, "properties": {"repobilityId": "4b7a548fff550b36", "scanner": "scanner-primary", "fingerprint": "f4ee524de299c537", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6a4dfcad3eb1618a", "level": "note", "message": {"text": "Unused endpoint: GET /login"}, "properties": {"repobilityId": "f25e48136e07fafe", "scanner": "scanner-primary", "fingerprint": "6a4dfcad3eb1618a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-19fad9c652d8768e", "level": "note", "message": {"text": "Unused endpoint: GET /gestion"}, "properties": {"repobilityId": "b6857b095910bc49", "scanner": "scanner-primary", "fingerprint": "19fad9c652d8768e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-de6149dcc9fb3c0f", "level": "note", "message": {"text": "Unused endpoint: GET /recomendaciones"}, "properties": {"repobilityId": "7954180e2e9545b9", "scanner": "scanner-primary", "fingerprint": "de6149dcc9fb3c0f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec60216b20540dee", "level": "note", "message": {"text": "Unused endpoint: GET /vuelos"}, "properties": {"repobilityId": "ddcf12d36567dc21", "scanner": "scanner-primary", "fingerprint": "ec60216b20540dee", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4fe11f34edba3564", "level": "note", "message": {"text": "Unused endpoint: GET /notificaciones"}, "properties": {"repobilityId": "bd4bedabd2b09d0c", "scanner": "scanner-primary", "fingerprint": "4fe11f34edba3564", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b78452c282ec53f6", "level": "note", "message": {"text": "Unused endpoint: GET /estado"}, "properties": {"repobilityId": "ac7236bbe7d24781", "scanner": "scanner-primary", "fingerprint": "b78452c282ec53f6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-16eeaf7850a2c6f9", "level": "note", "message": {"text": "Unused endpoint: GET /importar-suelo"}, "properties": {"repobilityId": "032f5ee0b7102644", "scanner": "scanner-primary", "fingerprint": "16eeaf7850a2c6f9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9cfe9631ff1825ec", "level": "note", "message": {"text": "Unused endpoint: GET /impacto-economico"}, "properties": {"repobilityId": "874d33e32d20e952", "scanner": "scanner-primary", "fingerprint": "9cfe9631ff1825ec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-06181e6a5c5d779e", "level": "note", "message": {"text": "Unused endpoint: GET /docs-api"}, "properties": {"repobilityId": "20e44bc4de8be147", "scanner": "scanner-primary", "fingerprint": "06181e6a5c5d779e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-30a91661f990c41c", "level": "note", "message": {"text": "Unused endpoint: GET /suelo"}, "properties": {"repobilityId": "0387fd40620c71ff", "scanner": "scanner-primary", "fingerprint": "30a91661f990c41c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-90209b45e547fba3", "level": "note", "message": {"text": "Unused endpoint: GET /historial"}, "properties": {"repobilityId": "4bf1ab6a42247bda", "scanner": "scanner-primary", "fingerprint": "90209b45e547fba3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b8cc386d3657ce88", "level": "note", "message": {"text": "Unused endpoint: GET /onboarding"}, "properties": {"repobilityId": "901ba18566241070", "scanner": "scanner-primary", "fingerprint": "b8cc386d3657ce88", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4bbc2f721b392c25", "level": "note", "message": {"text": "Unused endpoint: GET /recorrido"}, "properties": {"repobilityId": "15b545f806093b0a", "scanner": "scanner-primary", "fingerprint": "4bbc2f721b392c25", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4542f3b8526b136c", "level": "note", "message": {"text": "Unused endpoint: GET /alertas-config"}, "properties": {"repobilityId": "77f6e8e226038328", "scanner": "scanner-primary", "fingerprint": "4542f3b8526b136c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e6614216500dbc78", "level": "note", "message": {"text": "Unused endpoint: GET /termica"}, "properties": {"repobilityId": "4fe42a1c7a98c1df", "scanner": "scanner-primary", "fingerprint": "e6614216500dbc78", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4fc90a5c2e37ecd7", "level": "note", "message": {"text": "Unused endpoint: GET /regenerativo"}, "properties": {"repobilityId": "72d5dcee9a3a004c", "scanner": "scanner-primary", "fingerprint": "4fc90a5c2e37ecd7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-26ea9652beee0625", "level": "note", "message": {"text": "Unused endpoint: GET /carbono"}, "properties": {"repobilityId": "08936e1e0703e027", "scanner": "scanner-primary", "fingerprint": "26ea9652beee0625", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d79231b0db9b956e", "level": "note", "message": {"text": "Unused endpoint: GET /anomalias"}, "properties": {"repobilityId": "09446795a52a2c05", "scanner": "scanner-primary", "fingerprint": "d79231b0db9b956e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dc62d211421f586d", "level": "note", "message": {"text": "Unused endpoint: GET /microbioma"}, "properties": {"repobilityId": "3d5c01cf1046bbca", "scanner": "scanner-primary", "fingerprint": "dc62d211421f586d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-029c4a99cbbfa9d5", "level": "note", "message": {"text": "Unused endpoint: GET /rotacion"}, "properties": {"repobilityId": "77eae4c4b6bcf651", "scanner": "scanner-primary", "fingerprint": "029c4a99cbbfa9d5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9d1503caafc5d3e5", "level": "note", "message": {"text": "Unused endpoint: GET /mision"}, "properties": {"repobilityId": "6398ff0f989c4511", "scanner": "scanner-primary", "fingerprint": "9d1503caafc5d3e5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-281a4522f3ce15a4", "level": "note", "message": {"text": "Unused endpoint: GET /riego"}, "properties": {"repobilityId": "a4fd28a2af595f96", "scanner": "scanner-primary", "fingerprint": "281a4522f3ce15a4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0e7db8be634817dc", "level": "note", "message": {"text": "Unused endpoint: GET /enfermedades"}, "properties": {"repobilityId": "e0cef61e2845b60c", "scanner": "scanner-primary", "fingerprint": "0e7db8be634817dc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bf0bed51c7f8a3db", "level": "note", "message": {"text": "Unused endpoint: GET /tek"}, "properties": {"repobilityId": "67d1e3ed57033a3f", "scanner": "scanner-primary", "fingerprint": "bf0bed51c7f8a3db", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-471c558239c56576", "level": "note", "message": {"text": "Unused endpoint: GET /fusion"}, "properties": {"repobilityId": "22e61a1f46df5cc4", "scanner": "scanner-primary", "fingerprint": "471c558239c56576", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-131d24e583bd5711", "level": "note", "message": {"text": "Unused endpoint: GET /inteligencia"}, "properties": {"repobilityId": "dd4598199a635ee3", "scanner": "scanner-primary", "fingerprint": "131d24e583bd5711", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-99d64a1d311dca43", "level": "note", "message": {"text": "Unused endpoint: GET /estaciones"}, "properties": {"repobilityId": "95ccfafaca7c241b", "scanner": "scanner-primary", "fingerprint": "99d64a1d311dca43", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9fea50f9f1034ca2", "level": "note", "message": {"text": "Unused endpoint: GET /rendimiento"}, "properties": {"repobilityId": "f39969843b7c8a43", "scanner": "scanner-primary", "fingerprint": "9fea50f9f1034ca2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3e714d34f11865f5", "level": "note", "message": {"text": "Unused endpoint: GET /acciones"}, "properties": {"repobilityId": "f36223e1055943f6", "scanner": "scanner-primary", "fingerprint": "3e714d34f11865f5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-037c0b2befe9a5f5", "level": "note", "message": {"text": "Unused endpoint: GET /completitud"}, "properties": {"repobilityId": "127b9c0b1fda0dc5", "scanner": "scanner-primary", "fingerprint": "037c0b2befe9a5f5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-52e086bb06fd378c", "level": "note", "message": {"text": "Unused endpoint: GET /completitud-global"}, "properties": {"repobilityId": "d57ecdacc05570d5", "scanner": "scanner-primary", "fingerprint": "52e086bb06fd378c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd55f9cf10b4d833", "level": "note", "message": {"text": "Unused endpoint: GET /alertas-estacionales"}, "properties": {"repobilityId": "115bd2412b0ab2a8", "scanner": "scanner-primary", "fingerprint": "fd55f9cf10b4d833", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3aea19881e0c922f", "level": "note", "message": {"text": "Unused endpoint: GET /intervenciones"}, "properties": {"repobilityId": "0fe105b49cd636d0", "scanner": "scanner-primary", "fingerprint": "3aea19881e0c922f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c35e8c9af9a64dcb", "level": "note", "message": {"text": "Unused endpoint: GET /efectividad"}, "properties": {"repobilityId": "ca60ae0221bb7f73", "scanner": "scanner-primary", "fingerprint": "c35e8c9af9a64dcb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c1ac85b243b28524", "level": "note", "message": {"text": "Unused endpoint: GET /regional"}, "properties": {"repobilityId": "d364db9b2d3d1ee5", "scanner": "scanner-primary", "fingerprint": "c1ac85b243b28524", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-465ace269774b8ae", "level": "note", "message": {"text": "Unused endpoint: GET /reportes"}, "properties": {"repobilityId": "b6d6ccaaf4c5db40", "scanner": "scanner-primary", "fingerprint": "465ace269774b8ae", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e395a91742c801bb", "level": "note", "message": {"text": "Unused endpoint: GET /exportar"}, "properties": {"repobilityId": "21d8e45d1a85f006", "scanner": "scanner-primary", "fingerprint": "e395a91742c801bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f91158ba9cb44679", "level": "note", "message": {"text": "Unused endpoint: GET /calendario"}, "properties": {"repobilityId": "0d07a4959a079316", "scanner": "scanner-primary", "fingerprint": "f91158ba9cb44679", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8b770efe69cd7426", "level": "note", "message": {"text": "Unused endpoint: GET /mapa"}, "properties": {"repobilityId": "abec745ddd461563", "scanner": "scanner-primary", "fingerprint": "8b770efe69cd7426", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cd37d1414854ca59", "level": "note", "message": {"text": "Unused endpoint: GET /efectividad-global"}, "properties": {"repobilityId": "2aa032fca31fde4b", "scanner": "scanner-primary", "fingerprint": "cd37d1414854ca59", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9c6d9752967ef6a1", "level": "note", "message": {"text": "Unused endpoint: GET /clima"}, "properties": {"repobilityId": "de2977a11f8cd451", "scanner": "scanner-primary", "fingerprint": "9c6d9752967ef6a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-be97b15fcffcde8b", "level": "note", "message": {"text": "Unused endpoint: GET /comparar"}, "properties": {"repobilityId": "4bb0e4f1cf45ba50", "scanner": "scanner-primary", "fingerprint": "be97b15fcffcde8b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}