{"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-deade43b8cc95197", "name": "Possibly dead Python function: fetch_historical_15min", "shortDescription": {"text": "Possibly dead Python function: fetch_historical_15min"}, "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-8f1f2d35ae7bd807", "name": "Possibly dead Python function: login_required", "shortDescription": {"text": "Possibly dead Python function: login_required"}, "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-ad95dea77056953b", "name": "Icon-only button without accessible name \u2014 hepapp/static/js/dashboard.js:643", "shortDescription": {"text": "Icon-only button without accessible name \u2014 hepapp/static/js/dashboard.js:643"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-db3424722a940cfa", "name": "Privileged port 2 in use", "shortDescription": {"text": "Privileged port 2 in use"}, "fullDescription": {"text": "Port 2 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "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-e0f8e2a2e36a3416", "name": "Insecure pattern 'direct_innerhtml_assignment' in hepapp/static/js/dashboard.js:80", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in hepapp/static/js/dashboard.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-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c05cd85a0c6b62a2", "name": "Very large file: hepapp/static/js/dashboard.js (1750 lines)", "shortDescription": {"text": "Very large file: hepapp/static/js/dashboard.js (1750 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "5 tests / 28 src (ratio 0.18)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 14 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 13 placeholder/mock markers across 4 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5d449c0904fb0548", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hepapp/static/js/dashboard.js:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hepapp/static/js/dashboard.js:71"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7acc92767acb8aa8", "name": "Legacy-named symbol `api_backup` in hepapp/blueprints/postavke.py:223", "shortDescription": {"text": "Legacy-named symbol `api_backup` in hepapp/blueprints/postavke.py:223"}, "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-65df07ab4020db79", "name": "18 env vars used in code but missing from .env.example", "shortDescription": {"text": "18 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `HA_ENT_AUTARKY`, `HA_ENT_BATTERY_SOC`, `HA_ENT_CONS_KWH_DAY`, `HA_ENT_CONS_KWH_LIFETIME`, `HA_ENT_CONS_W`, `HA_ENT_FEED_KWH_DAY`, `HA_ENT_FEED_KWH_LIFETIME`, `HA_ENT_FEED_W` + 10 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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:\nhepapp/core.py:wrapper, hepapp/core.py:wrapper\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-61e22f9c55dec713", "name": "Flask mutation route `api_racuni` without `@login_required` \u2014 hepapp/blueprints/racuni.py:18", "shortDescription": {"text": "Flask mutation route `api_racuni` without `@login_required` \u2014 hepapp/blueprints/racuni.py:18"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6d031bd4b4930935", "name": "Flask mutation route `api_upload_pdf` without `@login_required` \u2014 hepapp/blueprints/racuni.py:109", "shortDescription": {"text": "Flask mutation route `api_upload_pdf` without `@login_required` \u2014 hepapp/blueprints/racuni.py:109"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-af6d6a13be91675d", "name": "Flask mutation route `api_postavke` without `@login_required` \u2014 hepapp/blueprints/postavke.py:28", "shortDescription": {"text": "Flask mutation route `api_postavke` without `@login_required` \u2014 hepapp/blueprints/postavke.py:28"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2b9ab6e506b68bff", "name": "Flask mutation route `api_korisnici` without `@login_required` \u2014 hepapp/blueprints/postavke.py:179", "shortDescription": {"text": "Flask mutation route `api_korisnici` without `@login_required` \u2014 hepapp/blueprints/postavke.py:179"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-537cc3d4e5c684c1", "name": "Flask mutation route `api_backup_auto` without `@login_required` \u2014 hepapp/blueprints/postavke.py:237", "shortDescription": {"text": "Flask mutation route `api_backup_auto` without `@login_required` \u2014 hepapp/blueprints/postavke.py:237"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-308a99148c78a933", "name": "Flask mutation route `api_tarifa` without `@login_required` \u2014 hepapp/blueprints/tarifa.py:10", "shortDescription": {"text": "Flask mutation route `api_tarifa` without `@login_required` \u2014 hepapp/blueprints/tarifa.py:10"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8806cbdb91ef580d", "name": "Flask mutation route `api_import_hep` without `@login_required` \u2014 hepapp/blueprints/setup.py:26", "shortDescription": {"text": "Flask mutation route `api_import_hep` without `@login_required` \u2014 hepapp/blueprints/setup.py:26"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3e3891360263dd65", "name": "Flask mutation route `api_import_sma` without `@login_required` \u2014 hepapp/blueprints/setup.py:39", "shortDescription": {"text": "Flask mutation route `api_import_sma` without `@login_required` \u2014 hepapp/blueprints/setup.py:39"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-606ef97e203254b6", "name": "Flask mutation route `api_sync_ha` without `@login_required` \u2014 hepapp/blueprints/setup.py:45", "shortDescription": {"text": "Flask mutation route `api_sync_ha` without `@login_required` \u2014 hepapp/blueprints/setup.py:45"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4a5f9f3ac71ab5c1", "name": "Flask mutation route `api_setup_complete` without `@login_required` \u2014 hepapp/blueprints/wizard.py:136", "shortDescription": {"text": "Flask mutation route `api_setup_complete` without `@login_required` \u2014 hepapp/blueprints/wizard.py:136"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-777657d7055175ba", "name": "Dangling fetch: GET /api/stats/optimalno (hepapp/static/js/dashboard.js:111)", "shortDescription": {"text": "Dangling fetch: GET /api/stats/optimalno (hepapp/static/js/dashboard.js:111)"}, "fullDescription": {"text": "`hepapp/static/js/dashboard.js:111` calls `GET /api/stats/optimalno` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stats/optimalno`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-00b82f27ea2b1220", "name": "Dangling fetch: GET /api/stats/usporedba (hepapp/static/js/dashboard.js:219)", "shortDescription": {"text": "Dangling fetch: GET /api/stats/usporedba (hepapp/static/js/dashboard.js:219)"}, "fullDescription": {"text": "`hepapp/static/js/dashboard.js:219` calls `GET /api/stats/usporedba` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stats/usporedba`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8a42f3b13cae20f5", "name": "Dangling fetch: GET /api/stats/mjesecni (hepapp/static/js/dashboard.js:402)", "shortDescription": {"text": "Dangling fetch: GET /api/stats/mjesecni (hepapp/static/js/dashboard.js:402)"}, "fullDescription": {"text": "`hepapp/static/js/dashboard.js:402` calls `GET /api/stats/mjesecni` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stats/mjesecni`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c29b3b3c1d33eb3f", "name": "Dangling fetch: GET /api/stats/registri (hepapp/static/js/dashboard.js:413)", "shortDescription": {"text": "Dangling fetch: GET /api/stats/registri (hepapp/static/js/dashboard.js:413)"}, "fullDescription": {"text": "`hepapp/static/js/dashboard.js:413` calls `GET /api/stats/registri` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stats/registri`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2b8fbc1c6d605f47", "name": "Dangling fetch: GET /api/stats/vt-kalibracija (hepapp/static/js/dashboard.js:541)", "shortDescription": {"text": "Dangling fetch: GET /api/stats/vt-kalibracija (hepapp/static/js/dashboard.js:541)"}, "fullDescription": {"text": "`hepapp/static/js/dashboard.js:541` calls `GET /api/stats/vt-kalibracija` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stats/vt-kalibracija`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-049943c2499327a5", "name": "Dangling fetch: GET /api/stats/dug (hepapp/static/js/dashboard.js:929)", "shortDescription": {"text": "Dangling fetch: GET /api/stats/dug (hepapp/static/js/dashboard.js:929)"}, "fullDescription": {"text": "`hepapp/static/js/dashboard.js:929` calls `GET /api/stats/dug` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stats/dug`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-26315f7fdd3816d6", "name": "Dangling fetch: GET /api/postavke (hepapp/static/js/dashboard.js:1087)", "shortDescription": {"text": "Dangling fetch: GET /api/postavke (hepapp/static/js/dashboard.js:1087)"}, "fullDescription": {"text": "`hepapp/static/js/dashboard.js:1087` calls `GET /api/postavke` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/postavke`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2aac122d13ce4280", "name": "Dangling fetch: GET /api/postavke/status (hepapp/static/js/dashboard.js:1108)", "shortDescription": {"text": "Dangling fetch: GET /api/postavke/status (hepapp/static/js/dashboard.js:1108)"}, "fullDescription": {"text": "`hepapp/static/js/dashboard.js:1108` calls `GET /api/postavke/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/postavke/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b9a34028a24eb88c", "name": "Dangling fetch: POST /api/postavke (hepapp/static/js/dashboard.js:1156)", "shortDescription": {"text": "Dangling fetch: POST /api/postavke (hepapp/static/js/dashboard.js:1156)"}, "fullDescription": {"text": "`hepapp/static/js/dashboard.js:1156` calls `POST /api/postavke` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/postavke`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2b925eb8c424be94", "name": "Dangling fetch: GET /api/postavke/korisnici (hepapp/static/js/dashboard.js:1192)", "shortDescription": {"text": "Dangling fetch: GET /api/postavke/korisnici (hepapp/static/js/dashboard.js:1192)"}, "fullDescription": {"text": "`hepapp/static/js/dashboard.js:1192` calls `GET /api/postavke/korisnici` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/postavke/korisnici`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f207e3d2f5edc90a", "name": "Dangling fetch: POST /api/postavke/korisnici (hepapp/static/js/dashboard.js:1216)", "shortDescription": {"text": "Dangling fetch: POST /api/postavke/korisnici (hepapp/static/js/dashboard.js:1216)"}, "fullDescription": {"text": "`hepapp/static/js/dashboard.js:1216` calls `POST /api/postavke/korisnici` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/postavke/korisnici`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-95de794551c7c9a9", "name": "Dangling fetch: POST /api/postavke/backup/auto (hepapp/static/js/dashboard.js:1229)", "shortDescription": {"text": "Dangling fetch: POST /api/postavke/backup/auto (hepapp/static/js/dashboard.js:1229)"}, "fullDescription": {"text": "`hepapp/static/js/dashboard.js:1229` calls `POST /api/postavke/backup/auto` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/postavke/backup/auto`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-65ecdcbe77d4df43", "name": "Dangling fetch: GET /api/stats/procjena-trenutni (hepapp/static/js/dashboard.js:1328)", "shortDescription": {"text": "Dangling fetch: GET /api/stats/procjena-trenutni (hepapp/static/js/dashboard.js:1328)"}, "fullDescription": {"text": "`hepapp/static/js/dashboard.js:1328` calls `GET /api/stats/procjena-trenutni` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stats/procjena-trenutni`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-07ff64d5d18dca27", "name": "Dangling fetch: GET /api/stats/cijene (hepapp/static/js/dashboard.js:1399)", "shortDescription": {"text": "Dangling fetch: GET /api/stats/cijene (hepapp/static/js/dashboard.js:1399)"}, "fullDescription": {"text": "`hepapp/static/js/dashboard.js:1399` calls `GET /api/stats/cijene` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stats/cijene`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0c37731802d82cd6", "name": "Dangling fetch: GET /api/stats/weather (hepapp/static/js/dashboard.js:1443)", "shortDescription": {"text": "Dangling fetch: GET /api/stats/weather (hepapp/static/js/dashboard.js:1443)"}, "fullDescription": {"text": "`hepapp/static/js/dashboard.js:1443` calls `GET /api/stats/weather` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stats/weather`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b3fe3a6e582d73ab", "name": "Dangling fetch: GET /api/stats/power-limit-history (hepapp/static/js/dashboard.js:1592)", "shortDescription": {"text": "Dangling fetch: GET /api/stats/power-limit-history (hepapp/static/js/dashboard.js:1592)"}, "fullDescription": {"text": "`hepapp/static/js/dashboard.js:1592` calls `GET /api/stats/power-limit-history` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stats/power-limit-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-cdb02ee2f16769d5", "name": "Dangling fetch: GET /api/stats/plant-info (hepapp/static/js/dashboard.js:1621)", "shortDescription": {"text": "Dangling fetch: GET /api/stats/plant-info (hepapp/static/js/dashboard.js:1621)"}, "fullDescription": {"text": "`hepapp/static/js/dashboard.js:1621` calls `GET /api/stats/plant-info` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stats/plant-info`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a187e60816daa9bd", "name": "Dangling fetch: GET /api/stats/peak-snaga (hepapp/static/js/dashboard.js:1649)", "shortDescription": {"text": "Dangling fetch: GET /api/stats/peak-snaga (hepapp/static/js/dashboard.js:1649)"}, "fullDescription": {"text": "`hepapp/static/js/dashboard.js:1649` calls `GET /api/stats/peak-snaga` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stats/peak-snaga`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5f0021a514163cdd", "name": "Dangling fetch: GET /api/postavke/mjerno-mjesto (hepapp/static/js/dashboard.js:1670)", "shortDescription": {"text": "Dangling fetch: GET /api/postavke/mjerno-mjesto (hepapp/static/js/dashboard.js:1670)"}, "fullDescription": {"text": "`hepapp/static/js/dashboard.js:1670` calls `GET /api/postavke/mjerno-mjesto` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/postavke/mjerno-mjesto`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-30d56518ac266fa9", "name": "Dangling fetch: GET /api/stats/vt-nt-trosak (hepapp/static/js/dashboard.js:1698)", "shortDescription": {"text": "Dangling fetch: GET /api/stats/vt-nt-trosak (hepapp/static/js/dashboard.js:1698)"}, "fullDescription": {"text": "`hepapp/static/js/dashboard.js:1698` calls `GET /api/stats/vt-nt-trosak` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stats/vt-nt-trosak`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c9e449c3b9e73b73", "name": "Unused endpoint: ANY /logout", "shortDescription": {"text": "Unused endpoint: ANY /logout"}, "fullDescription": {"text": "`hepapp/auth.py` declares `ANY /logout` 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-4719f054af571f9b", "name": "Unused endpoint: ANY /data", "shortDescription": {"text": "Unused endpoint: ANY /data"}, "fullDescription": {"text": "`hepapp/blueprints/data.py` declares `ANY /data` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-60a190ef2a71df78", "name": "Unused endpoint: ANY /data/sve", "shortDescription": {"text": "Unused endpoint: ANY /data/sve"}, "fullDescription": {"text": "`hepapp/blueprints/data.py` declares `ANY /data/sve` 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-626dccc05f8ec805", "name": "Unused endpoint: ANY /povijest", "shortDescription": {"text": "Unused endpoint: ANY /povijest"}, "fullDescription": {"text": "`hepapp/blueprints/data.py` declares `ANY /povijest` 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-1a6d91f2236825bf", "name": "Unused endpoint: ANY /", "shortDescription": {"text": "Unused endpoint: ANY /"}, "fullDescription": {"text": "`hepapp/blueprints/views.py` declares `ANY /` 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-b3e0a84fdd04c31a", "name": "Unused endpoint: ANY /mjerno-mjesto", "shortDescription": {"text": "Unused endpoint: ANY /mjerno-mjesto"}, "fullDescription": {"text": "`hepapp/blueprints/postavke.py` declares `ANY /mjerno-mjesto` 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-5621b25643c2a309", "name": "Unused endpoint: ANY /korisnici", "shortDescription": {"text": "Unused endpoint: ANY /korisnici"}, "fullDescription": {"text": "`hepapp/blueprints/postavke.py` declares `ANY /korisnici` 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-434f82e519486cbc", "name": "Unused endpoint: ANY /backup", "shortDescription": {"text": "Unused endpoint: ANY /backup"}, "fullDescription": {"text": "`hepapp/blueprints/postavke.py` declares `ANY /backup` 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-d897d74da55e3210", "name": "Unused endpoint: ANY /backup/auto", "shortDescription": {"text": "Unused endpoint: ANY /backup/auto"}, "fullDescription": {"text": "`hepapp/blueprints/postavke.py` declares `ANY /backup/auto` 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-f4b071827067f2b2", "name": "Unused endpoint: ANY /usporedba", "shortDescription": {"text": "Unused endpoint: ANY /usporedba"}, "fullDescription": {"text": "`hepapp/blueprints/stats.py` declares `ANY /usporedba` 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-c9477d664dcb3c0a", "name": "Unused endpoint: ANY /registri", "shortDescription": {"text": "Unused endpoint: ANY /registri"}, "fullDescription": {"text": "`hepapp/blueprints/stats.py` declares `ANY /registri` 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-0dc0734894c91c3a", "name": "Unused endpoint: ANY /dug", "shortDescription": {"text": "Unused endpoint: ANY /dug"}, "fullDescription": {"text": "`hepapp/blueprints/stats.py` declares `ANY /dug` 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-da2d763044b6c652", "name": "Unused endpoint: ANY /optimalno", "shortDescription": {"text": "Unused endpoint: ANY /optimalno"}, "fullDescription": {"text": "`hepapp/blueprints/stats.py` declares `ANY /optimalno` 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-094e0b5ca7a27d55", "name": "Unused endpoint: ANY /mjesecni", "shortDescription": {"text": "Unused endpoint: ANY /mjesecni"}, "fullDescription": {"text": "`hepapp/blueprints/stats.py` declares `ANY /mjesecni` 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-adfc78bc336b1817", "name": "Unused endpoint: ANY /procjena-trenutni", "shortDescription": {"text": "Unused endpoint: ANY /procjena-trenutni"}, "fullDescription": {"text": "`hepapp/blueprints/stats.py` declares `ANY /procjena-trenutni` 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-70b77488d5139f24", "name": "Unused endpoint: ANY /cijene", "shortDescription": {"text": "Unused endpoint: ANY /cijene"}, "fullDescription": {"text": "`hepapp/blueprints/stats.py` declares `ANY /cijene` 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-34db04930f20fd0f", "name": "Unused endpoint: ANY /weather", "shortDescription": {"text": "Unused endpoint: ANY /weather"}, "fullDescription": {"text": "`hepapp/blueprints/stats.py` declares `ANY /weather` 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-d5940f0fc9dd5459", "name": "Unused endpoint: ANY /power-limit-history", "shortDescription": {"text": "Unused endpoint: ANY /power-limit-history"}, "fullDescription": {"text": "`hepapp/blueprints/stats.py` declares `ANY /power-limit-history` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ef2f9f255c799379", "name": "Unused endpoint: ANY /plant-info", "shortDescription": {"text": "Unused endpoint: ANY /plant-info"}, "fullDescription": {"text": "`hepapp/blueprints/stats.py` declares `ANY /plant-info` 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-7027ce66f2ca19aa", "name": "Unused endpoint: ANY /peak-snaga", "shortDescription": {"text": "Unused endpoint: ANY /peak-snaga"}, "fullDescription": {"text": "`hepapp/blueprints/stats.py` declares `ANY /peak-snaga` 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-7f87fffdfb78f129", "name": "Unused endpoint: ANY /vt-nt-trosak", "shortDescription": {"text": "Unused endpoint: ANY /vt-nt-trosak"}, "fullDescription": {"text": "`hepapp/blueprints/stats.py` declares `ANY /vt-nt-trosak` 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-d2865ff10ccd6747", "name": "Unused endpoint: ANY /vt-kalibracija", "shortDescription": {"text": "Unused endpoint: ANY /vt-kalibracija"}, "fullDescription": {"text": "`hepapp/blueprints/stats.py` declares `ANY /vt-kalibracija` 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-27a2f853c4fec12e", "name": "Unused endpoint: ANY /tarifa", "shortDescription": {"text": "Unused endpoint: ANY /tarifa"}, "fullDescription": {"text": "`hepapp/blueprints/tarifa.py` declares `ANY /tarifa` 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-68417b718af73637", "name": "Unused endpoint: ANY /import-hep", "shortDescription": {"text": "Unused endpoint: ANY /import-hep"}, "fullDescription": {"text": "`hepapp/blueprints/setup.py` declares `ANY /import-hep` 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-283f21cee366ba32", "name": "Unused endpoint: ANY /import-sma", "shortDescription": {"text": "Unused endpoint: ANY /import-sma"}, "fullDescription": {"text": "`hepapp/blueprints/setup.py` declares `ANY /import-sma` 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-38f539b9cc05f9e4", "name": "Unused endpoint: ANY /sync-ha", "shortDescription": {"text": "Unused endpoint: ANY /sync-ha"}, "fullDescription": {"text": "`hepapp/blueprints/setup.py` declares `ANY /sync-ha` 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-44c7d3a14d8d8103", "name": "Unused endpoint: ANY /setup", "shortDescription": {"text": "Unused endpoint: ANY /setup"}, "fullDescription": {"text": "`hepapp/blueprints/wizard.py` declares `ANY /setup` 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-8d760919b254d805", "name": "Unused endpoint: ANY /api/setup/complete", "shortDescription": {"text": "Unused endpoint: ANY /api/setup/complete"}, "fullDescription": {"text": "`hepapp/blueprints/wizard.py` declares `ANY /api/setup/complete` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24588"}, "properties": {"repository": "bignjato/Energija_app", "repoUrl": "https://github.com/bignjato/Energija_app", "branch": "main"}, "results": [{"ruleId": "scanner-deade43b8cc95197", "level": "note", "message": {"text": "Possibly dead Python function: fetch_historical_15min"}, "properties": {"repobilityId": "ab6a217849bcf666", "scanner": "scanner-primary", "fingerprint": "deade43b8cc95197", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sma_scraper.py:162"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8f1f2d35ae7bd807", "level": "note", "message": {"text": "Possibly dead Python function: login_required"}, "properties": {"repobilityId": "4388d11529a7d531", "scanner": "scanner-primary", "fingerprint": "8f1f2d35ae7bd807", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hepapp/core.py:67"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ad95dea77056953b", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 hepapp/static/js/dashboard.js:643"}, "properties": {"repobilityId": "c642d955c2ad63ab", "scanner": "scanner-primary", "fingerprint": "ad95dea77056953b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-db3424722a940cfa", "level": "warning", "message": {"text": "Privileged port 2 in use"}, "properties": {"repobilityId": "755b04866010e843", "scanner": "scanner-primary", "fingerprint": "db3424722a940cfa", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sync_loop.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-de3c1f217d72a063", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "1de0ecd007803dbd", "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": 1}}}]}, {"ruleId": "scanner-e0f8e2a2e36a3416", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in hepapp/static/js/dashboard.js:80"}, "properties": {"repobilityId": "f3b774319df7f0c0", "scanner": "scanner-primary", "fingerprint": "e0f8e2a2e36a3416", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hepapp/static/js/dashboard.js"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-c05cd85a0c6b62a2", "level": "note", "message": {"text": "Very large file: hepapp/static/js/dashboard.js (1750 lines)"}, "properties": {"repobilityId": "85a3dd8449e680ae", "scanner": "scanner-primary", "fingerprint": "c05cd85a0c6b62a2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "ae515f34e56f2db3", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "40afa9c31c583cc0", "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": "5efc165215b47153", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "634bbcadad7aae4b", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "68b1cc4094c43aab", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "c677801dc5797179", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-5d449c0904fb0548", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hepapp/static/js/dashboard.js:71"}, "properties": {"repobilityId": "27a6b4d51b155f26", "scanner": "scanner-primary", "fingerprint": "5d449c0904fb0548", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7acc92767acb8aa8", "level": "note", "message": {"text": "Legacy-named symbol `api_backup` in hepapp/blueprints/postavke.py:223"}, "properties": {"repobilityId": "505116c666f30f35", "scanner": "scanner-primary", "fingerprint": "7acc92767acb8aa8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-65df07ab4020db79", "level": "note", "message": {"text": "18 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "5e334d56f52c02e1", "scanner": "scanner-primary", "fingerprint": "65df07ab4020db79", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "21c01f1053374621", "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": "02e954ae7066011b", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-61e22f9c55dec713", "level": "error", "message": {"text": "Flask mutation route `api_racuni` without `@login_required` \u2014 hepapp/blueprints/racuni.py:18"}, "properties": {"repobilityId": "dbb2a04f5350d304", "scanner": "scanner-primary", "fingerprint": "61e22f9c55dec713", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hepapp/blueprints/racuni.py"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-6d031bd4b4930935", "level": "error", "message": {"text": "Flask mutation route `api_upload_pdf` without `@login_required` \u2014 hepapp/blueprints/racuni.py:109"}, "properties": {"repobilityId": "3889a78327997b8e", "scanner": "scanner-primary", "fingerprint": "6d031bd4b4930935", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hepapp/blueprints/racuni.py"}, "region": {"startLine": 109}}}]}, {"ruleId": "scanner-af6d6a13be91675d", "level": "error", "message": {"text": "Flask mutation route `api_postavke` without `@login_required` \u2014 hepapp/blueprints/postavke.py:28"}, "properties": {"repobilityId": "a2881c670abd0d0f", "scanner": "scanner-primary", "fingerprint": "af6d6a13be91675d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hepapp/blueprints/postavke.py"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-2b9ab6e506b68bff", "level": "error", "message": {"text": "Flask mutation route `api_korisnici` without `@login_required` \u2014 hepapp/blueprints/postavke.py:179"}, "properties": {"repobilityId": "7df7d54a7520960f", "scanner": "scanner-primary", "fingerprint": "2b9ab6e506b68bff", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hepapp/blueprints/postavke.py"}, "region": {"startLine": 179}}}]}, {"ruleId": "scanner-537cc3d4e5c684c1", "level": "error", "message": {"text": "Flask mutation route `api_backup_auto` without `@login_required` \u2014 hepapp/blueprints/postavke.py:237"}, "properties": {"repobilityId": "48bc112593eac449", "scanner": "scanner-primary", "fingerprint": "537cc3d4e5c684c1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hepapp/blueprints/postavke.py"}, "region": {"startLine": 237}}}]}, {"ruleId": "scanner-308a99148c78a933", "level": "error", "message": {"text": "Flask mutation route `api_tarifa` without `@login_required` \u2014 hepapp/blueprints/tarifa.py:10"}, "properties": {"repobilityId": "16749979a62c0dfd", "scanner": "scanner-primary", "fingerprint": "308a99148c78a933", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hepapp/blueprints/tarifa.py"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-8806cbdb91ef580d", "level": "error", "message": {"text": "Flask mutation route `api_import_hep` without `@login_required` \u2014 hepapp/blueprints/setup.py:26"}, "properties": {"repobilityId": "736dbf50fc2eebd8", "scanner": "scanner-primary", "fingerprint": "8806cbdb91ef580d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hepapp/blueprints/setup.py"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-3e3891360263dd65", "level": "error", "message": {"text": "Flask mutation route `api_import_sma` without `@login_required` \u2014 hepapp/blueprints/setup.py:39"}, "properties": {"repobilityId": "a58faaec9995c9c3", "scanner": "scanner-primary", "fingerprint": "3e3891360263dd65", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hepapp/blueprints/setup.py"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-606ef97e203254b6", "level": "error", "message": {"text": "Flask mutation route `api_sync_ha` without `@login_required` \u2014 hepapp/blueprints/setup.py:45"}, "properties": {"repobilityId": "d23639da2e38cf8a", "scanner": "scanner-primary", "fingerprint": "606ef97e203254b6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hepapp/blueprints/setup.py"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-4a5f9f3ac71ab5c1", "level": "error", "message": {"text": "Flask mutation route `api_setup_complete` without `@login_required` \u2014 hepapp/blueprints/wizard.py:136"}, "properties": {"repobilityId": "f28355b97e20cc34", "scanner": "scanner-primary", "fingerprint": "4a5f9f3ac71ab5c1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hepapp/blueprints/wizard.py"}, "region": {"startLine": 136}}}]}, {"ruleId": "scanner-777657d7055175ba", "level": "error", "message": {"text": "Dangling fetch: GET /api/stats/optimalno (hepapp/static/js/dashboard.js:111)"}, "properties": {"repobilityId": "71e0e671f2020e54", "scanner": "scanner-primary", "fingerprint": "777657d7055175ba", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-00b82f27ea2b1220", "level": "error", "message": {"text": "Dangling fetch: GET /api/stats/usporedba (hepapp/static/js/dashboard.js:219)"}, "properties": {"repobilityId": "e4ecf93cbce7e779", "scanner": "scanner-primary", "fingerprint": "00b82f27ea2b1220", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8a42f3b13cae20f5", "level": "error", "message": {"text": "Dangling fetch: GET /api/stats/mjesecni (hepapp/static/js/dashboard.js:402)"}, "properties": {"repobilityId": "2c189823759006f8", "scanner": "scanner-primary", "fingerprint": "8a42f3b13cae20f5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c29b3b3c1d33eb3f", "level": "error", "message": {"text": "Dangling fetch: GET /api/stats/registri (hepapp/static/js/dashboard.js:413)"}, "properties": {"repobilityId": "ec2d060df69ea28c", "scanner": "scanner-primary", "fingerprint": "c29b3b3c1d33eb3f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2b8fbc1c6d605f47", "level": "error", "message": {"text": "Dangling fetch: GET /api/stats/vt-kalibracija (hepapp/static/js/dashboard.js:541)"}, "properties": {"repobilityId": "55ed184c1a8869a1", "scanner": "scanner-primary", "fingerprint": "2b8fbc1c6d605f47", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-049943c2499327a5", "level": "error", "message": {"text": "Dangling fetch: GET /api/stats/dug (hepapp/static/js/dashboard.js:929)"}, "properties": {"repobilityId": "b2401ac2ceb6051d", "scanner": "scanner-primary", "fingerprint": "049943c2499327a5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-26315f7fdd3816d6", "level": "error", "message": {"text": "Dangling fetch: GET /api/postavke (hepapp/static/js/dashboard.js:1087)"}, "properties": {"repobilityId": "a541940e48cc4ca3", "scanner": "scanner-primary", "fingerprint": "26315f7fdd3816d6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2aac122d13ce4280", "level": "error", "message": {"text": "Dangling fetch: GET /api/postavke/status (hepapp/static/js/dashboard.js:1108)"}, "properties": {"repobilityId": "0f8637fd3365381d", "scanner": "scanner-primary", "fingerprint": "2aac122d13ce4280", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b9a34028a24eb88c", "level": "error", "message": {"text": "Dangling fetch: POST /api/postavke (hepapp/static/js/dashboard.js:1156)"}, "properties": {"repobilityId": "9567f43f81ae7a2b", "scanner": "scanner-primary", "fingerprint": "b9a34028a24eb88c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2b925eb8c424be94", "level": "error", "message": {"text": "Dangling fetch: GET /api/postavke/korisnici (hepapp/static/js/dashboard.js:1192)"}, "properties": {"repobilityId": "9f7c37a252e0d41d", "scanner": "scanner-primary", "fingerprint": "2b925eb8c424be94", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f207e3d2f5edc90a", "level": "error", "message": {"text": "Dangling fetch: POST /api/postavke/korisnici (hepapp/static/js/dashboard.js:1216)"}, "properties": {"repobilityId": "6c2cb62d50bcfc46", "scanner": "scanner-primary", "fingerprint": "f207e3d2f5edc90a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-95de794551c7c9a9", "level": "error", "message": {"text": "Dangling fetch: POST /api/postavke/backup/auto (hepapp/static/js/dashboard.js:1229)"}, "properties": {"repobilityId": "e80c7383262eb37b", "scanner": "scanner-primary", "fingerprint": "95de794551c7c9a9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-65ecdcbe77d4df43", "level": "error", "message": {"text": "Dangling fetch: GET /api/stats/procjena-trenutni (hepapp/static/js/dashboard.js:1328)"}, "properties": {"repobilityId": "607300eadec4a48c", "scanner": "scanner-primary", "fingerprint": "65ecdcbe77d4df43", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-07ff64d5d18dca27", "level": "error", "message": {"text": "Dangling fetch: GET /api/stats/cijene (hepapp/static/js/dashboard.js:1399)"}, "properties": {"repobilityId": "86026f7f3030c0b4", "scanner": "scanner-primary", "fingerprint": "07ff64d5d18dca27", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0c37731802d82cd6", "level": "error", "message": {"text": "Dangling fetch: GET /api/stats/weather (hepapp/static/js/dashboard.js:1443)"}, "properties": {"repobilityId": "8989f970d42366c8", "scanner": "scanner-primary", "fingerprint": "0c37731802d82cd6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b3fe3a6e582d73ab", "level": "error", "message": {"text": "Dangling fetch: GET /api/stats/power-limit-history (hepapp/static/js/dashboard.js:1592)"}, "properties": {"repobilityId": "d9bacb29637807e1", "scanner": "scanner-primary", "fingerprint": "b3fe3a6e582d73ab", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cdb02ee2f16769d5", "level": "error", "message": {"text": "Dangling fetch: GET /api/stats/plant-info (hepapp/static/js/dashboard.js:1621)"}, "properties": {"repobilityId": "d25cdb9889b4c0ef", "scanner": "scanner-primary", "fingerprint": "cdb02ee2f16769d5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a187e60816daa9bd", "level": "error", "message": {"text": "Dangling fetch: GET /api/stats/peak-snaga (hepapp/static/js/dashboard.js:1649)"}, "properties": {"repobilityId": "b56161e8ddb27dfc", "scanner": "scanner-primary", "fingerprint": "a187e60816daa9bd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5f0021a514163cdd", "level": "error", "message": {"text": "Dangling fetch: GET /api/postavke/mjerno-mjesto (hepapp/static/js/dashboard.js:1670)"}, "properties": {"repobilityId": "ea78db7d11dc4eb6", "scanner": "scanner-primary", "fingerprint": "5f0021a514163cdd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-30d56518ac266fa9", "level": "error", "message": {"text": "Dangling fetch: GET /api/stats/vt-nt-trosak (hepapp/static/js/dashboard.js:1698)"}, "properties": {"repobilityId": "e490011a4b5febaf", "scanner": "scanner-primary", "fingerprint": "30d56518ac266fa9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c9e449c3b9e73b73", "level": "note", "message": {"text": "Unused endpoint: ANY /logout"}, "properties": {"repobilityId": "2e6c94b9c034994c", "scanner": "scanner-primary", "fingerprint": "c9e449c3b9e73b73", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4719f054af571f9b", "level": "note", "message": {"text": "Unused endpoint: ANY /data"}, "properties": {"repobilityId": "42e95e46ce0f4ea8", "scanner": "scanner-primary", "fingerprint": "4719f054af571f9b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-60a190ef2a71df78", "level": "note", "message": {"text": "Unused endpoint: ANY /data/sve"}, "properties": {"repobilityId": "9e17beb2a603d875", "scanner": "scanner-primary", "fingerprint": "60a190ef2a71df78", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-626dccc05f8ec805", "level": "note", "message": {"text": "Unused endpoint: ANY /povijest"}, "properties": {"repobilityId": "5bb96e96617c840f", "scanner": "scanner-primary", "fingerprint": "626dccc05f8ec805", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1a6d91f2236825bf", "level": "note", "message": {"text": "Unused endpoint: ANY /"}, "properties": {"repobilityId": "4b68a013b2dc77af", "scanner": "scanner-primary", "fingerprint": "1a6d91f2236825bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b3e0a84fdd04c31a", "level": "note", "message": {"text": "Unused endpoint: ANY /mjerno-mjesto"}, "properties": {"repobilityId": "476cb1658eb8f737", "scanner": "scanner-primary", "fingerprint": "b3e0a84fdd04c31a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5621b25643c2a309", "level": "note", "message": {"text": "Unused endpoint: ANY /korisnici"}, "properties": {"repobilityId": "f6d45a0cc7e6b22f", "scanner": "scanner-primary", "fingerprint": "5621b25643c2a309", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-434f82e519486cbc", "level": "note", "message": {"text": "Unused endpoint: ANY /backup"}, "properties": {"repobilityId": "d077779ccfc927f8", "scanner": "scanner-primary", "fingerprint": "434f82e519486cbc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d897d74da55e3210", "level": "note", "message": {"text": "Unused endpoint: ANY /backup/auto"}, "properties": {"repobilityId": "d0d7178b55a0d0cf", "scanner": "scanner-primary", "fingerprint": "d897d74da55e3210", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f4b071827067f2b2", "level": "note", "message": {"text": "Unused endpoint: ANY /usporedba"}, "properties": {"repobilityId": "e590edc8821affda", "scanner": "scanner-primary", "fingerprint": "f4b071827067f2b2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c9477d664dcb3c0a", "level": "note", "message": {"text": "Unused endpoint: ANY /registri"}, "properties": {"repobilityId": "42db7cdf5572a514", "scanner": "scanner-primary", "fingerprint": "c9477d664dcb3c0a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0dc0734894c91c3a", "level": "note", "message": {"text": "Unused endpoint: ANY /dug"}, "properties": {"repobilityId": "3f10b662e89f99d5", "scanner": "scanner-primary", "fingerprint": "0dc0734894c91c3a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-da2d763044b6c652", "level": "note", "message": {"text": "Unused endpoint: ANY /optimalno"}, "properties": {"repobilityId": "4e96123e197820be", "scanner": "scanner-primary", "fingerprint": "da2d763044b6c652", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-094e0b5ca7a27d55", "level": "note", "message": {"text": "Unused endpoint: ANY /mjesecni"}, "properties": {"repobilityId": "3ad9f1aedc6912d8", "scanner": "scanner-primary", "fingerprint": "094e0b5ca7a27d55", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-adfc78bc336b1817", "level": "note", "message": {"text": "Unused endpoint: ANY /procjena-trenutni"}, "properties": {"repobilityId": "d7e7d18c6f3c543e", "scanner": "scanner-primary", "fingerprint": "adfc78bc336b1817", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-70b77488d5139f24", "level": "note", "message": {"text": "Unused endpoint: ANY /cijene"}, "properties": {"repobilityId": "f7d38fb542ad1497", "scanner": "scanner-primary", "fingerprint": "70b77488d5139f24", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-34db04930f20fd0f", "level": "note", "message": {"text": "Unused endpoint: ANY /weather"}, "properties": {"repobilityId": "c1603bd4cf75262f", "scanner": "scanner-primary", "fingerprint": "34db04930f20fd0f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d5940f0fc9dd5459", "level": "note", "message": {"text": "Unused endpoint: ANY /power-limit-history"}, "properties": {"repobilityId": "c13405674923f95b", "scanner": "scanner-primary", "fingerprint": "d5940f0fc9dd5459", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ef2f9f255c799379", "level": "note", "message": {"text": "Unused endpoint: ANY /plant-info"}, "properties": {"repobilityId": "b53b0032567902e7", "scanner": "scanner-primary", "fingerprint": "ef2f9f255c799379", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7027ce66f2ca19aa", "level": "note", "message": {"text": "Unused endpoint: ANY /peak-snaga"}, "properties": {"repobilityId": "38c36ea78cf4634d", "scanner": "scanner-primary", "fingerprint": "7027ce66f2ca19aa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7f87fffdfb78f129", "level": "note", "message": {"text": "Unused endpoint: ANY /vt-nt-trosak"}, "properties": {"repobilityId": "ebc3498cc7d2096a", "scanner": "scanner-primary", "fingerprint": "7f87fffdfb78f129", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d2865ff10ccd6747", "level": "note", "message": {"text": "Unused endpoint: ANY /vt-kalibracija"}, "properties": {"repobilityId": "16303fa7977c98f1", "scanner": "scanner-primary", "fingerprint": "d2865ff10ccd6747", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-27a2f853c4fec12e", "level": "note", "message": {"text": "Unused endpoint: ANY /tarifa"}, "properties": {"repobilityId": "c8b2a04f54882ebc", "scanner": "scanner-primary", "fingerprint": "27a2f853c4fec12e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-68417b718af73637", "level": "note", "message": {"text": "Unused endpoint: ANY /import-hep"}, "properties": {"repobilityId": "76072309c9a21435", "scanner": "scanner-primary", "fingerprint": "68417b718af73637", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-283f21cee366ba32", "level": "note", "message": {"text": "Unused endpoint: ANY /import-sma"}, "properties": {"repobilityId": "6d1d95f6499a84f7", "scanner": "scanner-primary", "fingerprint": "283f21cee366ba32", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-38f539b9cc05f9e4", "level": "note", "message": {"text": "Unused endpoint: ANY /sync-ha"}, "properties": {"repobilityId": "5f777dbaa7db229c", "scanner": "scanner-primary", "fingerprint": "38f539b9cc05f9e4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-44c7d3a14d8d8103", "level": "note", "message": {"text": "Unused endpoint: ANY /setup"}, "properties": {"repobilityId": "36bfd6e583053918", "scanner": "scanner-primary", "fingerprint": "44c7d3a14d8d8103", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d760919b254d805", "level": "note", "message": {"text": "Unused endpoint: ANY /api/setup/complete"}, "properties": {"repobilityId": "5a549ee42e7e660b", "scanner": "scanner-primary", "fingerprint": "8d760919b254d805", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}