{"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-bdaf02848352b2c7", "name": "Possibly dead Python function: answer_with_rag", "shortDescription": {"text": "Possibly dead Python function: answer_with_rag"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-57f46b1c73a2dc3c", "name": "Possibly dead Python function: mark_superseded", "shortDescription": {"text": "Possibly dead Python function: mark_superseded"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d0bfe9333f35e2c9", "name": "Possibly dead Python function: detect_normative_conflict", "shortDescription": {"text": "Possibly dead Python function: detect_normative_conflict"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6647cff122795f81", "name": "Possibly dead Python function: start_trace", "shortDescription": {"text": "Possibly dead Python function: start_trace"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-beb230562a206a48", "name": "Possibly dead Python function: end_trace", "shortDescription": {"text": "Possibly dead Python function: end_trace"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0ab3a058de1db9b9", "name": "Possibly dead Python function: log_alert", "shortDescription": {"text": "Possibly dead Python function: log_alert"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f482b746abc6b4ad", "name": "Possibly dead Python function: log_drift", "shortDescription": {"text": "Possibly dead Python function: log_drift"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-63afa977bb7a8073", "name": "Possibly dead Python function: patch_openai", "shortDescription": {"text": "Possibly dead Python function: patch_openai"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6cdfcda4a0f65e28", "name": "Possibly dead Python function: patched_create", "shortDescription": {"text": "Possibly dead Python function: patched_create"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2785060328058387", "name": "Possibly dead Python function: langchain_callback", "shortDescription": {"text": "Possibly dead Python function: langchain_callback"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b38e949b65cb8445", "name": "Possibly dead Python function: log_ai_call", "shortDescription": {"text": "Possibly dead Python function: log_ai_call"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2ca0437d9b5b2d30", "name": "Possibly dead Python function: decorator", "shortDescription": {"text": "Possibly dead Python function: decorator"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ef90a1853e7ecc62", "name": "Possibly dead Python function: wrapper", "shortDescription": {"text": "Possibly dead Python function: wrapper"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e23d1fd8bc0a2eea", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/ProjectSwitcher.tsx:105", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/ProjectSwitcher.tsx:105"}, "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-94e120065398ac22", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/notifications/Art73Alert.tsx:45", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/notifications/Art73Alert.tsx:45"}, "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-20ea882e59b4cb73", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/notifications/DeadlineBanner.tsx:49", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/notifications/DeadlineBanner.tsx:49"}, "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-19d6cc693a386cf6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/UserMenu.tsx:99", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/UserMenu.tsx:99"}, "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-09b0e34f9006216b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/disclosure/DisclosureBanner.tsx:36", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/disclosure/DisclosureBanner.tsx:36"}, "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-8ee430d0b20ecd37", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sections/ScannerTeaser.tsx:218", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sections/ScannerTeaser.tsx:218"}, "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-d544f9fa524e320a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tools/AiaArchitectUI.tsx:114", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tools/AiaArchitectUI.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-5684c87fa58aa397", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/page.tsx:147", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/page.tsx:147"}, "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-b6184b4c0ccd042d", "name": "TODO/FIXME marker in shipping code \u2014 src/app/api/rag/refresh/route.ts:54", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/rag/refresh/route.ts:54"}, "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-43d77cd387fbb7f6", "name": "TODO/FIXME marker in shipping code \u2014 src/app/api/cicd/scan/route.ts:81", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/cicd/scan/route.ts:81"}, "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-1769ae34a6775100", "name": "TODO/FIXME marker in shipping code \u2014 src/app/api/logvault/ingest/route.ts:34", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/logvault/ingest/route.ts:34"}, "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-0b1a90bf884210d2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/journey/page.tsx:437", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/journey/page.tsx:437"}, "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-7480cab576d2248d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/connectors/page.tsx:1077", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/connectors/page.tsx:1077"}, "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-c6525326e2b8b818", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/modules/aia-architect/page.tsx:1000", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/modules/aia-architect/page.tsx:1000"}, "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-1541422a8b2c54ee", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/modules/trust-labeler/page.tsx:676", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/modules/trust-labeler/page.tsx:676"}, "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-db0ce1f6d3c8e5c3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/modules/gpai/page.tsx:795", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/modules/gpai/page.tsx:795"}, "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-d9e5d02e7eb006fb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/post-market/page.tsx:1078", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/post-market/page.tsx:1078"}, "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-5a6ceae9cbfdda1b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/evidence-layer/page.tsx:360", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/evidence-layer/page.tsx:360"}, "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-733c5b1ef5efda88", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/onboarding/page.tsx:724", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/onboarding/page.tsx:724"}, "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-2df7dba674a2d172", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/docugen/page.tsx:284", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/docugen/page.tsx:284"}, "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-c21e6843abe529cc", "name": "Icon-only button without accessible name \u2014 src/app/dashboard/tools/inventory/page.tsx:93", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/dashboard/tools/inventory/page.tsx:93"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d747066a2f0b2eb0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/resilience/page.tsx:305", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/resilience/page.tsx:305"}, "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-381f4c451e2af736", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/deployer-dashboard/page.tsx:201", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/deployer-dashboard/page.tsx:201"}, "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-1229ef99608608e2", "name": "Icon-only button without accessible name \u2014 src/app/dashboard/tools/risk-manager/page.tsx:210", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/dashboard/tools/risk-manager/page.tsx:210"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7ea3107400b07932", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dashboard/tools/risk-manager/page.tsx:385", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dashboard/tools/risk-manager/page.tsx:385"}, "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-a06181685a47d81b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/logvault/page.tsx:361", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/logvault/page.tsx:361"}, "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-0613d7ab8951bb84", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/data-audit/page.tsx:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/data-audit/page.tsx:98"}, "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-ef7660f2ffd69306", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/trust-passport/page.tsx:320", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/trust-passport/page.tsx:320"}, "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-0f93794234fae904", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/legal-assistant/page.tsx:615", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/legal-assistant/page.tsx:615"}, "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-6636f999e272d833", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/prohibited/page.tsx:299", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/prohibited/page.tsx:299"}, "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-7af2363c5ccfc4b5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/dossier/page.tsx:389", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/dossier/page.tsx:389"}, "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-74a5f4b903050564", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/scanner/page.tsx:226", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/scanner/page.tsx:226"}, "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-42dac1c0016f9206", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/risorse/[slug]/page.tsx:70", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/risorse/[slug]/page.tsx:70"}, "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-0f45352a329093ee", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/blog/posts.ts:15", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/blog/posts.ts:15"}, "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-ef168c017223c9ef", "name": "Stray `console.log` in TS/JS \u2014 src/lib/auth/email.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/auth/email.ts:25"}, "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-e4a50fde4ad4d069", "name": "Stray `console.log` in TS/JS \u2014 src/lib/compliance/gateway.ts:43", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/compliance/gateway.ts:43"}, "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-f34dab2655311a98", "name": "Stray `console.log` in TS/JS \u2014 sdk/js/aicomply-logvault.ts:215", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 sdk/js/aicomply-logvault.ts:215"}, "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-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ba608516dd7a93e9", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/page.tsx:147", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/page.tsx:147"}, "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-658a09a5caf35c97", "name": "Insecure pattern 'exec_used' in src/app/dashboard/tools/risk-manager/page.tsx:334", "shortDescription": {"text": "Insecure pattern 'exec_used' in src/app/dashboard/tools/risk-manager/page.tsx:334"}, "fullDescription": {"text": "Found a known-risky pattern (exec_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-efa37543de1f0876", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/dashboard/tools/risk-manager/page.tsx:385", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/dashboard/tools/risk-manager/page.tsx:385"}, "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-22ebde1c84e11887", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/app/dashboard/tools/risk-manager/page.tsx:272", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/app/dashboard/tools/risk-manager/page.tsx:272"}, "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-7fce06b6177bb510", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/risorse/[slug]/page.tsx:70", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/risorse/[slug]/page.tsx:70"}, "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-c40517c97f7eda63", "name": "Insecure pattern 'dangerous_innerhtml' in src/lib/blog/posts.ts:15", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/lib/blog/posts.ts:15"}, "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-1cf8e6afc39d6605", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8084adbb265ac348", "name": "Very large file: src/components/ui/ChatAssistant.tsx (1195 lines)", "shortDescription": {"text": "Very large file: src/components/ui/ChatAssistant.tsx (1195 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-7e6ae94de1cb4b9a", "name": "Very large file: src/app/dashboard/triage/page.tsx (1255 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/triage/page.tsx (1255 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-34f6146f3b3df838", "name": "Very large file: src/app/dashboard/connectors/page.tsx (1237 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/connectors/page.tsx (1237 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-816a85ab91e66f07", "name": "Very large file: src/app/dashboard/compliance-nexus/page.tsx (1412 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/compliance-nexus/page.tsx (1412 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-9043c615291db8d3", "name": "Very large file: src/app/dashboard/modules/guardian-agent/page.tsx (963 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/modules/guardian-agent/page.tsx (963 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-8a0ad0c9f04c84e3", "name": "Very large file: src/app/dashboard/modules/trust-labeler/page.tsx (1335 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/modules/trust-labeler/page.tsx (1335 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-7081eafa28073103", "name": "Very large file: src/app/dashboard/modules/gpai/page.tsx (1113 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/modules/gpai/page.tsx (1113 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-74e3b7a2de32b82a", "name": "Very large file: src/app/dashboard/post-market/page.tsx (2477 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/post-market/page.tsx (2477 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-86c11b00f14a9e7f", "name": "Very large file: src/app/dashboard/tools/docugen/page.tsx (1269 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/tools/docugen/page.tsx (1269 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-b35a4b14dd396ca1", "name": "Very large file: src/app/dashboard/tools/art50-kit/page.tsx (839 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/tools/art50-kit/page.tsx (839 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-515f1b10e11f9b20", "name": "Very large file: src/app/dashboard/tools/logvault/page.tsx (937 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/tools/logvault/page.tsx (937 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-d9c4803a995bb3b7", "name": "Very large file: src/app/dashboard/tools/classifier/page.tsx (1579 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/tools/classifier/page.tsx (1579 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-eb266b6c3f96ad6e", "name": "Very large file: src/app/dashboard/tools/fria/page.tsx (1322 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/tools/fria/page.tsx (1322 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-db038c70d57bce12", "name": "Very large file: src/app/dashboard/tools/dpia/page.tsx (1854 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/tools/dpia/page.tsx (1854 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-3b875d34799ea168", "name": "Very large file: src/app/dashboard/tools/gpai/page.tsx (1167 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/tools/gpai/page.tsx (1167 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-c6824f6ffe77a1aa", "name": "Very large file: src/app/dashboard/discovery/page.tsx (2076 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/discovery/page.tsx (2076 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": "5 test file(s) for 321 source file(s) (ratio 0.02). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 83 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 408 placeholder/mock markers across 66 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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. 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-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2679282aa1c484b5", "name": "Agent authority lacks a verifier contract: AGENTS.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: AGENTS.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-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-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-36634ef418c101df", "name": "Network/subprocess call without timeout or try/except \u2014 rag/embedder.py:78", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 rag/embedder.py:78"}, "fullDescription": {"text": "`urllib.request.urlopen(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-739e721ddee88572", "name": "Network/subprocess call without timeout or try/except \u2014 rag/run_ingest.py:111", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 rag/run_ingest.py:111"}, "fullDescription": {"text": "`urllib.request.urlopen(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4b7de80442ad3d83", "name": "Commented-code block (6 lines) in rag/aesia_ingester.py:25", "shortDescription": {"text": "Commented-code block (6 lines) in rag/aesia_ingester.py:25"}, "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-5f9ac44a9af3b933", "name": "Legacy-named symbol `aicomply_deadline_banner_dismissed_v2` in src/components/notifications/DeadlineBanner.tsx:12", "shortDescription": {"text": "Legacy-named symbol `aicomply_deadline_banner_dismissed_v2` in src/components/notifications/DeadlineBanner.tsx:12"}, "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-748f94a1f211b9be", "name": "Commented-code block (5 lines) in src/app/api/rag/refresh/route.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/rag/refresh/route.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-7d3bf3fad9492e20", "name": "Legacy-named symbol `aicomply_deadline_banner_dismissed_v2` in src/app/dashboard/page.tsx:250", "shortDescription": {"text": "Legacy-named symbol `aicomply_deadline_banner_dismissed_v2` in src/app/dashboard/page.tsx:250"}, "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-f3178d305e52fefb", "name": "Legacy-named symbol `aicomply_trust_center_v1` in src/app/dashboard/layout.tsx:168", "shortDescription": {"text": "Legacy-named symbol `aicomply_trust_center_v1` in src/app/dashboard/layout.tsx:168"}, "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-6fa445a6152965b2", "name": "Legacy-named symbol `aicomply_risk_register_v1` in src/app/dashboard/post-market/page.tsx:1992", "shortDescription": {"text": "Legacy-named symbol `aicomply_risk_register_v1` in src/app/dashboard/post-market/page.tsx:1992"}, "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-a00e0db52172938e", "name": "Legacy-named symbol `aicomply_oversight_record_v1` in src/app/dashboard/tools/logvault/page.tsx:421", "shortDescription": {"text": "Legacy-named symbol `aicomply_oversight_record_v1` in src/app/dashboard/tools/logvault/page.tsx:421"}, "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-ced017b077729f1b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/tools/classifier/page.tsx:285", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/tools/classifier/page.tsx:285"}, "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-c9e8948190bbea7d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/tools/literacy/page.tsx:156", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/tools/literacy/page.tsx:156"}, "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-28f3b34620b8862d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/simulation/connectors-engine.ts:290", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/simulation/connectors-engine.ts:290"}, "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-d1294deecfa14ea2", "name": "Legacy-named symbol `aicomply_pmm_plan_v1` in src/lib/provider-transition/provider-transition-types.ts:217", "shortDescription": {"text": "Legacy-named symbol `aicomply_pmm_plan_v1` in src/lib/provider-transition/provider-transition-types.ts:217"}, "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-cf43bb798dc3a4c5", "name": "Legacy-named symbol `aicomply_art50_record_v1` in src/lib/art50/art50-types.ts:98", "shortDescription": {"text": "Legacy-named symbol `aicomply_art50_record_v1` in src/lib/art50/art50-types.ts:98"}, "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-6a6ec05d89dfb7a7", "name": "Legacy-named symbol `aicomply_auth_rep_draft_v2` in src/lib/authorized-rep/authorized-rep-types.ts:4", "shortDescription": {"text": "Legacy-named symbol `aicomply_auth_rep_draft_v2` in src/lib/authorized-rep/authorized-rep-types.ts:4"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e0e4e7dbdd589f76", "name": "Legacy-named symbol `aicomply_oversight_record_v1` in src/lib/oversight/oversight-types.ts:56", "shortDescription": {"text": "Legacy-named symbol `aicomply_oversight_record_v1` in src/lib/oversight/oversight-types.ts:56"}, "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-d7406a52ea3f2f7e", "name": "Legacy-named symbol `aicomply_eudb_draft_v2` in src/lib/deadlines/deadline-aggregator.ts:21", "shortDescription": {"text": "Legacy-named symbol `aicomply_eudb_draft_v2` in src/lib/deadlines/deadline-aggregator.ts:21"}, "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-26031a8672ee685d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rag/rag-vertex.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rag/rag-vertex.ts:27"}, "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-ace466f83178646f", "name": "Legacy-named symbol `aicomply_logvault_record_v1` in src/lib/incidents/incident-actions.ts:59", "shortDescription": {"text": "Legacy-named symbol `aicomply_logvault_record_v1` in src/lib/incidents/incident-actions.ts:59"}, "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-9857e48444b75545", "name": "Legacy-named symbol `aicomply_eudb_draft_v2` in src/lib/eudb/eudb-prefill.ts:57", "shortDescription": {"text": "Legacy-named symbol `aicomply_eudb_draft_v2` in src/lib/eudb/eudb-prefill.ts:57"}, "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-22101ba7ea53df29", "name": "Legacy-named symbol `aicomply_logvault_record_v1` in src/lib/logvault/logvault-types.ts:57", "shortDescription": {"text": "Legacy-named symbol `aicomply_logvault_record_v1` in src/lib/logvault/logvault-types.ts:57"}, "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-3c14d27b5f53589e", "name": "Legacy-named symbol `aicomply_art5_emotion_biometric_v1` in src/lib/art5/art5-emotion-biometric-types.ts:41", "shortDescription": {"text": "Legacy-named symbol `aicomply_art5_emotion_biometric_v1` in src/lib/art5/art5-emotion-biometric-types.ts:41"}, "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-a3335b48232b4c87", "name": "Legacy-named symbol `aicomply_pmm_plan_v1` in src/lib/post-market/post-market-types.ts:60", "shortDescription": {"text": "Legacy-named symbol `aicomply_pmm_plan_v1` in src/lib/post-market/post-market-types.ts:60"}, "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-78c0c75300c0e047", "name": "Legacy-named symbol `aicomply_data_audit_v1` in src/lib/data-audit/data-audit-types.ts:71", "shortDescription": {"text": "Legacy-named symbol `aicomply_data_audit_v1` in src/lib/data-audit/data-audit-types.ts:71"}, "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-48fce99666f645d8", "name": "Legacy-named symbol `aicomply_deployer_dashboard_v1` in src/lib/deployer/deployer-types.ts:60", "shortDescription": {"text": "Legacy-named symbol `aicomply_deployer_dashboard_v1` in src/lib/deployer/deployer-types.ts:60"}, "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-cf25e1aa262e66bf", "name": "Legacy-named symbol `aicomply_trust_center_v1` in src/lib/trust-center/trust-center-types.ts:124", "shortDescription": {"text": "Legacy-named symbol `aicomply_trust_center_v1` in src/lib/trust-center/trust-center-types.ts:124"}, "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-a8094f62184f4c79", "name": "Stub function `start_trace` (body is just `pass`/`return`) \u2014 sdk/python/aicomply_llamaindex.py:173", "shortDescription": {"text": "Stub function `start_trace` (body is just `pass`/`return`) \u2014 sdk/python/aicomply_llamaindex.py:173"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nrag/chunkers/generic.py:char_to_page, rag/chunkers/guidelines.py:char_to_page, rag/chunkers/iso.py:char_to_page\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nsdk/python/aicomply_llamaindex.py:on_event_start, sdk/python/aicomply_llamaindex.py:on_event_end\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/21876"}, "properties": {"repository": "UmbertoMott/aiactcomply", "repoUrl": "https://github.com/UmbertoMott/aiactcomply", "branch": "main"}, "results": [{"ruleId": "scanner-bdaf02848352b2c7", "level": "note", "message": {"text": "Possibly dead Python function: answer_with_rag"}, "properties": {"repobilityId": "ea4dfe26d26045a9", "scanner": "scanner-primary", "fingerprint": "bdaf02848352b2c7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "rag/rag_answer.py:95"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-57f46b1c73a2dc3c", "level": "note", "message": {"text": "Possibly dead Python function: mark_superseded"}, "properties": {"repobilityId": "1ad09b8c6722195d", "scanner": "scanner-primary", "fingerprint": "57f46b1c73a2dc3c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "rag/auto_update.py:303"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d0bfe9333f35e2c9", "level": "note", "message": {"text": "Possibly dead Python function: detect_normative_conflict"}, "properties": {"repobilityId": "bf7bb50c450b0875", "scanner": "scanner-primary", "fingerprint": "d0bfe9333f35e2c9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "rag/auto_update.py:386"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6647cff122795f81", "level": "note", "message": {"text": "Possibly dead Python function: start_trace"}, "properties": {"repobilityId": "81a16c7438f77e7e", "scanner": "scanner-primary", "fingerprint": "6647cff122795f81", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sdk/python/aicomply_llamaindex.py:173"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-beb230562a206a48", "level": "note", "message": {"text": "Possibly dead Python function: end_trace"}, "properties": {"repobilityId": "f8ed6989045f6276", "scanner": "scanner-primary", "fingerprint": "beb230562a206a48", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sdk/python/aicomply_llamaindex.py:176"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0ab3a058de1db9b9", "level": "note", "message": {"text": "Possibly dead Python function: log_alert"}, "properties": {"repobilityId": "a44b9a2f9cc6b765", "scanner": "scanner-primary", "fingerprint": "0ab3a058de1db9b9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sdk/python/aicomply_logvault.py:125"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f482b746abc6b4ad", "level": "note", "message": {"text": "Possibly dead Python function: log_drift"}, "properties": {"repobilityId": "18429ca0cb135de2", "scanner": "scanner-primary", "fingerprint": "f482b746abc6b4ad", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sdk/python/aicomply_logvault.py:148"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-63afa977bb7a8073", "level": "note", "message": {"text": "Possibly dead Python function: patch_openai"}, "properties": {"repobilityId": "6c9a172ea589fbad", "scanner": "scanner-primary", "fingerprint": "63afa977bb7a8073", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sdk/python/aicomply_logvault.py:183"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6cdfcda4a0f65e28", "level": "note", "message": {"text": "Possibly dead Python function: patched_create"}, "properties": {"repobilityId": "f57de7578b0817ae", "scanner": "scanner-primary", "fingerprint": "6cdfcda4a0f65e28", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sdk/python/aicomply_logvault.py:195"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2785060328058387", "level": "note", "message": {"text": "Possibly dead Python function: langchain_callback"}, "properties": {"repobilityId": "2217478257619f14", "scanner": "scanner-primary", "fingerprint": "2785060328058387", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sdk/python/aicomply_logvault.py:223"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b38e949b65cb8445", "level": "note", "message": {"text": "Possibly dead Python function: log_ai_call"}, "properties": {"repobilityId": "590beb06b7a2c63d", "scanner": "scanner-primary", "fingerprint": "b38e949b65cb8445", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sdk/python/aicomply_logvault.py:309"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2ca0437d9b5b2d30", "level": "note", "message": {"text": "Possibly dead Python function: decorator"}, "properties": {"repobilityId": "ffbcbc9bc189af1c", "scanner": "scanner-primary", "fingerprint": "2ca0437d9b5b2d30", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sdk/python/aicomply_logvault.py:318"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ef90a1853e7ecc62", "level": "note", "message": {"text": "Possibly dead Python function: wrapper"}, "properties": {"repobilityId": "1dc9acbcc8ce537d", "scanner": "scanner-primary", "fingerprint": "ef90a1853e7ecc62", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sdk/python/aicomply_logvault.py:319"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-e23d1fd8bc0a2eea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/ProjectSwitcher.tsx:105"}, "properties": {"repobilityId": "86467c5d4f13850b", "scanner": "scanner-primary", "fingerprint": "e23d1fd8bc0a2eea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-94e120065398ac22", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/notifications/Art73Alert.tsx:45"}, "properties": {"repobilityId": "acda32b1f4f9689b", "scanner": "scanner-primary", "fingerprint": "94e120065398ac22", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-20ea882e59b4cb73", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/notifications/DeadlineBanner.tsx:49"}, "properties": {"repobilityId": "c525a2596d40550b", "scanner": "scanner-primary", "fingerprint": "20ea882e59b4cb73", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-19d6cc693a386cf6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/UserMenu.tsx:99"}, "properties": {"repobilityId": "9c300b6801b11cd1", "scanner": "scanner-primary", "fingerprint": "19d6cc693a386cf6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-09b0e34f9006216b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/disclosure/DisclosureBanner.tsx:36"}, "properties": {"repobilityId": "ff6370bba8cb1f32", "scanner": "scanner-primary", "fingerprint": "09b0e34f9006216b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8ee430d0b20ecd37", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sections/ScannerTeaser.tsx:218"}, "properties": {"repobilityId": "58aca1b31b1cd561", "scanner": "scanner-primary", "fingerprint": "8ee430d0b20ecd37", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d544f9fa524e320a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tools/AiaArchitectUI.tsx:114"}, "properties": {"repobilityId": "f47c9970d668e614", "scanner": "scanner-primary", "fingerprint": "d544f9fa524e320a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5684c87fa58aa397", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/page.tsx:147"}, "properties": {"repobilityId": "4d4ab3e03315f684", "scanner": "scanner-primary", "fingerprint": "5684c87fa58aa397", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b6184b4c0ccd042d", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/rag/refresh/route.ts:54"}, "properties": {"repobilityId": "efc5908987403b0a", "scanner": "scanner-primary", "fingerprint": "b6184b4c0ccd042d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-43d77cd387fbb7f6", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/cicd/scan/route.ts:81"}, "properties": {"repobilityId": "6c6d1084ff1ba7e5", "scanner": "scanner-primary", "fingerprint": "43d77cd387fbb7f6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-1769ae34a6775100", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/logvault/ingest/route.ts:34"}, "properties": {"repobilityId": "ff614c559f10a717", "scanner": "scanner-primary", "fingerprint": "1769ae34a6775100", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-0b1a90bf884210d2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/journey/page.tsx:437"}, "properties": {"repobilityId": "81a8c8a06600c3af", "scanner": "scanner-primary", "fingerprint": "0b1a90bf884210d2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7480cab576d2248d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/connectors/page.tsx:1077"}, "properties": {"repobilityId": "855940b8d0e4110d", "scanner": "scanner-primary", "fingerprint": "7480cab576d2248d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c6525326e2b8b818", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/modules/aia-architect/page.tsx:1000"}, "properties": {"repobilityId": "164414d0d281aeef", "scanner": "scanner-primary", "fingerprint": "c6525326e2b8b818", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1541422a8b2c54ee", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/modules/trust-labeler/page.tsx:676"}, "properties": {"repobilityId": "005de6986b62e327", "scanner": "scanner-primary", "fingerprint": "1541422a8b2c54ee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-db0ce1f6d3c8e5c3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/modules/gpai/page.tsx:795"}, "properties": {"repobilityId": "0a9d8f93ba79e67d", "scanner": "scanner-primary", "fingerprint": "db0ce1f6d3c8e5c3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d9e5d02e7eb006fb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/post-market/page.tsx:1078"}, "properties": {"repobilityId": "42c51276c008b866", "scanner": "scanner-primary", "fingerprint": "d9e5d02e7eb006fb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5a6ceae9cbfdda1b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/evidence-layer/page.tsx:360"}, "properties": {"repobilityId": "b1e2cc0865965400", "scanner": "scanner-primary", "fingerprint": "5a6ceae9cbfdda1b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-733c5b1ef5efda88", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/onboarding/page.tsx:724"}, "properties": {"repobilityId": "87a90091d1fb5a49", "scanner": "scanner-primary", "fingerprint": "733c5b1ef5efda88", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2df7dba674a2d172", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/docugen/page.tsx:284"}, "properties": {"repobilityId": "3e4ef44323876a9f", "scanner": "scanner-primary", "fingerprint": "2df7dba674a2d172", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c21e6843abe529cc", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/dashboard/tools/inventory/page.tsx:93"}, "properties": {"repobilityId": "d079aaca59881627", "scanner": "scanner-primary", "fingerprint": "c21e6843abe529cc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-d747066a2f0b2eb0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/resilience/page.tsx:305"}, "properties": {"repobilityId": "81a8cdd0da4d44fc", "scanner": "scanner-primary", "fingerprint": "d747066a2f0b2eb0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-381f4c451e2af736", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/deployer-dashboard/page.tsx:201"}, "properties": {"repobilityId": "9b066fd8bf7a3b74", "scanner": "scanner-primary", "fingerprint": "381f4c451e2af736", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1229ef99608608e2", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/dashboard/tools/risk-manager/page.tsx:210"}, "properties": {"repobilityId": "e85e6dc2a2f8f4f7", "scanner": "scanner-primary", "fingerprint": "1229ef99608608e2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-7ea3107400b07932", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dashboard/tools/risk-manager/page.tsx:385"}, "properties": {"repobilityId": "a160d7c113e2c28f", "scanner": "scanner-primary", "fingerprint": "7ea3107400b07932", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a06181685a47d81b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/logvault/page.tsx:361"}, "properties": {"repobilityId": "20ebc83d5ed8e983", "scanner": "scanner-primary", "fingerprint": "a06181685a47d81b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0613d7ab8951bb84", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/data-audit/page.tsx:98"}, "properties": {"repobilityId": "f0dd866768609544", "scanner": "scanner-primary", "fingerprint": "0613d7ab8951bb84", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ef7660f2ffd69306", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/trust-passport/page.tsx:320"}, "properties": {"repobilityId": "ff7df788eb703e5e", "scanner": "scanner-primary", "fingerprint": "ef7660f2ffd69306", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0f93794234fae904", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/legal-assistant/page.tsx:615"}, "properties": {"repobilityId": "913af0c74f53d60d", "scanner": "scanner-primary", "fingerprint": "0f93794234fae904", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6636f999e272d833", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/tools/prohibited/page.tsx:299"}, "properties": {"repobilityId": "34f6e3fa2bfca315", "scanner": "scanner-primary", "fingerprint": "6636f999e272d833", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7af2363c5ccfc4b5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/dossier/page.tsx:389"}, "properties": {"repobilityId": "f1fbe8a55af81e5d", "scanner": "scanner-primary", "fingerprint": "7af2363c5ccfc4b5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-74a5f4b903050564", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/scanner/page.tsx:226"}, "properties": {"repobilityId": "b224f81b735ae36e", "scanner": "scanner-primary", "fingerprint": "74a5f4b903050564", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-42dac1c0016f9206", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/risorse/[slug]/page.tsx:70"}, "properties": {"repobilityId": "a2ce93f28d1bcb3e", "scanner": "scanner-primary", "fingerprint": "42dac1c0016f9206", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0f45352a329093ee", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/blog/posts.ts:15"}, "properties": {"repobilityId": "30ce83d2f2d48695", "scanner": "scanner-primary", "fingerprint": "0f45352a329093ee", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ef168c017223c9ef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/auth/email.ts:25"}, "properties": {"repobilityId": "3de584b5bc43f1ed", "scanner": "scanner-primary", "fingerprint": "ef168c017223c9ef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e4a50fde4ad4d069", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/compliance/gateway.ts:43"}, "properties": {"repobilityId": "25a576248266f5d4", "scanner": "scanner-primary", "fingerprint": "e4a50fde4ad4d069", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f34dab2655311a98", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 sdk/js/aicomply-logvault.ts:215"}, "properties": {"repobilityId": "967932ea8c921a97", "scanner": "scanner-primary", "fingerprint": "f34dab2655311a98", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-ba608516dd7a93e9", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/page.tsx:147"}, "properties": {"repobilityId": "88fd235b712bda65", "scanner": "scanner-primary", "fingerprint": "ba608516dd7a93e9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/page.tsx"}, "region": {"startLine": 147}}}]}, {"ruleId": "scanner-658a09a5caf35c97", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in src/app/dashboard/tools/risk-manager/page.tsx:334"}, "properties": {"repobilityId": "1c1da9e5a703e7b0", "scanner": "scanner-primary", "fingerprint": "658a09a5caf35c97", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/dashboard/tools/risk-manager/page.tsx"}, "region": {"startLine": 334}}}]}, {"ruleId": "scanner-efa37543de1f0876", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/dashboard/tools/risk-manager/page.tsx:385"}, "properties": {"repobilityId": "9aebda2e4708c7f9", "scanner": "scanner-primary", "fingerprint": "efa37543de1f0876", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/dashboard/tools/risk-manager/page.tsx"}, "region": {"startLine": 385}}}]}, {"ruleId": "scanner-22ebde1c84e11887", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/app/dashboard/tools/risk-manager/page.tsx:272"}, "properties": {"repobilityId": "6b50fb9de4a47ee4", "scanner": "scanner-primary", "fingerprint": "22ebde1c84e11887", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/dashboard/tools/risk-manager/page.tsx"}, "region": {"startLine": 272}}}]}, {"ruleId": "scanner-7fce06b6177bb510", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/risorse/[slug]/page.tsx:70"}, "properties": {"repobilityId": "32bfdc6b11f44c5e", "scanner": "scanner-primary", "fingerprint": "7fce06b6177bb510", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/risorse/[slug]/page.tsx"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-c40517c97f7eda63", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/lib/blog/posts.ts:15"}, "properties": {"repobilityId": "3b14bbfb1f870a09", "scanner": "scanner-primary", "fingerprint": "c40517c97f7eda63", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/blog/posts.ts"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-1cf8e6afc39d6605", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "694c877a79295616", "scanner": "scanner-primary", "fingerprint": "1cf8e6afc39d6605", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/aicomply-scan.yml"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-8084adbb265ac348", "level": "note", "message": {"text": "Very large file: src/components/ui/ChatAssistant.tsx (1195 lines)"}, "properties": {"repobilityId": "4f5db4a31f04497c", "scanner": "scanner-primary", "fingerprint": "8084adbb265ac348", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7e6ae94de1cb4b9a", "level": "note", "message": {"text": "Very large file: src/app/dashboard/triage/page.tsx (1255 lines)"}, "properties": {"repobilityId": "54e4d6a3ab97303b", "scanner": "scanner-primary", "fingerprint": "7e6ae94de1cb4b9a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-34f6146f3b3df838", "level": "note", "message": {"text": "Very large file: src/app/dashboard/connectors/page.tsx (1237 lines)"}, "properties": {"repobilityId": "6443c054df4f5378", "scanner": "scanner-primary", "fingerprint": "34f6146f3b3df838", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-816a85ab91e66f07", "level": "note", "message": {"text": "Very large file: src/app/dashboard/compliance-nexus/page.tsx (1412 lines)"}, "properties": {"repobilityId": "916beaf20bb896b2", "scanner": "scanner-primary", "fingerprint": "816a85ab91e66f07", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9043c615291db8d3", "level": "note", "message": {"text": "Very large file: src/app/dashboard/modules/guardian-agent/page.tsx (963 lines)"}, "properties": {"repobilityId": "3b159e2ec664943f", "scanner": "scanner-primary", "fingerprint": "9043c615291db8d3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8a0ad0c9f04c84e3", "level": "note", "message": {"text": "Very large file: src/app/dashboard/modules/trust-labeler/page.tsx (1335 lines)"}, "properties": {"repobilityId": "bfd447030b23da44", "scanner": "scanner-primary", "fingerprint": "8a0ad0c9f04c84e3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7081eafa28073103", "level": "note", "message": {"text": "Very large file: src/app/dashboard/modules/gpai/page.tsx (1113 lines)"}, "properties": {"repobilityId": "d48850f6a888b27b", "scanner": "scanner-primary", "fingerprint": "7081eafa28073103", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-74e3b7a2de32b82a", "level": "note", "message": {"text": "Very large file: src/app/dashboard/post-market/page.tsx (2477 lines)"}, "properties": {"repobilityId": "c6536c1d8caea12d", "scanner": "scanner-primary", "fingerprint": "74e3b7a2de32b82a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-86c11b00f14a9e7f", "level": "note", "message": {"text": "Very large file: src/app/dashboard/tools/docugen/page.tsx (1269 lines)"}, "properties": {"repobilityId": "fb08b512854d6577", "scanner": "scanner-primary", "fingerprint": "86c11b00f14a9e7f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b35a4b14dd396ca1", "level": "note", "message": {"text": "Very large file: src/app/dashboard/tools/art50-kit/page.tsx (839 lines)"}, "properties": {"repobilityId": "d0b45b1fa748f257", "scanner": "scanner-primary", "fingerprint": "b35a4b14dd396ca1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-515f1b10e11f9b20", "level": "note", "message": {"text": "Very large file: src/app/dashboard/tools/logvault/page.tsx (937 lines)"}, "properties": {"repobilityId": "d91e534144efcd3f", "scanner": "scanner-primary", "fingerprint": "515f1b10e11f9b20", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d9c4803a995bb3b7", "level": "note", "message": {"text": "Very large file: src/app/dashboard/tools/classifier/page.tsx (1579 lines)"}, "properties": {"repobilityId": "904038ddc4dbd220", "scanner": "scanner-primary", "fingerprint": "d9c4803a995bb3b7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-eb266b6c3f96ad6e", "level": "note", "message": {"text": "Very large file: src/app/dashboard/tools/fria/page.tsx (1322 lines)"}, "properties": {"repobilityId": "2543ea8c6333b3bf", "scanner": "scanner-primary", "fingerprint": "eb266b6c3f96ad6e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-db038c70d57bce12", "level": "note", "message": {"text": "Very large file: src/app/dashboard/tools/dpia/page.tsx (1854 lines)"}, "properties": {"repobilityId": "1aa126d23fd8f68e", "scanner": "scanner-primary", "fingerprint": "db038c70d57bce12", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3b875d34799ea168", "level": "note", "message": {"text": "Very large file: src/app/dashboard/tools/gpai/page.tsx (1167 lines)"}, "properties": {"repobilityId": "30cbdfdcf168d074", "scanner": "scanner-primary", "fingerprint": "3b875d34799ea168", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c6824f6ffe77a1aa", "level": "note", "message": {"text": "Very large file: src/app/dashboard/discovery/page.tsx (2076 lines)"}, "properties": {"repobilityId": "16d46121df77004b", "scanner": "scanner-primary", "fingerprint": "c6824f6ffe77a1aa", "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": "879a92edaa66be27", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "eba795aa81c770f0", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "f1c18255b7e60228", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "d43b2645cb5c0725", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "bd438f02e4537ca8", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "0ff550826413e4b8", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "6e52cf5f424a00d1", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "8b76531988f02b6c", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-2679282aa1c484b5", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: AGENTS.md"}, "properties": {"repobilityId": "27d579812e6be614", "scanner": "scanner-primary", "fingerprint": "2679282aa1c484b5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "agents_md"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "AGENTS.md"}, "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-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-36634ef418c101df", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 rag/embedder.py:78"}, "properties": {"repobilityId": "e2e5d7509c66a82e", "scanner": "scanner-primary", "fingerprint": "36634ef418c101df", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-739e721ddee88572", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 rag/run_ingest.py:111"}, "properties": {"repobilityId": "2c9a84aca9761aa1", "scanner": "scanner-primary", "fingerprint": "739e721ddee88572", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4b7de80442ad3d83", "level": "none", "message": {"text": "Commented-code block (6 lines) in rag/aesia_ingester.py:25"}, "properties": {"repobilityId": "e939d3ff464dd80a", "scanner": "scanner-primary", "fingerprint": "4b7de80442ad3d83", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5f9ac44a9af3b933", "level": "note", "message": {"text": "Legacy-named symbol `aicomply_deadline_banner_dismissed_v2` in src/components/notifications/DeadlineBanner.tsx:12"}, "properties": {"repobilityId": "9b15d1e1f0956e09", "scanner": "scanner-primary", "fingerprint": "5f9ac44a9af3b933", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-748f94a1f211b9be", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/rag/refresh/route.ts:1"}, "properties": {"repobilityId": "102bdda8aa2e48f6", "scanner": "scanner-primary", "fingerprint": "748f94a1f211b9be", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7d3bf3fad9492e20", "level": "note", "message": {"text": "Legacy-named symbol `aicomply_deadline_banner_dismissed_v2` in src/app/dashboard/page.tsx:250"}, "properties": {"repobilityId": "5ece7949f2fd7555", "scanner": "scanner-primary", "fingerprint": "7d3bf3fad9492e20", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f3178d305e52fefb", "level": "note", "message": {"text": "Legacy-named symbol `aicomply_trust_center_v1` in src/app/dashboard/layout.tsx:168"}, "properties": {"repobilityId": "449b47918727dec4", "scanner": "scanner-primary", "fingerprint": "f3178d305e52fefb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6fa445a6152965b2", "level": "note", "message": {"text": "Legacy-named symbol `aicomply_risk_register_v1` in src/app/dashboard/post-market/page.tsx:1992"}, "properties": {"repobilityId": "26b92ca66f8a93a9", "scanner": "scanner-primary", "fingerprint": "6fa445a6152965b2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a00e0db52172938e", "level": "note", "message": {"text": "Legacy-named symbol `aicomply_oversight_record_v1` in src/app/dashboard/tools/logvault/page.tsx:421"}, "properties": {"repobilityId": "de9596284a828314", "scanner": "scanner-primary", "fingerprint": "a00e0db52172938e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ced017b077729f1b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/tools/classifier/page.tsx:285"}, "properties": {"repobilityId": "cfee991eb6227476", "scanner": "scanner-primary", "fingerprint": "ced017b077729f1b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c9e8948190bbea7d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/tools/literacy/page.tsx:156"}, "properties": {"repobilityId": "fa448d36b778ca8c", "scanner": "scanner-primary", "fingerprint": "c9e8948190bbea7d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-28f3b34620b8862d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/simulation/connectors-engine.ts:290"}, "properties": {"repobilityId": "ce13acf69ad27f12", "scanner": "scanner-primary", "fingerprint": "28f3b34620b8862d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d1294deecfa14ea2", "level": "note", "message": {"text": "Legacy-named symbol `aicomply_pmm_plan_v1` in src/lib/provider-transition/provider-transition-types.ts:217"}, "properties": {"repobilityId": "a9f1eea373b8525f", "scanner": "scanner-primary", "fingerprint": "d1294deecfa14ea2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-cf43bb798dc3a4c5", "level": "note", "message": {"text": "Legacy-named symbol `aicomply_art50_record_v1` in src/lib/art50/art50-types.ts:98"}, "properties": {"repobilityId": "0b5b6a10c83e1aa5", "scanner": "scanner-primary", "fingerprint": "cf43bb798dc3a4c5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6a6ec05d89dfb7a7", "level": "note", "message": {"text": "Legacy-named symbol `aicomply_auth_rep_draft_v2` in src/lib/authorized-rep/authorized-rep-types.ts:4"}, "properties": {"repobilityId": "8015db6608a6e0d5", "scanner": "scanner-primary", "fingerprint": "6a6ec05d89dfb7a7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e0e4e7dbdd589f76", "level": "note", "message": {"text": "Legacy-named symbol `aicomply_oversight_record_v1` in src/lib/oversight/oversight-types.ts:56"}, "properties": {"repobilityId": "70f1aa230ff54498", "scanner": "scanner-primary", "fingerprint": "e0e4e7dbdd589f76", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d7406a52ea3f2f7e", "level": "note", "message": {"text": "Legacy-named symbol `aicomply_eudb_draft_v2` in src/lib/deadlines/deadline-aggregator.ts:21"}, "properties": {"repobilityId": "4fe8ffac86170f63", "scanner": "scanner-primary", "fingerprint": "d7406a52ea3f2f7e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-26031a8672ee685d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rag/rag-vertex.ts:27"}, "properties": {"repobilityId": "b00f64ce758ea92d", "scanner": "scanner-primary", "fingerprint": "26031a8672ee685d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ace466f83178646f", "level": "note", "message": {"text": "Legacy-named symbol `aicomply_logvault_record_v1` in src/lib/incidents/incident-actions.ts:59"}, "properties": {"repobilityId": "5a68f3f20067d2ea", "scanner": "scanner-primary", "fingerprint": "ace466f83178646f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9857e48444b75545", "level": "note", "message": {"text": "Legacy-named symbol `aicomply_eudb_draft_v2` in src/lib/eudb/eudb-prefill.ts:57"}, "properties": {"repobilityId": "c135733e8ffc0967", "scanner": "scanner-primary", "fingerprint": "9857e48444b75545", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-22101ba7ea53df29", "level": "note", "message": {"text": "Legacy-named symbol `aicomply_logvault_record_v1` in src/lib/logvault/logvault-types.ts:57"}, "properties": {"repobilityId": "da7cc97d34798719", "scanner": "scanner-primary", "fingerprint": "22101ba7ea53df29", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3c14d27b5f53589e", "level": "note", "message": {"text": "Legacy-named symbol `aicomply_art5_emotion_biometric_v1` in src/lib/art5/art5-emotion-biometric-types.ts:41"}, "properties": {"repobilityId": "024d275df6d02b4a", "scanner": "scanner-primary", "fingerprint": "3c14d27b5f53589e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a3335b48232b4c87", "level": "note", "message": {"text": "Legacy-named symbol `aicomply_pmm_plan_v1` in src/lib/post-market/post-market-types.ts:60"}, "properties": {"repobilityId": "1c60cfad59e65e9a", "scanner": "scanner-primary", "fingerprint": "a3335b48232b4c87", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-78c0c75300c0e047", "level": "note", "message": {"text": "Legacy-named symbol `aicomply_data_audit_v1` in src/lib/data-audit/data-audit-types.ts:71"}, "properties": {"repobilityId": "3aed43c0f2e627d5", "scanner": "scanner-primary", "fingerprint": "78c0c75300c0e047", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-48fce99666f645d8", "level": "note", "message": {"text": "Legacy-named symbol `aicomply_deployer_dashboard_v1` in src/lib/deployer/deployer-types.ts:60"}, "properties": {"repobilityId": "6627f3106c23c43f", "scanner": "scanner-primary", "fingerprint": "48fce99666f645d8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-cf25e1aa262e66bf", "level": "note", "message": {"text": "Legacy-named symbol `aicomply_trust_center_v1` in src/lib/trust-center/trust-center-types.ts:124"}, "properties": {"repobilityId": "5596d7cfe54d3412", "scanner": "scanner-primary", "fingerprint": "cf25e1aa262e66bf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a8094f62184f4c79", "level": "note", "message": {"text": "Stub function `start_trace` (body is just `pass`/`return`) \u2014 sdk/python/aicomply_llamaindex.py:173"}, "properties": {"repobilityId": "1d2c68cd768b3af3", "scanner": "scanner-primary", "fingerprint": "a8094f62184f4c79", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "e8cefc38e08d0996", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "67c8c8bb5e0bbabf", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}