{"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-0680a9c37c45250a", "name": "Stray `console.log` in TS/JS \u2014 unide-frontend/print-agent/index.js:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 unide-frontend/print-agent/index.js:24"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-287dd2ddf1f161ff", "name": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/server.js:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/server.js:62"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eed9747af2cdfa60", "name": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/scripts/apply-tax-suggestions.js:100", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/scripts/apply-tax-suggestions.js:100"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-462aa918284fa9c1", "name": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/scripts/fiskaly-setup.js:63", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/scripts/fiskaly-setup.js:63"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d1593cb4e760d42f", "name": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/scripts/fiskaly-payload-check.js:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/scripts/fiskaly-payload-check.js:21"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c2e20fd851d649fa", "name": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/scripts/fiskaly-smoke.js:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/scripts/fiskaly-smoke.js:66"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0cec21b8e49dd402", "name": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/services/fiskaly.js:383", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/services/fiskaly.js:383"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fbd4425c39c361e7", "name": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/services/email.js:409", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/services/email.js:409"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-60d29f9b626b2d5c", "name": "TODO/FIXME marker in shipping code \u2014 unide-frontend/src/App.jsx:61", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 unide-frontend/src/App.jsx:61"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e837139afa639f8b", "name": "`truncate` class without `title=` for hover reveal \u2014 unide-frontend/src/Admin.jsx:2131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 unide-frontend/src/Admin.jsx:2131"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d585dbe47ba141cc", "name": "Stray `console.log` in TS/JS \u2014 unide-frontend/src/api/client.js:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 unide-frontend/src/api/client.js:21"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-20e16f7fe0b36327", "name": "`truncate` class without `title=` for hover reveal \u2014 unide-frontend/src/components/EanIvaScanner.jsx:224", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 unide-frontend/src/components/EanIvaScanner.jsx:224"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-398359a82aa4d2da", "name": "Runtime dotenv file present in repo: unide-frontend/.env", "shortDescription": {"text": "Runtime dotenv file present in repo: unide-frontend/.env"}, "fullDescription": {"text": "`unide-frontend/.env` looks like a runtime dotenv file. It contains secret-looking assignments for VITE_SUPABASE_ANON_KEY. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-2276089ee712deb2", "name": "Insecure pattern 'node_child_process' in unide-frontend/print-agent/lib/printer.js:12", "shortDescription": {"text": "Insecure pattern 'node_child_process' in unide-frontend/print-agent/lib/printer.js:12"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c56b3bd5f1d61c02", "name": "Insecure pattern 'local_storage_auth_token' in unide-frontend/src/App.jsx:3656", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in unide-frontend/src/App.jsx:3656"}, "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-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-node@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4e69a33a95769c57", "name": "Very large file: unide-frontend/backend/server.js (3256 lines)", "shortDescription": {"text": "Very large file: unide-frontend/backend/server.js (3256 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-d45f02f45a074b81", "name": "Very large file: unide-frontend/src/App.jsx (4038 lines)", "shortDescription": {"text": "Very large file: unide-frontend/src/App.jsx (4038 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-fc51ed3ba7178a04", "name": "Very large file: unide-frontend/src/Admin.jsx (4303 lines)", "shortDescription": {"text": "Very large file: unide-frontend/src/Admin.jsx (4303 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-2454cefe4615a727", "name": "Very large file: unide-frontend/src/pages/legal/TerminosCondiciones.jsx (990 lines)", "shortDescription": {"text": "Very large file: unide-frontend/src/pages/legal/TerminosCondiciones.jsx (990 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-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 50 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 87 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 49 placeholder/mock markers across 6 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-11825279136b53a3", "name": "CI is configured but no tests are detected", "shortDescription": {"text": "CI is configured but no tests are detected"}, "fullDescription": {"text": "A CI pipeline exists, but the scan found no test files to gate. Opus labeled this generated-code pattern as config theater: release machinery exists, but it has little behavioral signal."}, "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, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "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-04614e30b149da5a", "name": "Commented-code block (8 lines) in unide-frontend/vite.config.js:4", "shortDescription": {"text": "Commented-code block (8 lines) in unide-frontend/vite.config.js:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ad709a481ae32332", "name": "Commented-code block (7 lines) in unide-frontend/print-agent/index.js:1", "shortDescription": {"text": "Commented-code block (7 lines) in unide-frontend/print-agent/index.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-18abe3b93e5e0bc0", "name": "Commented-code block (6 lines) in unide-frontend/print-agent/lib/escpos.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in unide-frontend/print-agent/lib/escpos.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5f14ef140012630c", "name": "Commented-code block (9 lines) in unide-frontend/print-agent/lib/store.js:1", "shortDescription": {"text": "Commented-code block (9 lines) in unide-frontend/print-agent/lib/store.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-35838233fadfc025", "name": "Commented-code block (6 lines) in unide-frontend/print-agent/lib/config.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in unide-frontend/print-agent/lib/config.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d921ce4a3e4beb2b", "name": "Commented-code block (7 lines) in unide-frontend/print-agent/lib/printer.js:1", "shortDescription": {"text": "Commented-code block (7 lines) in unide-frontend/print-agent/lib/printer.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3533c32561b6a8b8", "name": "Commented-code block (5 lines) in unide-frontend/print-agent/lib/api.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in unide-frontend/print-agent/lib/api.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-de560a8a745ce449", "name": "`fetch()` without try/.catch or AbortSignal \u2014 unide-frontend/print-agent/lib/api.js:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 unide-frontend/print-agent/lib/api.js:29"}, "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-d0fd4a341a77e0cd", "name": "Commented-code block (5 lines) in unide-frontend/backend/server.js:19", "shortDescription": {"text": "Commented-code block (5 lines) in unide-frontend/backend/server.js: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-cdf430a625b6e7ab", "name": "`fetch()` without try/.catch or AbortSignal \u2014 unide-frontend/backend/server.js:597", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 unide-frontend/backend/server.js:597"}, "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-5b65a972685d72eb", "name": "Commented-code block (5 lines) in unide-frontend/backend/scripts/apply-tax-suggestions.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in unide-frontend/backend/scripts/apply-tax-suggestions.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-55d34ec6b6280dbe", "name": "Commented-code block (9 lines) in unide-frontend/backend/scripts/fiskaly-setup.js:1", "shortDescription": {"text": "Commented-code block (9 lines) in unide-frontend/backend/scripts/fiskaly-setup.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c5d5547ec8311379", "name": "Commented-code block (10 lines) in unide-frontend/backend/scripts/fiskaly-payload-check.js:1", "shortDescription": {"text": "Commented-code block (10 lines) in unide-frontend/backend/scripts/fiskaly-payload-check.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2d713e83d9c2bb21", "name": "Commented-code block (6 lines) in unide-frontend/backend/scripts/fiskaly-smoke.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in unide-frontend/backend/scripts/fiskaly-smoke.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-db268604cfc88b94", "name": "Commented-code block (7 lines) in unide-frontend/backend/services/fiskaly.js:1", "shortDescription": {"text": "Commented-code block (7 lines) in unide-frontend/backend/services/fiskaly.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6d215014db3eec08", "name": "`fetch()` without try/.catch or AbortSignal \u2014 unide-frontend/backend/services/fiskaly.js:119", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 unide-frontend/backend/services/fiskaly.js:119"}, "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-2991e71700bc3e77", "name": "Commented-code block (8 lines) in unide-frontend/backend/services/email.js:1", "shortDescription": {"text": "Commented-code block (8 lines) in unide-frontend/backend/services/email.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-16ef876b39322cfb", "name": "Commented-code block (6 lines) in unide-frontend/backend/services/coupons.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in unide-frontend/backend/services/coupons.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2a64c3bb6a3f4b87", "name": "Commented-code block (5 lines) in unide-frontend/backend/services/invoicing.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in unide-frontend/backend/services/invoicing.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9cb25f36988a8155", "name": "Commented-code block (7 lines) in unide-frontend/backend/services/stripe.js:1", "shortDescription": {"text": "Commented-code block (7 lines) in unide-frontend/backend/services/stripe.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3c4f5f5f6c6c9237", "name": "Commented-code block (5 lines) in unide-frontend/src/App.jsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in unide-frontend/src/App.jsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5a17bae5ef6823cb", "name": "Commented-code block (14 lines) in unide-frontend/src/Admin.jsx:371", "shortDescription": {"text": "Commented-code block (14 lines) in unide-frontend/src/Admin.jsx:371"}, "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-22d0fa45851d870c", "name": "Commented-code block (11 lines) in unide-frontend/src/supabaseClient.js:7", "shortDescription": {"text": "Commented-code block (11 lines) in unide-frontend/src/supabaseClient.js:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e8ce3080e825b911", "name": "`fetch()` without try/.catch or AbortSignal \u2014 unide-frontend/src/supabaseClient.js:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 unide-frontend/src/supabaseClient.js:54"}, "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-d36fbb5998f48131", "name": "Commented-code block (9 lines) in unide-frontend/src/Login.jsx:48", "shortDescription": {"text": "Commented-code block (9 lines) in unide-frontend/src/Login.jsx:48"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f072552ebd26034e", "name": "Commented-code block (10 lines) in unide-frontend/src/main.jsx:12", "shortDescription": {"text": "Commented-code block (10 lines) in unide-frontend/src/main.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-b478aaf6cd482c41", "name": "Commented-code block (7 lines) in unide-frontend/src/config/legal.js:1", "shortDescription": {"text": "Commented-code block (7 lines) in unide-frontend/src/config/legal.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a108d361fe0b1c01", "name": "Commented-code block (9 lines) in unide-frontend/src/config/company.js:1", "shortDescription": {"text": "Commented-code block (9 lines) in unide-frontend/src/config/company.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-53a8b9f8ce45e93c", "name": "Commented-code block (5 lines) in unide-frontend/src/api/client.js:94", "shortDescription": {"text": "Commented-code block (5 lines) in unide-frontend/src/api/client.js:94"}, "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-787f1d8be6caa029", "name": "`fetch()` without try/.catch or AbortSignal \u2014 unide-frontend/src/api/client.js:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 unide-frontend/src/api/client.js:26"}, "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-f0b854ab00a40676", "name": "Commented-code block (9 lines) in unide-frontend/src/utils/orderDocuments.js:1", "shortDescription": {"text": "Commented-code block (9 lines) in unide-frontend/src/utils/orderDocuments.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-baaca63063e73bfd", "name": "Commented-code block (6 lines) in unide-frontend/src/utils/termsAcceptance.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in unide-frontend/src/utils/termsAcceptance.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1e3d2d662c8f08a9", "name": "Commented-code block (11 lines) in unide-frontend/src/utils/analytics.js:1", "shortDescription": {"text": "Commented-code block (11 lines) in unide-frontend/src/utils/analytics.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9c3c3d47bc1a4fe2", "name": "Commented-code block (9 lines) in unide-frontend/src/components/AddressAutocomplete.jsx:3", "shortDescription": {"text": "Commented-code block (9 lines) in unide-frontend/src/components/AddressAutocomplete.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-447bd05132060c7b", "name": "Commented-code block (8 lines) in unide-frontend/src/components/TurnstileGate.jsx:1", "shortDescription": {"text": "Commented-code block (8 lines) in unide-frontend/src/components/TurnstileGate.jsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7c7a4644543ec606", "name": "Commented-code block (5 lines) in unide-frontend/src/components/IvaLookup.jsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in unide-frontend/src/components/IvaLookup.jsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fe7340dc7e691dd5", "name": "Commented-code block (6 lines) in unide-frontend/src/components/EanIvaScanner.jsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in unide-frontend/src/components/EanIvaScanner.jsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9e6c912cb30143cc", "name": "Commented-code block (6 lines) in unide-frontend/src/components/CookieConsent.jsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in unide-frontend/src/components/CookieConsent.jsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8abe2e0d8324a96e", "name": "Commented-code block (8 lines) in unide-frontend/src/pages/NotFound.jsx:1", "shortDescription": {"text": "Commented-code block (8 lines) in unide-frontend/src/pages/NotFound.jsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f96225fed8632875", "name": "Commented-code block (5 lines) in unide-frontend/src/pages/legal/PoliticaPrivacidad.jsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in unide-frontend/src/pages/legal/PoliticaPrivacidad.jsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-15a8dd5e7059760f", "name": "Commented-code block (8 lines) in unide-frontend/src/pages/legal/PoliticaEnvios.jsx:1", "shortDescription": {"text": "Commented-code block (8 lines) in unide-frontend/src/pages/legal/PoliticaEnvios.jsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-756ea11e93cda0db", "name": "Commented-code block (6 lines) in unide-frontend/src/pages/legal/TerminosCondiciones.jsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in unide-frontend/src/pages/legal/TerminosCondiciones.jsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-389730af40b48881", "name": "Commented-code block (8 lines) in unide-frontend/src/pages/legal/PoliticaDevoluciones.jsx:1", "shortDescription": {"text": "Commented-code block (8 lines) in unide-frontend/src/pages/legal/PoliticaDevoluciones.jsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ca6f113e3bed2ef6", "name": "Commented-code block (9 lines) in unide-frontend/src/pages/legal/AvisoLegal.jsx:1", "shortDescription": {"text": "Commented-code block (9 lines) in unide-frontend/src/pages/legal/AvisoLegal.jsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d4d56fb67011488d", "name": "Commented-code block (8 lines) in unide-frontend/src/pages/legal/PoliticaCookies.jsx:1", "shortDescription": {"text": "Commented-code block (8 lines) in unide-frontend/src/pages/legal/PoliticaCookies.jsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c2449f46e559ad94", "name": "Commented-code block (7 lines) in unide-frontend/src/pages/legal/_components.jsx:1", "shortDescription": {"text": "Commented-code block (7 lines) in unide-frontend/src/pages/legal/_components.jsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9f79669449ea6042", "name": "Commented-code block (5 lines) in unide-frontend/src/hooks/useNewOrdersAlert.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in unide-frontend/src/hooks/useNewOrdersAlert.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6ad7212e05ff2a98", "name": "Commented-code block (6 lines) in unide-frontend/src/hooks/useCookieConsent.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in unide-frontend/src/hooks/useCookieConsent.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9996447513897762", "name": "30 env vars used in code but missing from .env.example", "shortDescription": {"text": "30 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ADMIN_EMAILS`, `AUTO_PRINT_ENABLED`, `FISKALY_API_KEY`, `FISKALY_API_SECRET`, `FISKALY_BASE_URL`, `FISKALY_CLIENT_ID`, `FISKALY_SERIES_PREFIX`, `FRONTEND_URL` + 22 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-ef310c0c2bf2a378", "name": "Frontend route `/repair` has no Link/navigate to it \u2014 unide-frontend/src/main.jsx", "shortDescription": {"text": "Frontend route `/repair` has no Link/navigate to it \u2014 unide-frontend/src/main.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-83322ca41b545fc6", "name": "Frontend route `/admin` has no Link/navigate to it \u2014 unide-frontend/src/main.jsx", "shortDescription": {"text": "Frontend route `/admin` has no Link/navigate to it \u2014 unide-frontend/src/main.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0511016c3fd62634", "name": "Dangling fetch: POST https://removebgapi.com/api/v1/remove (unide-frontend/backend/server.js:2899)", "shortDescription": {"text": "Dangling fetch: POST https://removebgapi.com/api/v1/remove (unide-frontend/backend/server.js:2899)"}, "fullDescription": {"text": "`unide-frontend/backend/server.js:2899` calls `POST https://removebgapi.com/api/v1/remove` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/removebgapi.com/api/v1/remove`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d92303fa2184d0d1", "name": "Dangling fetch: POST https://api.remove.bg/v1.0/removebg (unide-frontend/backend/server.js:2912)", "shortDescription": {"text": "Dangling fetch: POST https://api.remove.bg/v1.0/removebg (unide-frontend/backend/server.js:2912)"}, "fullDescription": {"text": "`unide-frontend/backend/server.js:2912` calls `POST https://api.remove.bg/v1.0/removebg` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.remove.bg/v1.0/removebg`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3737e43d09bb7a54", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (unide-frontend/backend/server.js:3000)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (unide-frontend/backend/server.js:3000)"}, "fullDescription": {"text": "`unide-frontend/backend/server.js:3000` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-23298951eb182434", "name": "Dangling fetch: GET /tax-suggestions/product-tax-suggestions.json (unide-frontend/src/Admin.jsx:342)", "shortDescription": {"text": "Dangling fetch: GET /tax-suggestions/product-tax-suggestions.json (unide-frontend/src/Admin.jsx:342)"}, "fullDescription": {"text": "`unide-frontend/src/Admin.jsx:342` calls `GET /tax-suggestions/product-tax-suggestions.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tax-suggestions/product-tax-suggestions.json`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-022923001f9e97f8", "name": "Dangling fetch: GET /unide-iva.json (unide-frontend/src/components/IvaLookup.jsx:63)", "shortDescription": {"text": "Dangling fetch: GET /unide-iva.json (unide-frontend/src/components/IvaLookup.jsx:63)"}, "fullDescription": {"text": "`unide-frontend/src/components/IvaLookup.jsx:63` calls `GET /unide-iva.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/unide-iva.json`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-53eca9056f072f7f", "name": "Dangling fetch: GET /unide-iva.json (unide-frontend/src/components/EanIvaScanner.jsx:21)", "shortDescription": {"text": "Dangling fetch: GET /unide-iva.json (unide-frontend/src/components/EanIvaScanner.jsx:21)"}, "fullDescription": {"text": "`unide-frontend/src/components/EanIvaScanner.jsx:21` calls `GET /unide-iva.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/unide-iva.json`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-76f7964d6c782e43", "name": "Unused endpoint: POST /api/stripe/webhook", "shortDescription": {"text": "Unused endpoint: POST /api/stripe/webhook"}, "fullDescription": {"text": "`unide-frontend/backend/server.js` declares `POST /api/stripe/webhook` 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-76889df7c8e240c5", "name": "Unused endpoint: USE /api/", "shortDescription": {"text": "Unused endpoint: USE /api/"}, "fullDescription": {"text": "`unide-frontend/backend/server.js` declares `USE /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-b695a5b67fb4fb96", "name": "Unused endpoint: GET /api/products", "shortDescription": {"text": "Unused endpoint: GET /api/products"}, "fullDescription": {"text": "`unide-frontend/backend/server.js` declares `GET /api/products` 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-5926c673ce6a1271", "name": "Unused endpoint: GET /api/categories", "shortDescription": {"text": "Unused endpoint: GET /api/categories"}, "fullDescription": {"text": "`unide-frontend/backend/server.js` declares `GET /api/categories` 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-77c0dfc2523e55b6", "name": "Unused endpoint: GET /api/sub-categories", "shortDescription": {"text": "Unused endpoint: GET /api/sub-categories"}, "fullDescription": {"text": "`unide-frontend/backend/server.js` declares `GET /api/sub-categories` 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-95c0ba0782d9674d", "name": "Unused endpoint: GET /api/repair-services", "shortDescription": {"text": "Unused endpoint: GET /api/repair-services"}, "fullDescription": {"text": "`unide-frontend/backend/server.js` declares `GET /api/repair-services` 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-2a87296ec7af6c76", "name": "Unused endpoint: GET /api/orders/:orderId", "shortDescription": {"text": "Unused endpoint: GET /api/orders/:orderId"}, "fullDescription": {"text": "`unide-frontend/backend/server.js` declares `GET /api/orders/:orderId` 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-90f103fde9ecaee4", "name": "Unused endpoint: GET /api/print/pending", "shortDescription": {"text": "Unused endpoint: GET /api/print/pending"}, "fullDescription": {"text": "`unide-frontend/backend/server.js` declares `GET /api/print/pending` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-31d13cecaaf64276", "name": "Unused endpoint: POST /api/print/mark", "shortDescription": {"text": "Unused endpoint: POST /api/print/mark"}, "fullDescription": {"text": "`unide-frontend/backend/server.js` declares `POST /api/print/mark` 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-c98684eed7f587f4", "name": "Unused endpoint: POST /api/admin/orders/:id/invoice", "shortDescription": {"text": "Unused endpoint: POST /api/admin/orders/:id/invoice"}, "fullDescription": {"text": "`unide-frontend/backend/server.js` declares `POST /api/admin/orders/:id/invoice` 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": "`unide-frontend/backend/server.js` 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}}]}}, "automationDetails": {"id": "repobility/23236"}, "properties": {"repository": "yinghaoqing07-hash/hipera-shop", "repoUrl": "https://github.com/yinghaoqing07-hash/hipera-shop", "branch": "main"}, "results": [{"ruleId": "scanner-0680a9c37c45250a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 unide-frontend/print-agent/index.js:24"}, "properties": {"repobilityId": "4531fe327cfc5522", "scanner": "scanner-primary", "fingerprint": "0680a9c37c45250a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-287dd2ddf1f161ff", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/server.js:62"}, "properties": {"repobilityId": "379a3a388d21773e", "scanner": "scanner-primary", "fingerprint": "287dd2ddf1f161ff", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eed9747af2cdfa60", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/scripts/apply-tax-suggestions.js:100"}, "properties": {"repobilityId": "73ab3b48b4a7106f", "scanner": "scanner-primary", "fingerprint": "eed9747af2cdfa60", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-462aa918284fa9c1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/scripts/fiskaly-setup.js:63"}, "properties": {"repobilityId": "bcb6d372a8cad2b8", "scanner": "scanner-primary", "fingerprint": "462aa918284fa9c1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d1593cb4e760d42f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/scripts/fiskaly-payload-check.js:21"}, "properties": {"repobilityId": "bcc046d155a32fe1", "scanner": "scanner-primary", "fingerprint": "d1593cb4e760d42f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c2e20fd851d649fa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/scripts/fiskaly-smoke.js:66"}, "properties": {"repobilityId": "99af298d0f77f8a6", "scanner": "scanner-primary", "fingerprint": "c2e20fd851d649fa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0cec21b8e49dd402", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/services/fiskaly.js:383"}, "properties": {"repobilityId": "ba1b22e7b97a2ae1", "scanner": "scanner-primary", "fingerprint": "0cec21b8e49dd402", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fbd4425c39c361e7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 unide-frontend/backend/services/email.js:409"}, "properties": {"repobilityId": "d0c7a2a958ff4684", "scanner": "scanner-primary", "fingerprint": "fbd4425c39c361e7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-60d29f9b626b2d5c", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 unide-frontend/src/App.jsx:61"}, "properties": {"repobilityId": "ba696b161e7a21c1", "scanner": "scanner-primary", "fingerprint": "60d29f9b626b2d5c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-e837139afa639f8b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 unide-frontend/src/Admin.jsx:2131"}, "properties": {"repobilityId": "2d472e296bdbc90a", "scanner": "scanner-primary", "fingerprint": "e837139afa639f8b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d585dbe47ba141cc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 unide-frontend/src/api/client.js:21"}, "properties": {"repobilityId": "cd9b8715ec9df0e3", "scanner": "scanner-primary", "fingerprint": "d585dbe47ba141cc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-20e16f7fe0b36327", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 unide-frontend/src/components/EanIvaScanner.jsx:224"}, "properties": {"repobilityId": "e34c4bfcb097d3be", "scanner": "scanner-primary", "fingerprint": "20e16f7fe0b36327", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-398359a82aa4d2da", "level": "error", "message": {"text": "Runtime dotenv file present in repo: unide-frontend/.env"}, "properties": {"repobilityId": "7a4a567d2af664e4", "scanner": "scanner-primary", "fingerprint": "398359a82aa4d2da", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env", "env_file_with_secret"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "unide-frontend/.env"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2276089ee712deb2", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in unide-frontend/print-agent/lib/printer.js:12"}, "properties": {"repobilityId": "938fdbe9e8f08ff7", "scanner": "scanner-primary", "fingerprint": "2276089ee712deb2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "unide-frontend/print-agent/lib/printer.js"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-c56b3bd5f1d61c02", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in unide-frontend/src/App.jsx:3656"}, "properties": {"repobilityId": "bb16cf191e03e6f5", "scanner": "scanner-primary", "fingerprint": "c56b3bd5f1d61c02", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "unide-frontend/src/App.jsx"}, "region": {"startLine": 3656}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-4e69a33a95769c57", "level": "note", "message": {"text": "Very large file: unide-frontend/backend/server.js (3256 lines)"}, "properties": {"repobilityId": "aaed3961da507ba9", "scanner": "scanner-primary", "fingerprint": "4e69a33a95769c57", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d45f02f45a074b81", "level": "note", "message": {"text": "Very large file: unide-frontend/src/App.jsx (4038 lines)"}, "properties": {"repobilityId": "3e1ee30ca86bfda2", "scanner": "scanner-primary", "fingerprint": "d45f02f45a074b81", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fc51ed3ba7178a04", "level": "note", "message": {"text": "Very large file: unide-frontend/src/Admin.jsx (4303 lines)"}, "properties": {"repobilityId": "e4342f6039b6b591", "scanner": "scanner-primary", "fingerprint": "fc51ed3ba7178a04", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2454cefe4615a727", "level": "note", "message": {"text": "Very large file: unide-frontend/src/pages/legal/TerminosCondiciones.jsx (990 lines)"}, "properties": {"repobilityId": "632756d6f3c4d87c", "scanner": "scanner-primary", "fingerprint": "2454cefe4615a727", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "48f8c5c38a0ca6c5", "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": "8ab4f03db97b0597", "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": "5d00fd3adb8cfbbd", "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": "d2324131d9a12b10", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-11825279136b53a3", "level": "warning", "message": {"text": "CI is configured but no tests are detected"}, "properties": {"repobilityId": "f88873a433524b05", "scanner": "scanner-primary", "fingerprint": "11825279136b53a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "ci", "config-theater", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "f85117efe6d990ca", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "2cdd03e2b76e2fa9", "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": "199086aba2576355", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-04614e30b149da5a", "level": "none", "message": {"text": "Commented-code block (8 lines) in unide-frontend/vite.config.js:4"}, "properties": {"repobilityId": "5307a9c56403784e", "scanner": "scanner-primary", "fingerprint": "04614e30b149da5a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ad709a481ae32332", "level": "none", "message": {"text": "Commented-code block (7 lines) in unide-frontend/print-agent/index.js:1"}, "properties": {"repobilityId": "e9da7529a2b2c167", "scanner": "scanner-primary", "fingerprint": "ad709a481ae32332", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-18abe3b93e5e0bc0", "level": "none", "message": {"text": "Commented-code block (6 lines) in unide-frontend/print-agent/lib/escpos.js:1"}, "properties": {"repobilityId": "40cf8101bb8a8981", "scanner": "scanner-primary", "fingerprint": "18abe3b93e5e0bc0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5f14ef140012630c", "level": "none", "message": {"text": "Commented-code block (9 lines) in unide-frontend/print-agent/lib/store.js:1"}, "properties": {"repobilityId": "5d784571119a395a", "scanner": "scanner-primary", "fingerprint": "5f14ef140012630c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-35838233fadfc025", "level": "none", "message": {"text": "Commented-code block (6 lines) in unide-frontend/print-agent/lib/config.js:1"}, "properties": {"repobilityId": "1faeaadac828b86e", "scanner": "scanner-primary", "fingerprint": "35838233fadfc025", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d921ce4a3e4beb2b", "level": "none", "message": {"text": "Commented-code block (7 lines) in unide-frontend/print-agent/lib/printer.js:1"}, "properties": {"repobilityId": "9b364a8a1fabb9bf", "scanner": "scanner-primary", "fingerprint": "d921ce4a3e4beb2b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3533c32561b6a8b8", "level": "none", "message": {"text": "Commented-code block (5 lines) in unide-frontend/print-agent/lib/api.js:1"}, "properties": {"repobilityId": "c2244b83031e26c8", "scanner": "scanner-primary", "fingerprint": "3533c32561b6a8b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-de560a8a745ce449", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 unide-frontend/print-agent/lib/api.js:29"}, "properties": {"repobilityId": "dab612fecd604e2c", "scanner": "scanner-primary", "fingerprint": "de560a8a745ce449", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d0fd4a341a77e0cd", "level": "none", "message": {"text": "Commented-code block (5 lines) in unide-frontend/backend/server.js:19"}, "properties": {"repobilityId": "78ae87edf6317f8d", "scanner": "scanner-primary", "fingerprint": "d0fd4a341a77e0cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cdf430a625b6e7ab", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 unide-frontend/backend/server.js:597"}, "properties": {"repobilityId": "a9a73b55fe19bf0b", "scanner": "scanner-primary", "fingerprint": "cdf430a625b6e7ab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5b65a972685d72eb", "level": "none", "message": {"text": "Commented-code block (5 lines) in unide-frontend/backend/scripts/apply-tax-suggestions.js:1"}, "properties": {"repobilityId": "ad7b0d0fc6b89c06", "scanner": "scanner-primary", "fingerprint": "5b65a972685d72eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-55d34ec6b6280dbe", "level": "none", "message": {"text": "Commented-code block (9 lines) in unide-frontend/backend/scripts/fiskaly-setup.js:1"}, "properties": {"repobilityId": "fd0a7129ba472c5d", "scanner": "scanner-primary", "fingerprint": "55d34ec6b6280dbe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c5d5547ec8311379", "level": "none", "message": {"text": "Commented-code block (10 lines) in unide-frontend/backend/scripts/fiskaly-payload-check.js:1"}, "properties": {"repobilityId": "3d0f26ed52a8d60c", "scanner": "scanner-primary", "fingerprint": "c5d5547ec8311379", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2d713e83d9c2bb21", "level": "none", "message": {"text": "Commented-code block (6 lines) in unide-frontend/backend/scripts/fiskaly-smoke.js:1"}, "properties": {"repobilityId": "06f02e4d0b22643f", "scanner": "scanner-primary", "fingerprint": "2d713e83d9c2bb21", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-db268604cfc88b94", "level": "none", "message": {"text": "Commented-code block (7 lines) in unide-frontend/backend/services/fiskaly.js:1"}, "properties": {"repobilityId": "8baf6cdbd766ea17", "scanner": "scanner-primary", "fingerprint": "db268604cfc88b94", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6d215014db3eec08", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 unide-frontend/backend/services/fiskaly.js:119"}, "properties": {"repobilityId": "68cfdb7f445ef015", "scanner": "scanner-primary", "fingerprint": "6d215014db3eec08", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2991e71700bc3e77", "level": "none", "message": {"text": "Commented-code block (8 lines) in unide-frontend/backend/services/email.js:1"}, "properties": {"repobilityId": "cded3af42805ad5f", "scanner": "scanner-primary", "fingerprint": "2991e71700bc3e77", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-16ef876b39322cfb", "level": "none", "message": {"text": "Commented-code block (6 lines) in unide-frontend/backend/services/coupons.js:1"}, "properties": {"repobilityId": "9b400f103a79750f", "scanner": "scanner-primary", "fingerprint": "16ef876b39322cfb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2a64c3bb6a3f4b87", "level": "none", "message": {"text": "Commented-code block (5 lines) in unide-frontend/backend/services/invoicing.js:1"}, "properties": {"repobilityId": "fc04892992d105bd", "scanner": "scanner-primary", "fingerprint": "2a64c3bb6a3f4b87", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9cb25f36988a8155", "level": "none", "message": {"text": "Commented-code block (7 lines) in unide-frontend/backend/services/stripe.js:1"}, "properties": {"repobilityId": "d3b7a848d31f5af4", "scanner": "scanner-primary", "fingerprint": "9cb25f36988a8155", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3c4f5f5f6c6c9237", "level": "none", "message": {"text": "Commented-code block (5 lines) in unide-frontend/src/App.jsx:1"}, "properties": {"repobilityId": "a7a01a0ece997c34", "scanner": "scanner-primary", "fingerprint": "3c4f5f5f6c6c9237", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5a17bae5ef6823cb", "level": "none", "message": {"text": "Commented-code block (14 lines) in unide-frontend/src/Admin.jsx:371"}, "properties": {"repobilityId": "c9f7cc2b9382fd9d", "scanner": "scanner-primary", "fingerprint": "5a17bae5ef6823cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-22d0fa45851d870c", "level": "none", "message": {"text": "Commented-code block (11 lines) in unide-frontend/src/supabaseClient.js:7"}, "properties": {"repobilityId": "bcdffe71105fa0b2", "scanner": "scanner-primary", "fingerprint": "22d0fa45851d870c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e8ce3080e825b911", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 unide-frontend/src/supabaseClient.js:54"}, "properties": {"repobilityId": "bee18d69a717cce4", "scanner": "scanner-primary", "fingerprint": "e8ce3080e825b911", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d36fbb5998f48131", "level": "none", "message": {"text": "Commented-code block (9 lines) in unide-frontend/src/Login.jsx:48"}, "properties": {"repobilityId": "af4db68dbb3e6d42", "scanner": "scanner-primary", "fingerprint": "d36fbb5998f48131", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f072552ebd26034e", "level": "none", "message": {"text": "Commented-code block (10 lines) in unide-frontend/src/main.jsx:12"}, "properties": {"repobilityId": "c5543337d2948e61", "scanner": "scanner-primary", "fingerprint": "f072552ebd26034e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b478aaf6cd482c41", "level": "none", "message": {"text": "Commented-code block (7 lines) in unide-frontend/src/config/legal.js:1"}, "properties": {"repobilityId": "83dbbddf4c85c1b3", "scanner": "scanner-primary", "fingerprint": "b478aaf6cd482c41", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a108d361fe0b1c01", "level": "none", "message": {"text": "Commented-code block (9 lines) in unide-frontend/src/config/company.js:1"}, "properties": {"repobilityId": "d6c71d8484df75e1", "scanner": "scanner-primary", "fingerprint": "a108d361fe0b1c01", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-53a8b9f8ce45e93c", "level": "none", "message": {"text": "Commented-code block (5 lines) in unide-frontend/src/api/client.js:94"}, "properties": {"repobilityId": "0f22602b453bce97", "scanner": "scanner-primary", "fingerprint": "53a8b9f8ce45e93c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-787f1d8be6caa029", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 unide-frontend/src/api/client.js:26"}, "properties": {"repobilityId": "3534aeb482d3ef93", "scanner": "scanner-primary", "fingerprint": "787f1d8be6caa029", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f0b854ab00a40676", "level": "none", "message": {"text": "Commented-code block (9 lines) in unide-frontend/src/utils/orderDocuments.js:1"}, "properties": {"repobilityId": "8b17bea80c425746", "scanner": "scanner-primary", "fingerprint": "f0b854ab00a40676", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-baaca63063e73bfd", "level": "none", "message": {"text": "Commented-code block (6 lines) in unide-frontend/src/utils/termsAcceptance.js:1"}, "properties": {"repobilityId": "2cc63045e55b0f41", "scanner": "scanner-primary", "fingerprint": "baaca63063e73bfd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e3d2d662c8f08a9", "level": "none", "message": {"text": "Commented-code block (11 lines) in unide-frontend/src/utils/analytics.js:1"}, "properties": {"repobilityId": "ba6a2fa8d921a303", "scanner": "scanner-primary", "fingerprint": "1e3d2d662c8f08a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9c3c3d47bc1a4fe2", "level": "none", "message": {"text": "Commented-code block (9 lines) in unide-frontend/src/components/AddressAutocomplete.jsx:3"}, "properties": {"repobilityId": "4bbdd7411a45ca6c", "scanner": "scanner-primary", "fingerprint": "9c3c3d47bc1a4fe2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-447bd05132060c7b", "level": "none", "message": {"text": "Commented-code block (8 lines) in unide-frontend/src/components/TurnstileGate.jsx:1"}, "properties": {"repobilityId": "a73235cb4de76fb1", "scanner": "scanner-primary", "fingerprint": "447bd05132060c7b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7c7a4644543ec606", "level": "none", "message": {"text": "Commented-code block (5 lines) in unide-frontend/src/components/IvaLookup.jsx:1"}, "properties": {"repobilityId": "9d12a5bb23a30b0c", "scanner": "scanner-primary", "fingerprint": "7c7a4644543ec606", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe7340dc7e691dd5", "level": "none", "message": {"text": "Commented-code block (6 lines) in unide-frontend/src/components/EanIvaScanner.jsx:3"}, "properties": {"repobilityId": "82c570daf045b658", "scanner": "scanner-primary", "fingerprint": "fe7340dc7e691dd5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e6c912cb30143cc", "level": "none", "message": {"text": "Commented-code block (6 lines) in unide-frontend/src/components/CookieConsent.jsx:1"}, "properties": {"repobilityId": "254ddd6531e1110d", "scanner": "scanner-primary", "fingerprint": "9e6c912cb30143cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8abe2e0d8324a96e", "level": "none", "message": {"text": "Commented-code block (8 lines) in unide-frontend/src/pages/NotFound.jsx:1"}, "properties": {"repobilityId": "63c951d61d0aafe1", "scanner": "scanner-primary", "fingerprint": "8abe2e0d8324a96e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f96225fed8632875", "level": "none", "message": {"text": "Commented-code block (5 lines) in unide-frontend/src/pages/legal/PoliticaPrivacidad.jsx:1"}, "properties": {"repobilityId": "ca84618cd32577ba", "scanner": "scanner-primary", "fingerprint": "f96225fed8632875", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-15a8dd5e7059760f", "level": "none", "message": {"text": "Commented-code block (8 lines) in unide-frontend/src/pages/legal/PoliticaEnvios.jsx:1"}, "properties": {"repobilityId": "f85853e16234605c", "scanner": "scanner-primary", "fingerprint": "15a8dd5e7059760f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-756ea11e93cda0db", "level": "none", "message": {"text": "Commented-code block (6 lines) in unide-frontend/src/pages/legal/TerminosCondiciones.jsx:1"}, "properties": {"repobilityId": "c4152675212e150f", "scanner": "scanner-primary", "fingerprint": "756ea11e93cda0db", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-389730af40b48881", "level": "none", "message": {"text": "Commented-code block (8 lines) in unide-frontend/src/pages/legal/PoliticaDevoluciones.jsx:1"}, "properties": {"repobilityId": "cf4097f1714478d4", "scanner": "scanner-primary", "fingerprint": "389730af40b48881", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ca6f113e3bed2ef6", "level": "none", "message": {"text": "Commented-code block (9 lines) in unide-frontend/src/pages/legal/AvisoLegal.jsx:1"}, "properties": {"repobilityId": "12a62f68fc96c333", "scanner": "scanner-primary", "fingerprint": "ca6f113e3bed2ef6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d4d56fb67011488d", "level": "none", "message": {"text": "Commented-code block (8 lines) in unide-frontend/src/pages/legal/PoliticaCookies.jsx:1"}, "properties": {"repobilityId": "b09e76c11d52483b", "scanner": "scanner-primary", "fingerprint": "d4d56fb67011488d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c2449f46e559ad94", "level": "none", "message": {"text": "Commented-code block (7 lines) in unide-frontend/src/pages/legal/_components.jsx:1"}, "properties": {"repobilityId": "0b0495e649bfb036", "scanner": "scanner-primary", "fingerprint": "c2449f46e559ad94", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9f79669449ea6042", "level": "none", "message": {"text": "Commented-code block (5 lines) in unide-frontend/src/hooks/useNewOrdersAlert.js:1"}, "properties": {"repobilityId": "518e0f7859162ac6", "scanner": "scanner-primary", "fingerprint": "9f79669449ea6042", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ad7212e05ff2a98", "level": "none", "message": {"text": "Commented-code block (6 lines) in unide-frontend/src/hooks/useCookieConsent.js:1"}, "properties": {"repobilityId": "017d975cdc2e6ba7", "scanner": "scanner-primary", "fingerprint": "6ad7212e05ff2a98", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9996447513897762", "level": "note", "message": {"text": "30 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "b3285186f72a5bb9", "scanner": "scanner-primary", "fingerprint": "9996447513897762", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-ef310c0c2bf2a378", "level": "warning", "message": {"text": "Frontend route `/repair` has no Link/navigate to it \u2014 unide-frontend/src/main.jsx"}, "properties": {"repobilityId": "0eed42f0ed8ffa1e", "scanner": "scanner-primary", "fingerprint": "ef310c0c2bf2a378", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-83322ca41b545fc6", "level": "warning", "message": {"text": "Frontend route `/admin` has no Link/navigate to it \u2014 unide-frontend/src/main.jsx"}, "properties": {"repobilityId": "31d5a58b44f04fd6", "scanner": "scanner-primary", "fingerprint": "83322ca41b545fc6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0511016c3fd62634", "level": "error", "message": {"text": "Dangling fetch: POST https://removebgapi.com/api/v1/remove (unide-frontend/backend/server.js:2899)"}, "properties": {"repobilityId": "4f89dd52b689e87b", "scanner": "scanner-primary", "fingerprint": "0511016c3fd62634", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d92303fa2184d0d1", "level": "error", "message": {"text": "Dangling fetch: POST https://api.remove.bg/v1.0/removebg (unide-frontend/backend/server.js:2912)"}, "properties": {"repobilityId": "f890b68b3fc82041", "scanner": "scanner-primary", "fingerprint": "d92303fa2184d0d1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3737e43d09bb7a54", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (unide-frontend/backend/server.js:3000)"}, "properties": {"repobilityId": "55306f14c010fce7", "scanner": "scanner-primary", "fingerprint": "3737e43d09bb7a54", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-23298951eb182434", "level": "error", "message": {"text": "Dangling fetch: GET /tax-suggestions/product-tax-suggestions.json (unide-frontend/src/Admin.jsx:342)"}, "properties": {"repobilityId": "a90fda8f6e797e2a", "scanner": "scanner-primary", "fingerprint": "23298951eb182434", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-022923001f9e97f8", "level": "error", "message": {"text": "Dangling fetch: GET /unide-iva.json (unide-frontend/src/components/IvaLookup.jsx:63)"}, "properties": {"repobilityId": "4a244d94aff51131", "scanner": "scanner-primary", "fingerprint": "022923001f9e97f8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-53eca9056f072f7f", "level": "error", "message": {"text": "Dangling fetch: GET /unide-iva.json (unide-frontend/src/components/EanIvaScanner.jsx:21)"}, "properties": {"repobilityId": "410bb8019cccd58c", "scanner": "scanner-primary", "fingerprint": "53eca9056f072f7f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-76f7964d6c782e43", "level": "note", "message": {"text": "Unused endpoint: POST /api/stripe/webhook"}, "properties": {"repobilityId": "a846956b538e4f01", "scanner": "scanner-primary", "fingerprint": "76f7964d6c782e43", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-76889df7c8e240c5", "level": "note", "message": {"text": "Unused endpoint: USE /api/"}, "properties": {"repobilityId": "9332066902c4d504", "scanner": "scanner-primary", "fingerprint": "76889df7c8e240c5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b695a5b67fb4fb96", "level": "note", "message": {"text": "Unused endpoint: GET /api/products"}, "properties": {"repobilityId": "de3826ecded5bdf4", "scanner": "scanner-primary", "fingerprint": "b695a5b67fb4fb96", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5926c673ce6a1271", "level": "note", "message": {"text": "Unused endpoint: GET /api/categories"}, "properties": {"repobilityId": "cf7ae0fdc37e95cc", "scanner": "scanner-primary", "fingerprint": "5926c673ce6a1271", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-77c0dfc2523e55b6", "level": "note", "message": {"text": "Unused endpoint: GET /api/sub-categories"}, "properties": {"repobilityId": "1876afee0376344b", "scanner": "scanner-primary", "fingerprint": "77c0dfc2523e55b6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-95c0ba0782d9674d", "level": "note", "message": {"text": "Unused endpoint: GET /api/repair-services"}, "properties": {"repobilityId": "34361628b41211dc", "scanner": "scanner-primary", "fingerprint": "95c0ba0782d9674d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2a87296ec7af6c76", "level": "note", "message": {"text": "Unused endpoint: GET /api/orders/:orderId"}, "properties": {"repobilityId": "7af91296b11fda55", "scanner": "scanner-primary", "fingerprint": "2a87296ec7af6c76", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-90f103fde9ecaee4", "level": "note", "message": {"text": "Unused endpoint: GET /api/print/pending"}, "properties": {"repobilityId": "7468dd829e42c8ae", "scanner": "scanner-primary", "fingerprint": "90f103fde9ecaee4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-31d13cecaaf64276", "level": "note", "message": {"text": "Unused endpoint: POST /api/print/mark"}, "properties": {"repobilityId": "8219722bb34e7eee", "scanner": "scanner-primary", "fingerprint": "31d13cecaaf64276", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c98684eed7f587f4", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/orders/:id/invoice"}, "properties": {"repobilityId": "f3b19ff19f76d56f", "scanner": "scanner-primary", "fingerprint": "c98684eed7f587f4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "84438e0aeb3c6348", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}