{"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-0cf222559dfee169", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminLayout.tsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminLayout.tsx:177"}, "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-d32ed14f63507731", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/NotificheFornitoreBell.tsx:251", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/NotificheFornitoreBell.tsx:251"}, "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-3ba92dbdc4b6ada3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/TipiImpianto.tsx:114", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/TipiImpianto.tsx:114"}, "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-2864e8f351eaedd3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/CondominioSelector.tsx:38", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CondominioSelector.tsx:38"}, "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-b6902d44f5d9c622", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/FornitoreLayout.tsx:66", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/FornitoreLayout.tsx:66"}, "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-9d49823b4813d611", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/RapportinoView.tsx:316", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/RapportinoView.tsx:316"}, "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-7f2bb31055aefe9f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/RapportinoView.tsx:278", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/RapportinoView.tsx:278"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7debec8eb9b8ea90", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/NotificheBell.tsx:173", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/NotificheBell.tsx:173"}, "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-0cee85a890687880", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ClienteCombobox.tsx:126", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ClienteCombobox.tsx:126"}, "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-df909b6cdc619317", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/FilePreviewDialog.tsx:26", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/FilePreviewDialog.tsx:26"}, "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-3391d47b5ae0eedc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/EsercizioSelector.tsx:33", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/EsercizioSelector.tsx:33"}, "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-7dd96954bcef2e2f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ImpiantoCombobox.tsx:42", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ImpiantoCombobox.tsx:42"}, "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-0e226530102b88f6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/anagrafiche/PersoneTab.tsx:530", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/anagrafiche/PersoneTab.tsx:530"}, "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-3e91ddf2f339881e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/anagrafiche/UnitaTab.tsx:276", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/anagrafiche/UnitaTab.tsx:276"}, "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-af312187c2dc481d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/CondivisionePubblica.tsx:195", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/CondivisionePubblica.tsx:195"}, "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-466205beae749e5f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ImpiantoPubblico.tsx:210", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ImpiantoPubblico.tsx:210"}, "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-0cf323bae47c4b62", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/fornitore/ImpiantoDettaglio.tsx:251", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/fornitore/ImpiantoDettaglio.tsx:251"}, "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-40570b6a53af7eca", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/fornitore/DashboardFornitore.tsx:301", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/fornitore/DashboardFornitore.tsx:301"}, "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-f368407155d7c26c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/fornitore/RapportiniFornitore.tsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/fornitore/RapportiniFornitore.tsx:142"}, "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-21472e5b524c1522", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Impostazioni.tsx:1802", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Impostazioni.tsx:1802"}, "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-1f30c5ae6f36d9df", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/pages/admin/Impostazioni.tsx:2178", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/pages/admin/Impostazioni.tsx:2178"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c53436823b98a344", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Documenti.tsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Documenti.tsx:142"}, "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-a7168f9387899c97", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Supercondomini.tsx:926", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Supercondomini.tsx:926"}, "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-d22c10b88be2070b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Trasferimenti.tsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Trasferimenti.tsx:196"}, "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-d4d69ed777c5d06c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Dashboard.tsx:266", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Dashboard.tsx:266"}, "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-65ccfe50df4efdc1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/system/SystemAdmin.tsx:1534", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/system/SystemAdmin.tsx:1534"}, "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-537facd7dfccd137", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/storage/external.ts:29", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/storage/external.ts:29"}, "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-6ffffc99686c230d", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/export-cleanup/index.ts:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/export-cleanup/index.ts:91"}, "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-1baff77abdb1224c", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/export-documenti/index.ts:404", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/export-documenti/index.ts:404"}, "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-c9e9cf956aab78aa", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/trial-notifier/index.ts:170", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/trial-notifier/index.ts:170"}, "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-98af71fc95f981ba", "name": "Dockerfile runs as root: services/danea-converter/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: services/danea-converter/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-db447f7fadcd05d3", "name": "Docker base image is tag-pinned but not digest-pinned: jacobalberty/firebird:2.5-ss", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: jacobalberty/firebird:2.5-ss"}, "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-fb8eef62b6986271", "name": "Insecure pattern 'node_child_process' in scripts/danea-export.mjs:22", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/danea-export.mjs:22"}, "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-554344c782f72194", "name": "Insecure pattern 'document_write' in src/components/RapportinoView.tsx:98", "shortDescription": {"text": "Insecure pattern 'document_write' in src/components/RapportinoView.tsx:98"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-451ad42a1a3fb1a7", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/RapportinoView.tsx:278", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/RapportinoView.tsx:278"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1f136bc03180b739", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/pages/fornitore/ImpiantoDettaglio.tsx:1485", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/pages/fornitore/ImpiantoDettaglio.tsx:1485"}, "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-ebe6f7e9d82fb661", "name": "Insecure pattern 'dangerous_innerhtml' in src/pages/admin/Impostazioni.tsx:2178", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/pages/admin/Impostazioni.tsx:2178"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fddbf6c592a2c1ef", "name": "Insecure pattern 'document_write' in src/lib/qrLabels.ts:182", "shortDescription": {"text": "Insecure pattern 'document_write' in src/lib/qrLabels.ts:182"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-38ce8c40c4cf5997", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/ai-embed/index.ts:9", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/ai-embed/index.ts:9"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a2893cc2c0cf679b", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/ai-claude/index.ts:26", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/ai-claude/index.ts:26"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b269b12954df872f", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/ai-index-doc/index.ts:11", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/ai-index-doc/index.ts:11"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8ed76060015f981e", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/ai-whisper/index.ts:13", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/ai-whisper/index.ts:13"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b0e229094f409bc0", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/export-documenti/index.ts:23", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/export-documenti/index.ts:23"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-615aa53a42d67002", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/landing-logo/index.ts:15", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/landing-logo/index.ts:15"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8dc3bd3711cbd591", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/mfa-recovery/index.ts:22", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/mfa-recovery/index.ts:22"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-267267a784bcd12c", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/fornitore-osservatore/index.ts:23", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/fornitore-osservatore/index.ts:23"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-99a7579487f64c75", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/verify-password/index.ts:14", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/verify-password/index.ts:14"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a9563c2dba2988f6", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/ai-search-docs/index.ts:9", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/ai-search-docs/index.ts:9"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-de97274d96320a33", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/condomino-access/index.ts:15", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/condomino-access/index.ts:15"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1e6806cf8ac4c67f", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/stripe-checkout/index.ts:20", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/stripe-checkout/index.ts:20"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b5a42a7da074eaeb", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/doc-pagamento/index.ts:23", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/doc-pagamento/index.ts:23"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-90b416c692782660", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/fornitore-utenti/index.ts:18", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/fornitore-utenti/index.ts:18"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b07fcb615e650820", "name": "Insecure pattern 'node_child_process' in services/danea-converter/converter.mjs:10", "shortDescription": {"text": "Insecure pattern 'node_child_process' in services/danea-converter/converter.mjs:10"}, "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-86e2be53cd8906f3", "name": "Very large file: src/types/database.ts (4985 lines)", "shortDescription": {"text": "Very large file: src/types/database.ts (4985 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-07fa1fb549755963", "name": "Very large file: src/components/anagrafiche/PersoneTab.tsx (1434 lines)", "shortDescription": {"text": "Very large file: src/components/anagrafiche/PersoneTab.tsx (1434 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-6d213189cb357ed3", "name": "Very large file: src/components/anagrafiche/UnitaTab.tsx (1785 lines)", "shortDescription": {"text": "Very large file: src/components/anagrafiche/UnitaTab.tsx (1785 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-dc5ea1b2e67b810d", "name": "Very large file: src/pages/fornitore/ImpiantoDettaglio.tsx (2159 lines)", "shortDescription": {"text": "Very large file: src/pages/fornitore/ImpiantoDettaglio.tsx (2159 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-7c03043f6ed6d06d", "name": "Very large file: src/pages/admin/Impostazioni.tsx (4199 lines)", "shortDescription": {"text": "Very large file: src/pages/admin/Impostazioni.tsx (4199 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-09af3a947411dcaa", "name": "Very large file: src/pages/admin/Supercondomini.tsx (2153 lines)", "shortDescription": {"text": "Very large file: src/pages/admin/Supercondomini.tsx (2153 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-b9f6e3340d799fad", "name": "Very large file: src/pages/system/SystemAdmin.tsx (3126 lines)", "shortDescription": {"text": "Very large file: src/pages/system/SystemAdmin.tsx (3126 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": "1 test file(s) for 172 source file(s) (ratio 0.01). 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-e852abd8973390f9", "name": "Node manifest has dependencies but no lockfile: services/danea-converter/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: services/danea-converter/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 194 placeholder/mock markers across 57 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, tests, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, tests, lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bea357a6497a2d5d", "name": "Agent authority lacks a verifier contract: CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cc55229a7a3c078d", "name": "Agent authority lacks a verifier contract: .mcp.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .mcp.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fd1a32a0b2813448", "name": "Agent authority lacks a verifier contract: .claude/skills/debug-issue/skill.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/debug-issue/skill.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7bc66c7e963888cd", "name": "Agent authority lacks a verifier contract: .claude/skills/build-graph/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/build-graph/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-52f4f78a7256ef1a", "name": "Agent authority lacks a verifier contract: .claude/skills/explore-codebase/skill.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/explore-codebase/skill.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-90a9b7df5925e473", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/context/AuthContext.tsx:349", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/context/AuthContext.tsx:349"}, "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-d15a7b7baa8cde8c", "name": "Commented-code block (5 lines) in src/components/anagrafiche/MillesimiTab.tsx:615", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/anagrafiche/MillesimiTab.tsx:615"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4c63e872cd6ca37c", "name": "Commented-code block (6 lines) in src/components/system/ListiniFornitoriTab.tsx:91", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/system/ListiniFornitoriTab.tsx:91"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ec82ea7cdaba48a1", "name": "Commented-code block (5 lines) in src/pages/fornitore/ImpiantiFornitore.tsx:85", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/fornitore/ImpiantiFornitore.tsx:85"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-806dc9f2f3c4b568", "name": "Legacy-named symbol `fattura_non_pagata_old` in src/pages/admin/Anomalie.tsx:34", "shortDescription": {"text": "Legacy-named symbol `fattura_non_pagata_old` in src/pages/admin/Anomalie.tsx:34"}, "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-86b7515a1bc7986e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/admin/Assistente.tsx:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/admin/Assistente.tsx:72"}, "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-8cb8f49a1fadd1a1", "name": "Commented-code block (6 lines) in src/lib/storageTiers.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/storageTiers.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6da650579f551b8d", "name": "Commented-code block (5 lines) in src/lib/pdf.ts:678", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/pdf.ts:678"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-142668278964d3a5", "name": "Commented-code block (7 lines) in src/lib/reportData.ts:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/reportData.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9a07ae57cff297ee", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai.ts:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai.ts:16"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-413b6ffcc77e0851", "name": "Commented-code block (5 lines) in supabase/functions/ai-claude/index.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/ai-claude/index.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-178b1fab881ee119", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/ai-index-doc/index.ts:128", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/ai-index-doc/index.ts:128"}, "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-6ce979039e5e85cd", "name": "Commented-code block (5 lines) in supabase/functions/export-documenti/index.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/export-documenti/index.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-574c608b4cad3a65", "name": "Commented-code block (9 lines) in supabase/functions/mfa-recovery/index.ts:7", "shortDescription": {"text": "Commented-code block (9 lines) in supabase/functions/mfa-recovery/index.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9abc7580d8a9a24d", "name": "Commented-code block (8 lines) in supabase/functions/fornitore-osservatore/index.ts:7", "shortDescription": {"text": "Commented-code block (8 lines) in supabase/functions/fornitore-osservatore/index.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4225dedbc3dca064", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/fornitore-osservatore/index.ts:115", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/fornitore-osservatore/index.ts:115"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e194c1fb76e4b3a5", "name": "Commented-code block (6 lines) in supabase/functions/verify-password/index.ts:72", "shortDescription": {"text": "Commented-code block (6 lines) in supabase/functions/verify-password/index.ts:72"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f83bbf38bfd0f41a", "name": "Commented-code block (9 lines) in supabase/functions/stripe-checkout/index.ts:7", "shortDescription": {"text": "Commented-code block (9 lines) in supabase/functions/stripe-checkout/index.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-777d05dd3836006a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/stripe-checkout/index.ts:169", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/stripe-checkout/index.ts:169"}, "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-d8912c90b6cc5a30", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/stripe-webhook/index.ts:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/stripe-webhook/index.ts: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-96195f7b8def95ac", "name": "Commented-code block (9 lines) in supabase/functions/doc-pagamento/index.ts:6", "shortDescription": {"text": "Commented-code block (9 lines) in supabase/functions/doc-pagamento/index.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4cf4c50f8e7ab820", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/doc-pagamento/index.ts:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/doc-pagamento/index.ts:75"}, "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-6cc4b976ad54e256", "name": "Commented-code block (5 lines) in supabase/functions/trial-notifier/index.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in supabase/functions/trial-notifier/index.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ec659924c0735c06", "name": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/trial-notifier/index.ts:100", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/trial-notifier/index.ts:100"}, "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-a3c97b1a5ab0d1e3", "name": "Frontend route `/register-fornitore` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/register-fornitore` has no Link/navigate to it \u2014 src/App.tsx"}, "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-7f1bec1fd65c0879", "name": "Frontend route `/reset-password` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 src/App.tsx"}, "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-19f3cf3fe8525d53", "name": "Frontend route `/invito/:token` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/invito/:token` has no Link/navigate to it \u2014 src/App.tsx"}, "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-ec155d2a227f07a3", "name": "Frontend route `/impianto/:token` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/impianto/:token` has no Link/navigate to it \u2014 src/App.tsx"}, "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-3e13ee97fdf478d7", "name": "Frontend route `/condivisione/:token` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/condivisione/:token` has no Link/navigate to it \u2014 src/App.tsx"}, "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-9c5660661e74e422", "name": "Frontend route `/rendiconto/:esercizioId` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/rendiconto/:esercizioId` has no Link/navigate to it \u2014 src/App.tsx"}, "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-e316e141bbb4398d", "name": "Frontend route `/fornitore/impianti/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/fornitore/impianti/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "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-a93fbcaaac12e773", "name": "Frontend route `/verbali/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/verbali/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "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}}]}}, "automationDetails": {"id": "repobility/24038"}, "properties": {"repository": "ala-service/stabile", "repoUrl": "https://github.com/ala-service/stabile", "branch": "main"}, "results": [{"ruleId": "scanner-0cf222559dfee169", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AdminLayout.tsx:177"}, "properties": {"repobilityId": "d531e6d9150888b5", "scanner": "scanner-primary", "fingerprint": "0cf222559dfee169", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d32ed14f63507731", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/NotificheFornitoreBell.tsx:251"}, "properties": {"repobilityId": "3004dd270a8afa6c", "scanner": "scanner-primary", "fingerprint": "d32ed14f63507731", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3ba92dbdc4b6ada3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/TipiImpianto.tsx:114"}, "properties": {"repobilityId": "3cc5b9335e8f2ab7", "scanner": "scanner-primary", "fingerprint": "3ba92dbdc4b6ada3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2864e8f351eaedd3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CondominioSelector.tsx:38"}, "properties": {"repobilityId": "f7d2cde889655c15", "scanner": "scanner-primary", "fingerprint": "2864e8f351eaedd3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b6902d44f5d9c622", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/FornitoreLayout.tsx:66"}, "properties": {"repobilityId": "653df4bd06adbf9f", "scanner": "scanner-primary", "fingerprint": "b6902d44f5d9c622", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9d49823b4813d611", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/RapportinoView.tsx:316"}, "properties": {"repobilityId": "c2d639b5a7d6dc36", "scanner": "scanner-primary", "fingerprint": "9d49823b4813d611", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7f2bb31055aefe9f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/RapportinoView.tsx:278"}, "properties": {"repobilityId": "8cec9d305d6ea115", "scanner": "scanner-primary", "fingerprint": "7f2bb31055aefe9f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-7debec8eb9b8ea90", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/NotificheBell.tsx:173"}, "properties": {"repobilityId": "d4e968d128534575", "scanner": "scanner-primary", "fingerprint": "7debec8eb9b8ea90", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0cee85a890687880", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ClienteCombobox.tsx:126"}, "properties": {"repobilityId": "f2fa7a21bd67c628", "scanner": "scanner-primary", "fingerprint": "0cee85a890687880", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-df909b6cdc619317", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/FilePreviewDialog.tsx:26"}, "properties": {"repobilityId": "8c84e76f8728a2d4", "scanner": "scanner-primary", "fingerprint": "df909b6cdc619317", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3391d47b5ae0eedc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/EsercizioSelector.tsx:33"}, "properties": {"repobilityId": "18db595683f0bf9f", "scanner": "scanner-primary", "fingerprint": "3391d47b5ae0eedc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7dd96954bcef2e2f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ImpiantoCombobox.tsx:42"}, "properties": {"repobilityId": "68274f905b38c134", "scanner": "scanner-primary", "fingerprint": "7dd96954bcef2e2f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0e226530102b88f6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/anagrafiche/PersoneTab.tsx:530"}, "properties": {"repobilityId": "3aa9f64837f12042", "scanner": "scanner-primary", "fingerprint": "0e226530102b88f6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3e91ddf2f339881e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/anagrafiche/UnitaTab.tsx:276"}, "properties": {"repobilityId": "a3b99c875edaa61d", "scanner": "scanner-primary", "fingerprint": "3e91ddf2f339881e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-af312187c2dc481d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/CondivisionePubblica.tsx:195"}, "properties": {"repobilityId": "847bc63eb637ce38", "scanner": "scanner-primary", "fingerprint": "af312187c2dc481d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-466205beae749e5f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ImpiantoPubblico.tsx:210"}, "properties": {"repobilityId": "a982cc6eb50255ed", "scanner": "scanner-primary", "fingerprint": "466205beae749e5f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0cf323bae47c4b62", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/fornitore/ImpiantoDettaglio.tsx:251"}, "properties": {"repobilityId": "8d5a846f5638a3aa", "scanner": "scanner-primary", "fingerprint": "0cf323bae47c4b62", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-40570b6a53af7eca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/fornitore/DashboardFornitore.tsx:301"}, "properties": {"repobilityId": "6db094e2958f9945", "scanner": "scanner-primary", "fingerprint": "40570b6a53af7eca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f368407155d7c26c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/fornitore/RapportiniFornitore.tsx:142"}, "properties": {"repobilityId": "0b21fa6d89f8c1ce", "scanner": "scanner-primary", "fingerprint": "f368407155d7c26c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-21472e5b524c1522", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Impostazioni.tsx:1802"}, "properties": {"repobilityId": "7827ce24e854c753", "scanner": "scanner-primary", "fingerprint": "21472e5b524c1522", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1f30c5ae6f36d9df", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/pages/admin/Impostazioni.tsx:2178"}, "properties": {"repobilityId": "ab5bbc8a978c047d", "scanner": "scanner-primary", "fingerprint": "1f30c5ae6f36d9df", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c53436823b98a344", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Documenti.tsx:142"}, "properties": {"repobilityId": "81c495f11e48399d", "scanner": "scanner-primary", "fingerprint": "c53436823b98a344", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a7168f9387899c97", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Supercondomini.tsx:926"}, "properties": {"repobilityId": "31ec6bbd8bbbc16b", "scanner": "scanner-primary", "fingerprint": "a7168f9387899c97", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d22c10b88be2070b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Trasferimenti.tsx:196"}, "properties": {"repobilityId": "432a3b66061cdb86", "scanner": "scanner-primary", "fingerprint": "d22c10b88be2070b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4d69ed777c5d06c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Dashboard.tsx:266"}, "properties": {"repobilityId": "5042987516ab7ad8", "scanner": "scanner-primary", "fingerprint": "d4d69ed777c5d06c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-65ccfe50df4efdc1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/system/SystemAdmin.tsx:1534"}, "properties": {"repobilityId": "d1ad6dc6fb438f15", "scanner": "scanner-primary", "fingerprint": "65ccfe50df4efdc1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-537facd7dfccd137", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/storage/external.ts:29"}, "properties": {"repobilityId": "39390c0e93382253", "scanner": "scanner-primary", "fingerprint": "537facd7dfccd137", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-6ffffc99686c230d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/export-cleanup/index.ts:91"}, "properties": {"repobilityId": "e003193984d8f205", "scanner": "scanner-primary", "fingerprint": "6ffffc99686c230d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1baff77abdb1224c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/export-documenti/index.ts:404"}, "properties": {"repobilityId": "dc88e50b48608565", "scanner": "scanner-primary", "fingerprint": "1baff77abdb1224c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c9e9cf956aab78aa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/trial-notifier/index.ts:170"}, "properties": {"repobilityId": "e91c1d890848460d", "scanner": "scanner-primary", "fingerprint": "c9e9cf956aab78aa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-98af71fc95f981ba", "level": "warning", "message": {"text": "Dockerfile runs as root: services/danea-converter/Dockerfile"}, "properties": {"repobilityId": "397aee01b08ae400", "scanner": "scanner-primary", "fingerprint": "98af71fc95f981ba", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-db447f7fadcd05d3", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: jacobalberty/firebird:2.5-ss"}, "properties": {"repobilityId": "4f03af200beaba0d", "scanner": "scanner-primary", "fingerprint": "db447f7fadcd05d3", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/danea-converter/Dockerfile"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-fb8eef62b6986271", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/danea-export.mjs:22"}, "properties": {"repobilityId": "2817ea6dbb69d66d", "scanner": "scanner-primary", "fingerprint": "fb8eef62b6986271", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/danea-export.mjs"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-554344c782f72194", "level": "note", "message": {"text": "Insecure pattern 'document_write' in src/components/RapportinoView.tsx:98"}, "properties": {"repobilityId": "5a5d770896f56bb4", "scanner": "scanner-primary", "fingerprint": "554344c782f72194", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/RapportinoView.tsx"}, "region": {"startLine": 98}}}]}, {"ruleId": "scanner-451ad42a1a3fb1a7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/RapportinoView.tsx:278"}, "properties": {"repobilityId": "0db49f07d327cb00", "scanner": "scanner-primary", "fingerprint": "451ad42a1a3fb1a7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/RapportinoView.tsx"}, "region": {"startLine": 278}}}]}, {"ruleId": "scanner-1f136bc03180b739", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/pages/fornitore/ImpiantoDettaglio.tsx:1485"}, "properties": {"repobilityId": "66945fd52dabf9ce", "scanner": "scanner-primary", "fingerprint": "1f136bc03180b739", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/pages/fornitore/ImpiantoDettaglio.tsx"}, "region": {"startLine": 1485}}}]}, {"ruleId": "scanner-ebe6f7e9d82fb661", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/pages/admin/Impostazioni.tsx:2178"}, "properties": {"repobilityId": "3b3ef9f73487c404", "scanner": "scanner-primary", "fingerprint": "ebe6f7e9d82fb661", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/pages/admin/Impostazioni.tsx"}, "region": {"startLine": 2178}}}]}, {"ruleId": "scanner-fddbf6c592a2c1ef", "level": "note", "message": {"text": "Insecure pattern 'document_write' in src/lib/qrLabels.ts:182"}, "properties": {"repobilityId": "f0a3dfea0b1fb35a", "scanner": "scanner-primary", "fingerprint": "fddbf6c592a2c1ef", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/qrLabels.ts"}, "region": {"startLine": 182}}}]}, {"ruleId": "scanner-38ce8c40c4cf5997", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/ai-embed/index.ts:9"}, "properties": {"repobilityId": "cc6b4681e272c9b1", "scanner": "scanner-primary", "fingerprint": "38ce8c40c4cf5997", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/ai-embed/index.ts"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-a2893cc2c0cf679b", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/ai-claude/index.ts:26"}, "properties": {"repobilityId": "0bcde8df59f0169d", "scanner": "scanner-primary", "fingerprint": "a2893cc2c0cf679b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/ai-claude/index.ts"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-b269b12954df872f", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/ai-index-doc/index.ts:11"}, "properties": {"repobilityId": "7cf99488e0f4aafd", "scanner": "scanner-primary", "fingerprint": "b269b12954df872f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/ai-index-doc/index.ts"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-8ed76060015f981e", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/ai-whisper/index.ts:13"}, "properties": {"repobilityId": "79a7b36cbeca8f05", "scanner": "scanner-primary", "fingerprint": "8ed76060015f981e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/ai-whisper/index.ts"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-b0e229094f409bc0", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/export-documenti/index.ts:23"}, "properties": {"repobilityId": "f4cf9803df8e3810", "scanner": "scanner-primary", "fingerprint": "b0e229094f409bc0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/export-documenti/index.ts"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-615aa53a42d67002", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/landing-logo/index.ts:15"}, "properties": {"repobilityId": "56d972ce74c9f33a", "scanner": "scanner-primary", "fingerprint": "615aa53a42d67002", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/landing-logo/index.ts"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-8dc3bd3711cbd591", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/mfa-recovery/index.ts:22"}, "properties": {"repobilityId": "280e2878f4e42258", "scanner": "scanner-primary", "fingerprint": "8dc3bd3711cbd591", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/mfa-recovery/index.ts"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-267267a784bcd12c", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/fornitore-osservatore/index.ts:23"}, "properties": {"repobilityId": "da39d6c967071faf", "scanner": "scanner-primary", "fingerprint": "267267a784bcd12c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/fornitore-osservatore/index.ts"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-99a7579487f64c75", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/verify-password/index.ts:14"}, "properties": {"repobilityId": "77632fc3776cdac2", "scanner": "scanner-primary", "fingerprint": "99a7579487f64c75", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/verify-password/index.ts"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-a9563c2dba2988f6", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/ai-search-docs/index.ts:9"}, "properties": {"repobilityId": "9e12743b3d49e8fe", "scanner": "scanner-primary", "fingerprint": "a9563c2dba2988f6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/ai-search-docs/index.ts"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-de97274d96320a33", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/condomino-access/index.ts:15"}, "properties": {"repobilityId": "ac2c50f530a27ba8", "scanner": "scanner-primary", "fingerprint": "de97274d96320a33", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/condomino-access/index.ts"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-1e6806cf8ac4c67f", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/stripe-checkout/index.ts:20"}, "properties": {"repobilityId": "fbc08af371eaa551", "scanner": "scanner-primary", "fingerprint": "1e6806cf8ac4c67f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/stripe-checkout/index.ts"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-b5a42a7da074eaeb", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/doc-pagamento/index.ts:23"}, "properties": {"repobilityId": "12dbac9dfbbc277d", "scanner": "scanner-primary", "fingerprint": "b5a42a7da074eaeb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/doc-pagamento/index.ts"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-90b416c692782660", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/fornitore-utenti/index.ts:18"}, "properties": {"repobilityId": "c1a25b1340370dd7", "scanner": "scanner-primary", "fingerprint": "90b416c692782660", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/fornitore-utenti/index.ts"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-b07fcb615e650820", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in services/danea-converter/converter.mjs:10"}, "properties": {"repobilityId": "d867874588acb020", "scanner": "scanner-primary", "fingerprint": "b07fcb615e650820", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/danea-converter/converter.mjs"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-86e2be53cd8906f3", "level": "note", "message": {"text": "Very large file: src/types/database.ts (4985 lines)"}, "properties": {"repobilityId": "a3b95ecee12e4f2c", "scanner": "scanner-primary", "fingerprint": "86e2be53cd8906f3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-07fa1fb549755963", "level": "note", "message": {"text": "Very large file: src/components/anagrafiche/PersoneTab.tsx (1434 lines)"}, "properties": {"repobilityId": "f59b88680dbb4f2c", "scanner": "scanner-primary", "fingerprint": "07fa1fb549755963", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6d213189cb357ed3", "level": "note", "message": {"text": "Very large file: src/components/anagrafiche/UnitaTab.tsx (1785 lines)"}, "properties": {"repobilityId": "03123010ac9aee15", "scanner": "scanner-primary", "fingerprint": "6d213189cb357ed3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-dc5ea1b2e67b810d", "level": "note", "message": {"text": "Very large file: src/pages/fornitore/ImpiantoDettaglio.tsx (2159 lines)"}, "properties": {"repobilityId": "8b4217ec1bc773ee", "scanner": "scanner-primary", "fingerprint": "dc5ea1b2e67b810d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7c03043f6ed6d06d", "level": "note", "message": {"text": "Very large file: src/pages/admin/Impostazioni.tsx (4199 lines)"}, "properties": {"repobilityId": "084cb93233de7e31", "scanner": "scanner-primary", "fingerprint": "7c03043f6ed6d06d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-09af3a947411dcaa", "level": "note", "message": {"text": "Very large file: src/pages/admin/Supercondomini.tsx (2153 lines)"}, "properties": {"repobilityId": "26d625dea24fd231", "scanner": "scanner-primary", "fingerprint": "09af3a947411dcaa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b9f6e3340d799fad", "level": "note", "message": {"text": "Very large file: src/pages/system/SystemAdmin.tsx (3126 lines)"}, "properties": {"repobilityId": "5f528d1bbe383cf0", "scanner": "scanner-primary", "fingerprint": "b9f6e3340d799fad", "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": "4f37ead98e728550", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-e852abd8973390f9", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: services/danea-converter/package.json"}, "properties": {"repobilityId": "d4b27627ed45b9dc", "scanner": "scanner-primary", "fingerprint": "e852abd8973390f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/danea-converter/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "e503ef90058d15ce", "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": "eb11e2a007321c50", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "afe3ae31ccc8878c", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "6e31849aefa41847", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-bea357a6497a2d5d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "properties": {"repobilityId": "aae72df3934829ac", "scanner": "scanner-primary", "fingerprint": "bea357a6497a2d5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cc55229a7a3c078d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .mcp.json"}, "properties": {"repobilityId": "51942fb3d5b8b5b4", "scanner": "scanner-primary", "fingerprint": "cc55229a7a3c078d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "mcp_config"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".mcp.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fd1a32a0b2813448", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/debug-issue/skill.md"}, "properties": {"repobilityId": "7e707e97937bdb86", "scanner": "scanner-primary", "fingerprint": "fd1a32a0b2813448", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/debug-issue/skill.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7bc66c7e963888cd", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/build-graph/SKILL.md"}, "properties": {"repobilityId": "3e670e3c553b172e", "scanner": "scanner-primary", "fingerprint": "7bc66c7e963888cd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/build-graph/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-52f4f78a7256ef1a", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/explore-codebase/skill.md"}, "properties": {"repobilityId": "8f52a9b976555ece", "scanner": "scanner-primary", "fingerprint": "52f4f78a7256ef1a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/explore-codebase/skill.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-90a9b7df5925e473", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/context/AuthContext.tsx:349"}, "properties": {"repobilityId": "0257ca236f98b784", "scanner": "scanner-primary", "fingerprint": "90a9b7df5925e473", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d15a7b7baa8cde8c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/anagrafiche/MillesimiTab.tsx:615"}, "properties": {"repobilityId": "d2809f8365dd187f", "scanner": "scanner-primary", "fingerprint": "d15a7b7baa8cde8c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4c63e872cd6ca37c", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/system/ListiniFornitoriTab.tsx:91"}, "properties": {"repobilityId": "ea65d2d43d157964", "scanner": "scanner-primary", "fingerprint": "4c63e872cd6ca37c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec82ea7cdaba48a1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/fornitore/ImpiantiFornitore.tsx:85"}, "properties": {"repobilityId": "9d9d02929f18528f", "scanner": "scanner-primary", "fingerprint": "ec82ea7cdaba48a1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-806dc9f2f3c4b568", "level": "note", "message": {"text": "Legacy-named symbol `fattura_non_pagata_old` in src/pages/admin/Anomalie.tsx:34"}, "properties": {"repobilityId": "5206c68790b4fbfa", "scanner": "scanner-primary", "fingerprint": "806dc9f2f3c4b568", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-86b7515a1bc7986e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/admin/Assistente.tsx:72"}, "properties": {"repobilityId": "452d9a4e0690c070", "scanner": "scanner-primary", "fingerprint": "86b7515a1bc7986e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8cb8f49a1fadd1a1", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/storageTiers.ts:1"}, "properties": {"repobilityId": "06fd91f36cf47b8e", "scanner": "scanner-primary", "fingerprint": "8cb8f49a1fadd1a1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6da650579f551b8d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/pdf.ts:678"}, "properties": {"repobilityId": "28645d7027a3c410", "scanner": "scanner-primary", "fingerprint": "6da650579f551b8d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-142668278964d3a5", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/reportData.ts:3"}, "properties": {"repobilityId": "197043d42e8fbc63", "scanner": "scanner-primary", "fingerprint": "142668278964d3a5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9a07ae57cff297ee", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai.ts:16"}, "properties": {"repobilityId": "2a0965bbacc4438a", "scanner": "scanner-primary", "fingerprint": "9a07ae57cff297ee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-413b6ffcc77e0851", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/ai-claude/index.ts:3"}, "properties": {"repobilityId": "3d74c998c75b8c0d", "scanner": "scanner-primary", "fingerprint": "413b6ffcc77e0851", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-178b1fab881ee119", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/ai-index-doc/index.ts:128"}, "properties": {"repobilityId": "4f8166c66a2c5ba6", "scanner": "scanner-primary", "fingerprint": "178b1fab881ee119", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6ce979039e5e85cd", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/export-documenti/index.ts:3"}, "properties": {"repobilityId": "e741f0225ebdfd5c", "scanner": "scanner-primary", "fingerprint": "6ce979039e5e85cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-574c608b4cad3a65", "level": "none", "message": {"text": "Commented-code block (9 lines) in supabase/functions/mfa-recovery/index.ts:7"}, "properties": {"repobilityId": "0cbfef64f57089d4", "scanner": "scanner-primary", "fingerprint": "574c608b4cad3a65", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9abc7580d8a9a24d", "level": "none", "message": {"text": "Commented-code block (8 lines) in supabase/functions/fornitore-osservatore/index.ts:7"}, "properties": {"repobilityId": "8b926b65ac5d1318", "scanner": "scanner-primary", "fingerprint": "9abc7580d8a9a24d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4225dedbc3dca064", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/fornitore-osservatore/index.ts:115"}, "properties": {"repobilityId": "e69bbda4f9b2ac71", "scanner": "scanner-primary", "fingerprint": "4225dedbc3dca064", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e194c1fb76e4b3a5", "level": "none", "message": {"text": "Commented-code block (6 lines) in supabase/functions/verify-password/index.ts:72"}, "properties": {"repobilityId": "d1e77987c3bbb7a8", "scanner": "scanner-primary", "fingerprint": "e194c1fb76e4b3a5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f83bbf38bfd0f41a", "level": "none", "message": {"text": "Commented-code block (9 lines) in supabase/functions/stripe-checkout/index.ts:7"}, "properties": {"repobilityId": "5e032aac4c58bce8", "scanner": "scanner-primary", "fingerprint": "f83bbf38bfd0f41a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-777d05dd3836006a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/stripe-checkout/index.ts:169"}, "properties": {"repobilityId": "9e62927cd14e415f", "scanner": "scanner-primary", "fingerprint": "777d05dd3836006a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d8912c90b6cc5a30", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/stripe-webhook/index.ts:26"}, "properties": {"repobilityId": "ad813515e2671ac8", "scanner": "scanner-primary", "fingerprint": "d8912c90b6cc5a30", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-96195f7b8def95ac", "level": "none", "message": {"text": "Commented-code block (9 lines) in supabase/functions/doc-pagamento/index.ts:6"}, "properties": {"repobilityId": "60e3e621999f5c4f", "scanner": "scanner-primary", "fingerprint": "96195f7b8def95ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4cf4c50f8e7ab820", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/doc-pagamento/index.ts:75"}, "properties": {"repobilityId": "135593fe0cee478f", "scanner": "scanner-primary", "fingerprint": "4cf4c50f8e7ab820", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6cc4b976ad54e256", "level": "none", "message": {"text": "Commented-code block (5 lines) in supabase/functions/trial-notifier/index.ts:7"}, "properties": {"repobilityId": "dc383a9699e2a445", "scanner": "scanner-primary", "fingerprint": "6cc4b976ad54e256", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec659924c0735c06", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 supabase/functions/trial-notifier/index.ts:100"}, "properties": {"repobilityId": "b10867a089fb4a55", "scanner": "scanner-primary", "fingerprint": "ec659924c0735c06", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a3c97b1a5ab0d1e3", "level": "warning", "message": {"text": "Frontend route `/register-fornitore` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "ab05a1a3eb8e0b89", "scanner": "scanner-primary", "fingerprint": "a3c97b1a5ab0d1e3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7f1bec1fd65c0879", "level": "warning", "message": {"text": "Frontend route `/reset-password` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "934747c714145754", "scanner": "scanner-primary", "fingerprint": "7f1bec1fd65c0879", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-19f3cf3fe8525d53", "level": "warning", "message": {"text": "Frontend route `/invito/:token` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "95b40d17a75b626d", "scanner": "scanner-primary", "fingerprint": "19f3cf3fe8525d53", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ec155d2a227f07a3", "level": "warning", "message": {"text": "Frontend route `/impianto/:token` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "c479deb3c078470b", "scanner": "scanner-primary", "fingerprint": "ec155d2a227f07a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3e13ee97fdf478d7", "level": "warning", "message": {"text": "Frontend route `/condivisione/:token` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "9fb9a6a22f40a4e2", "scanner": "scanner-primary", "fingerprint": "3e13ee97fdf478d7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9c5660661e74e422", "level": "warning", "message": {"text": "Frontend route `/rendiconto/:esercizioId` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "3a3ffd406a125097", "scanner": "scanner-primary", "fingerprint": "9c5660661e74e422", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e316e141bbb4398d", "level": "warning", "message": {"text": "Frontend route `/fornitore/impianti/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "250889907fc2a4e0", "scanner": "scanner-primary", "fingerprint": "e316e141bbb4398d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a93fbcaaac12e773", "level": "warning", "message": {"text": "Frontend route `/verbali/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "7ae2dd1731f64b2f", "scanner": "scanner-primary", "fingerprint": "a93fbcaaac12e773", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}]}]}