{"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-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-a33b48a6fd51a906", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/stakeholders/communication/participant-pills-strip.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/stakeholders/communication/participant-pills-strip.tsx:146"}, "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-c51c32eb2d122fba", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/stakeholders/communication/communication-tab.tsx:371", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/stakeholders/communication/communication-tab.tsx:371"}, "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-613c5d3624a8ebd8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/releases/release-context-panel.tsx:32", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/releases/release-context-panel.tsx:32"}, "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-01121cb088773cfe", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/releases/release-scope-panel.tsx:119", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/releases/release-scope-panel.tsx:119"}, "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-69fb193d3ac4d3df", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/releases/release-page-client.tsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/releases/release-page-client.tsx:123"}, "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-f15e23d86ab1755f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/connectors/connectors-page-client.tsx:281", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/connectors/connectors-page-client.tsx:281"}, "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-f15978828f1259d9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/connectors/jira-webhook-tokens.tsx:199", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/connectors/jira-webhook-tokens.tsx:199"}, "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-48189043c9082275", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/parent-project-banner.tsx:125", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/parent-project-banner.tsx:125"}, "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-87c72781d0bcbc22", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/trajectory-graph-view.tsx:1008", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/trajectory-graph-view.tsx:1008"}, "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-6e00e1b77b9eca74", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposal-drawer.tsx:385", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposal-drawer.tsx:385"}, "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-241e64f81211d254", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/projects-table.tsx:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/projects-table.tsx:107"}, "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-1b6c241b5c0c9b34", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/stakeholders/stakeholder-suggestions.tsx:59", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/stakeholders/stakeholder-suggestions.tsx:59"}, "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-a393e494b013d13c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/stakeholders/stakeholder-table.tsx:104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/stakeholders/stakeholder-table.tsx:104"}, "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-18e52e877344ebe8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/goals/goal-detail-panel.tsx:321", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/goals/goal-detail-panel.tsx:321"}, "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-1813de1cac767cb8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/goals/source-ref-combobox.tsx:83", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/goals/source-ref-combobox.tsx:83"}, "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-44c97f644f70446b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposals/resource-swap-tab.tsx:277", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposals/resource-swap-tab.tsx:277"}, "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-2d197bc658420a29", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposals/backlog-proposal-tab.tsx:805", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposals/backlog-proposal-tab.tsx:805"}, "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-39ab3ef9b41db689", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposals/backlog-proposal-tree-node.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposals/backlog-proposal-tree-node.tsx:222"}, "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-dd9e18b4f79f04a5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposals/stakeholder-proposal-tab.tsx:5", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposals/stakeholder-proposal-tab.tsx:557"}, "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-57f131747b487525", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposals/cross-project-links-tab.tsx:28", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposals/cross-project-links-tab.tsx:287"}, "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-2fa81daa48a4d71e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposals/risk-proposal-tab.tsx:519", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposals/risk-proposal-tab.tsx:519"}, "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-681ed669b7c3b193", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/trajectory/trajectory-node-detail-panel.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/trajectory/trajectory-node-detail-panel.tsx:197"}, "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-bf75f313aa206e50", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/trajectory/plan-mutate-dialog.tsx:869", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/trajectory/plan-mutate-dialog.tsx:869"}, "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-fa93bbeeda808805", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/trajectory/bulk-action-bar.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/trajectory/bulk-action-bar.tsx:92"}, "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-bedd6719d6ba90b2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/risks/risk-matrix.tsx:104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/risks/risk-matrix.tsx:104"}, "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-25618fecbe501422", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/risks/risk-links-tab.tsx:246", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/risks/risk-links-tab.tsx:246"}, "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-68ad385f0a294c35", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/dependencies/dependencies-tab-client.tsx:54", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/dependencies/dependencies-tab-client.tsx:546"}, "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-4fbd4d60812f5d56", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/stakeholder/stakeholder-swap-dialog.tsx:235", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/stakeholder/stakeholder-swap-dialog.tsx:235"}, "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-da539053690b7ae6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/stakeholder/stakeholder-detail-panel.tsx:10", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/stakeholder/stakeholder-detail-panel.tsx:101"}, "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-dd2b143cf4e8cd71", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/open-items/open-items-panel.tsx:223", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/open-items/open-items-panel.tsx:223"}, "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-4064971cf7a4e4ea", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/wizard/step-ki-backlog.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/wizard/step-ki-backlog.tsx:171"}, "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-e1a723165313805d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/communication/outbox-panel.tsx:398", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/communication/outbox-panel.tsx:398"}, "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-78719a1215afd42a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:81", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:81"}, "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-f3c051ad9ca05530", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/resources/resources-page-client.tsx:361", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/resources/resources-page-client.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-24fc331612e062b1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/resources/tagessatz-combobox.tsx:216", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/resources/tagessatz-combobox.tsx:216"}, "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-ebf6910000cb34fe", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sprints/sprint-card.tsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sprints/sprint-card.tsx:94"}, "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-bc9a1bcd3bf697a7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/approval-inbox-panel.tsx:102", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/approval-inbox-panel.tsx:102"}, "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-bfc12d589909f028", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/budget-risk-alerts-panel.tsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/budget-risk-alerts-panel.tsx:142"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4e06d50982e13eb0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/my-work-panel.tsx:210", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/my-work-panel.tsx:210"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-96296a92b3f00245", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/project-health-exceptions-panel.tsx:120", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/project-health-exceptions-panel.tsx:120"}, "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-c7448677b51cf60e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/vendors/vendors-page-client.tsx:318", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/vendors/vendors-page-client.tsx:318"}, "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-1047b3e78adf07ae", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/create-work-item-link-dialog.tsx:270", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/create-work-item-link-dialog.tsx:270"}, "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-85fd040149a0fe05", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/work-item-allocations.tsx:168", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/work-item-allocations.tsx:168"}, "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-a5a0fb9cb72c7790", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/drag-overlay-card.tsx:59", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/drag-overlay-card.tsx:59"}, "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-70784cc6eb377e15", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/bulk-assign-phase-dialog.tsx:172", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/bulk-assign-phase-dialog.tsx:172"}, "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-04d8acc68fc0bdf0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/backlog-list.tsx:282", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/backlog-list.tsx:282"}, "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-81e1be0b3a53d587", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/backlog-board.tsx:540", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/backlog-board.tsx:540"}, "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-a640ab022683069b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/cross-project-link-badge.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/cross-project-link-badge.tsx:92"}, "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-dcb83297df87404e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/jira-export-dialog.tsx:384", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/jira-export-dialog.tsx:384"}, "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-c66250998a5d4b64", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/work-item-link-row.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/work-item-link-row.tsx:92"}, "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-4e30e30fbbdcfb3b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/work-item-detail-drawer.tsx:291", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/work-item-detail-drawer.tsx:291"}, "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-723c34fab1ffdfad", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/change-parent-dialog.tsx:166", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/change-parent-dialog.tsx:166"}, "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-5371a734b41f4892", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/backlog-tree.tsx:382", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/backlog-tree.tsx:382"}, "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-98388a161c1227d3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/delivered-by-banner.tsx:60", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/delivered-by-banner.tsx:60"}, "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-7d0463f4ece5a5ec", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/app/tenant-logo.tsx:55", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/app/tenant-logo.tsx:55"}, "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-b6840d49555c6070", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/app/project-sidebar.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/app/project-sidebar.tsx:109"}, "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-3c97c0834824237f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/app/user-menu.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/app/user-menu.tsx:84"}, "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-1dd9f40ba4702ffd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/app/tenant-switcher.tsx:55", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/app/tenant-switcher.tsx:55"}, "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-52416052a59fa03a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/project-room/readiness-checklist.tsx:276", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project-room/readiness-checklist.tsx:276"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-78df5ac3d574c1ec", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/project-room/method-header.tsx:96", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project-room/method-header.tsx:96"}, "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-04fcda15f092cb99", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/organization/org-detail-panel.tsx:57", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/organization/org-detail-panel.tsx:57"}, "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-29ad5f440f076be8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/organization/org-unit-combobox.tsx:134", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/organization/org-unit-combobox.tsx:134"}, "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-2a7324f6d60a6021", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/organization/org-tree.tsx:220", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/organization/org-tree.tsx:220"}, "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-2a5b8bcb54b5fba5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/phases/phase-card.tsx:450", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/phases/phase-card.tsx:450"}, "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-6c90bb362db886fa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/phases/reorder-phases-dialog.tsx:154", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/phases/reorder-phases-dialog.tsx:154"}, "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-ae74dda6640fba38", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/reports/snapshot-row.tsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/reports/snapshot-row.tsx:87"}, "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-edbaf7bcc9a2320e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/settings/members/members-table.tsx:157", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/settings/members/members-table.tsx:157"}, "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-6420078012083d6f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/projects/[id]/mitglieder/mitglieder-client.tsx:189", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/projects/[id]/mitglieder/mitglieder-client.tsx:189"}, "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-dce6cc3088677314", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/reports/audit/audit-report-client.tsx:245", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/reports/audit/audit-report-client.tsx:245"}, "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-fc66f3dd41a53058", "name": "Insecure pattern 'node_child_process' in playwright.config.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in playwright.config.ts:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-abe50a8df794f7c7", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/setup-tenant-on-signup/index.ts:22", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/setup-tenant-on-signup/index.ts:22"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f560abfb99771ddd", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:81", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:81"}, "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-6cfa33b25ae12779", "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-f12915681c919d48", "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-0a50f6ea9e195f10", "name": "Very large file: src/components/phases/gantt-view.tsx (1806 lines)", "shortDescription": {"text": "Very large file: src/components/phases/gantt-view.tsx (1806 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-42f88438ba77f80e", "name": "Very large file: src/lib/ai/router.ts (1932 lines)", "shortDescription": {"text": "Very large file: src/lib/ai/router.ts (1932 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-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-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 230 placeholder/mock markers across 121 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-4136a6e05815a899", "name": "Agent authority lacks a verifier contract: .claude/agents/designer.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/agents/designer.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-b887fc8e268e9c6a", "name": "Agent authority lacks a verifier contract: .claude/agents/continuous-improvement-agent.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/agents/continuous-improvement-agent.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-e7e78eb114002b10", "name": "Agent authority lacks a verifier contract: .claude/agents/backend-dev.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/agents/backend-dev.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-2f59b98f87280d19", "name": "Agent authority lacks a verifier contract: .claude/agents/documentation-writer.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/agents/documentation-writer.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-8ad917c589941989", "name": "Agent authority lacks a verifier contract: .claude/skills/gitnexus/gitnexus-guide/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gitnexus/gitnexus-guide/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b7af0ebca00c8e7b", "name": "Agent authority lacks a verifier contract: .claude/skills/gitnexus/gitnexus-exploring/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gitnexus/gitnexus-exploring/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2a26879567d53bb0", "name": "Agent authority lacks a verifier contract: .claude/skills/gitnexus/gitnexus-debugging/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gitnexus/gitnexus-debugging/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dba4a142db0fca12", "name": "Agent authority lacks a verifier contract: .claude/skills/designer/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/designer/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3a43f0316c09c741", "name": "Agent authority lacks a verifier contract: .claude/skills/continuous-improvement/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/continuous-improvement/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-06bda7a587483e26", "name": "Commented-code block (6 lines) in eslint.config.mjs:26", "shortDescription": {"text": "Commented-code block (6 lines) in eslint.config.mjs:26"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a70acbd22230a651", "name": "Commented-code block (5 lines) in tests/PROJ-18-compliance-automatik.spec.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in tests/PROJ-18-compliance-automatik.spec.ts:5"}, "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-da563166d82e26af", "name": "Commented-code block (6 lines) in tests/PROJ-21-output-rendering.spec.ts:5", "shortDescription": {"text": "Commented-code block (6 lines) in tests/PROJ-21-output-rendering.spec.ts:5"}, "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-3e574128332bdc55", "name": "Commented-code block (7 lines) in tests/PROJ-28-method-aware-navigation.spec.ts:10", "shortDescription": {"text": "Commented-code block (7 lines) in tests/PROJ-28-method-aware-navigation.spec.ts:10"}, "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-163065dcf711a799", "name": "Commented-code block (5 lines) in tests/PROJ-51-visual-regression-mobile.spec.ts:20", "shortDescription": {"text": "Commented-code block (5 lines) in tests/PROJ-51-visual-regression-mobile.spec.ts:20"}, "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-38cc003cbe290d51", "name": "Commented-code block (8 lines) in tests/PROJ-70-delta-dnd.spec.ts:344", "shortDescription": {"text": "Commented-code block (8 lines) in tests/PROJ-70-delta-dnd.spec.ts:344"}, "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-350de0fe78736aca", "name": "Commented-code block (6 lines) in tests/PROJ-23-sidebar-global.spec.ts:5", "shortDescription": {"text": "Commented-code block (6 lines) in tests/PROJ-23-sidebar-global.spec.ts:5"}, "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-70a85bf5cc25cc47", "name": "Commented-code block (6 lines) in tests/fixtures/global-setup.ts:223", "shortDescription": {"text": "Commented-code block (6 lines) in tests/fixtures/global-setup.ts:223"}, "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-3d97b4686fa0fd7f", "name": "Commented-code block (10 lines) in supabase/functions/setup-tenant-on-signup/index.ts:1", "shortDescription": {"text": "Commented-code block (10 lines) in supabase/functions/setup-tenant-on-signup/index.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-5e0dcbe9a5c4108c", "name": "Commented-code block (5 lines) in src/types/wizard.ts:68", "shortDescription": {"text": "Commented-code block (5 lines) in src/types/wizard.ts:68"}, "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-266e4fa60f7ca269", "name": "Commented-code block (5 lines) in src/types/work-item.ts:152", "shortDescription": {"text": "Commented-code block (5 lines) in src/types/work-item.ts:152"}, "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-09b81c50d74e1de7", "name": "Commented-code block (5 lines) in src/components/settings/tenant/ai-providers/ai-providers-page-client.tsx:807", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/settings/tenant/ai-providers/ai-providers-page-client.tsx:807"}, "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-690aa21a8badbc02", "name": "Commented-code block (5 lines) in src/components/stakeholders/communication/communication-tab.tsx:126", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/stakeholders/communication/communication-tab.tsx:126"}, "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-f1002b744bc1c23e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/projects/edit-project-master-data-dialog.tsx:177", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/projects/edit-project-master-data-dialog.tsx:177"}, "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-4f061f50f39382b7", "name": "Commented-code block (5 lines) in src/components/projects/trajectory-graph-view.tsx:91", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/projects/trajectory-graph-view.tsx:91"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b831c28557d4497e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/projects/trajectory-graph-view.tsx:6", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/projects/trajectory-graph-view.tsx:6"}, "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-e053f8ff001b4c2c", "name": "Commented-code block (5 lines) in src/components/projects/trajectory-graph-2d.tsx:187", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/projects/trajectory-graph-2d.tsx:187"}, "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-2f37258d74fbab51", "name": "Commented-code block (8 lines) in src/components/projects/ai-proposals/backlog-proposal-tree-node.tsx:309", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/projects/ai-proposals/backlog-proposal-tree-node.tsx:309"}, "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-f18aa9d77fc0b9a3", "name": "Commented-code block (5 lines) in src/components/projects/trajectory/plan-mutate-drag-handle.tsx:116", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/projects/trajectory/plan-mutate-drag-handle.tsx:116"}, "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-76ed2bcb6bba6364", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/projects/risks/risk-links-tab.tsx:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/projects/risks/risk-links-tab.tsx:71"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-49f6af8c6f686012", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/projects/dependencies/dependencies-tab-client.tsx:184", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/projects/dependencies/dependencies-tab-client.tsx:184"}, "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-93a76f7093eb5392", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/projects/stakeholder/stakeholder-swap-dialog.tsx:135", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/projects/stakeholder/stakeholder-swap-dialog.tsx:135"}, "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-fe029401317b9b7c", "name": "Commented-code block (5 lines) in src/components/projects/wizard/wizard-client.tsx:135", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/projects/wizard/wizard-client.tsx:135"}, "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-e32bfe0dfd7a8c06", "name": "Commented-code block (5 lines) in src/components/resources/resources-page-client.tsx:65", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/resources/resources-page-client.tsx:65"}, "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-d7a93544b78c19d6", "name": "Commented-code block (6 lines) in src/components/resources/resource-form.tsx:73", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/resources/resource-form.tsx:73"}, "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-98a36b85118d0c4f", "name": "Commented-code block (5 lines) in src/components/resources/tagessatz-combobox.integration.test.tsx:123", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/resources/tagessatz-combobox.integration.test.tsx:123"}, "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-9cea2e7cccf85c7f", "name": "Commented-code block (7 lines) in src/components/resources/tagessatz-combobox.tsx:155", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/resources/tagessatz-combobox.tsx:155"}, "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-3cd285741d1294f6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sprints/edit-sprint-dialog.tsx:115", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sprints/edit-sprint-dialog.tsx:115"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-93c8006ba7386a26", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sprints/new-sprint-dialog.tsx:107", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sprints/new-sprint-dialog.tsx:107"}, "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-615519448b1b5370", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sprints/sprint-card.tsx:295", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sprints/sprint-card.tsx:295"}, "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-e9dbd666a06c89e6", "name": "Commented-code block (5 lines) in src/components/master-data/project-types-page-client.tsx:60", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/master-data/project-types-page-client.tsx:60"}, "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-72a19ef372bef3a4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/milestones/edit-milestone-dialog.tsx:112", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/milestones/edit-milestone-dialog.tsx:112"}, "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-577fff60e4044896", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/milestones/milestone-status-dialog.tsx:129", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/milestones/milestone-status-dialog.tsx:129"}, "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-928e0f3f0409f3dc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/milestones/new-milestone-dialog.tsx:112", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/milestones/new-milestone-dialog.tsx:112"}, "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-ee5851e583bbc6a8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/work-items/new-work-item-dialog.tsx:188", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/work-items/new-work-item-dialog.tsx:188"}, "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-c71c5ede9f94daad", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/work-items/edit-work-item-dialog.tsx:171", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/work-items/edit-work-item-dialog.tsx:171"}, "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-cbb897b71e93ff33", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/project-room/health-snapshot.tsx:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/project-room/health-snapshot.tsx:72"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4af99d7c6fff353c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/organization/org-unit-combobox.tsx:93", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/organization/org-unit-combobox.tsx:93"}, "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-88dc7976beb40992", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/phases/edit-phase-dialog.tsx:145", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/phases/edit-phase-dialog.tsx:145"}, "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-c59552a181990c2c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/phases/new-phase-dialog.tsx:119", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/phases/new-phase-dialog.tsx:119"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d49dee9aa9d8e760", "name": "Commented-code block (6 lines) in src/components/phases/gantt-view.tsx:350", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/phases/gantt-view.tsx:350"}, "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-3a5480374d890275", "name": "Commented-code block (6 lines) in src/app/api/stakeholders/[id]/promote-to-resource/route.ts:14", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/stakeholders/[id]/promote-to-resource/route.ts:14"}, "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-d81d33beadb28cef", "name": "Commented-code block (5 lines) in src/app/api/ki/suggestions/[id]/route.ts:34", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/ki/suggestions/[id]/route.ts:34"}, "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-111eb2c9f4158e9a", "name": "Commented-code block (5 lines) in src/app/api/projects/route.ts:215", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/projects/route.ts:215"}, "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-dccc118b5fef5bdd", "name": "Commented-code block (5 lines) in src/app/api/projects/[id]/stakeholders/route.ts:93", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/projects/[id]/stakeholders/route.ts:93"}, "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-1abbc9c4979c4045", "name": "Commented-code block (7 lines) in src/app/api/projects/[id]/stakeholders/route.test.ts:188", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/projects/[id]/stakeholders/route.test.ts:188"}, "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-82d66adf5a2adcfc", "name": "Commented-code block (5 lines) in src/app/api/projects/[id]/stakeholders/[sid]/coaching-trigger/route.ts:65", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/projects/[id]/stakeholders/[sid]/coaching-trigger/route.ts:65"}, "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-d7130210f010e17c", "name": "Commented-code block (6 lines) in src/app/api/projects/[id]/stakeholders/[sid]/copy/route.ts:10", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/projects/[id]/stakeholders/[sid]/copy/route.ts:10"}, "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-22f072b06a374b68", "name": "Commented-code block (6 lines) in src/app/api/projects/[id]/budget/postings/[pid]/reverse/route.ts:8", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/projects/[id]/budget/postings/[pid]/reverse/route.ts:8"}, "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-3ec7131f3c6a2956", "name": "Commented-code block (5 lines) in src/app/api/projects/[id]/dependencies/route.ts:14", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/projects/[id]/dependencies/route.ts:14"}, "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-8430dfbd28b94073", "name": "Commented-code block (6 lines) in src/app/api/projects/[id]/dependencies/route.test.ts:376", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/projects/[id]/dependencies/route.test.ts:376"}, "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-8aadc2c2ca2b100a", "name": "Commented-code block (5 lines) in src/app/api/projects/[id]/work-items/[wid]/route.ts:177", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/projects/[id]/work-items/[wid]/route.ts:177"}, "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-bd6762f654c0a56a", "name": "Commented-code block (7 lines) in src/app/api/projects/[id]/work-items/[wid]/route.test.ts:5", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/projects/[id]/work-items/[wid]/route.test.ts:5"}, "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-97e7438e5ac54f4c", "name": "Commented-code block (5 lines) in src/app/api/projects/[id]/work-items/[wid]/sprint/route.ts:52", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/projects/[id]/work-items/[wid]/sprint/route.ts:52"}, "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-2eaa681306c14a0e", "name": "Commented-code block (6 lines) in src/app/api/projects/[id]/work-items/[wid]/copy/route.ts:10", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/projects/[id]/work-items/[wid]/copy/route.ts:10"}, "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-21f55835a1d3896b", "name": "Commented-code block (7 lines) in src/app/api/projects/[id]/work-items/[wid]/tags/route.ts:59", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/projects/[id]/work-items/[wid]/tags/route.ts:59"}, "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-8a453f371e35beb3", "name": "Commented-code block (7 lines) in src/app/api/projects/[id]/work-items/[wid]/tags/[linkId]/route.ts:6", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/projects/[id]/work-items/[wid]/tags/[linkId]/route.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1bc78111998b7f10", "name": "Commented-code block (7 lines) in src/app/api/projects/[id]/work-items/[wid]/cost-lines/route.ts:16", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/projects/[id]/work-items/[wid]/cost-lines/route.ts:16"}, "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-f754ec716895ee2b", "name": "Commented-code block (8 lines) in src/app/api/projects/[id]/work-items/sprint-bulk/route.test.ts:3", "shortDescription": {"text": "Commented-code block (8 lines) in src/app/api/projects/[id]/work-items/sprint-bulk/route.test.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a580dae2a381e893", "name": "Commented-code block (6 lines) in src/app/api/projects/[id]/cost-summary/route.ts:6", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/projects/[id]/cost-summary/route.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-459b17ee3d9e2951", "name": "Commented-code block (5 lines) in src/app/api/projects/[id]/snapshots/route.test.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/projects/[id]/snapshots/route.test.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4e82a80116702e01", "name": "Commented-code block (8 lines) in src/app/api/projects/[id]/snapshots/preview-ki/route.ts:17", "shortDescription": {"text": "Commented-code block (8 lines) in src/app/api/projects/[id]/snapshots/preview-ki/route.ts:17"}, "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-859ee36cf5a85ad3", "name": "Commented-code block (5 lines) in src/app/api/projects/[id]/transition/route.ts:31", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/projects/[id]/transition/route.ts:31"}, "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-dc65a3a6c4407376", "name": "Commented-code block (5 lines) in src/app/api/projects/[id]/phases/route.test.ts:15", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/projects/[id]/phases/route.test.ts:15"}, "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-8d102749dd5d64fd", "name": "Commented-code block (7 lines) in src/app/api/projects/[id]/phases/[pid]/compliance-warnings/route.ts:10", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/projects/[id]/phases/[pid]/compliance-warnings/route.ts:10"}, "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-5e47c9b04f88717b", "name": "Commented-code block (5 lines) in src/app/api/projects/[id]/phases/reorder/route.ts:46", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/projects/[id]/phases/reorder/route.ts:46"}, "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-2ebe3824d66ac097", "name": "Commented-code block (6 lines) in src/app/api/projects/[id]/members/route.test.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/projects/[id]/members/route.test.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-73d77e088aaa76bc", "name": "Commented-code block (5 lines) in src/app/api/projects/[id]/decisions/route.test.ts:201", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/projects/[id]/decisions/route.test.ts:201"}, "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-f1ff30d0f36780ee", "name": "Commented-code block (6 lines) in src/app/api/projects/[id]/stakeholder-health/route.ts:156", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/projects/[id]/stakeholder-health/route.ts:156"}, "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-4309afd0db1aa066", "name": "Commented-code block (10 lines) in src/app/api/projects/[id]/stakeholder-health/route.test.ts:3", "shortDescription": {"text": "Commented-code block (10 lines) in src/app/api/projects/[id]/stakeholder-health/route.test.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2ee5479a3b20725e", "name": "Commented-code block (5 lines) in src/app/api/tenants/[id]/settings/route.ts:16", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/tenants/[id]/settings/route.ts:16"}, "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-17b433962ab6e5d5", "name": "Commented-code block (5 lines) in src/app/api/tenants/[id]/settings/_schema.ts:21", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/tenants/[id]/settings/_schema.ts:21"}, "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-62b9fb6ac6788812", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/tenants/[id]/ai-providers/[provider]/route.test.ts:4", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/tenants/[id]/ai-providers/[provider]/route.test.ts:4"}, "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-3a9256f2e76e3581", "name": "Commented-code block (9 lines) in src/app/api/tenants/[id]/role-rates/route.ts:20", "shortDescription": {"text": "Commented-code block (9 lines) in src/app/api/tenants/[id]/role-rates/route.ts:20"}, "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-586b116a735b55c6", "name": "Commented-code block (5 lines) in src/app/api/tenants/[id]/ai-priority/route.test.ts:43", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/tenants/[id]/ai-priority/route.test.ts:43"}, "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-4cbf6a4afc8d6c3d", "name": "Commented-code block (5 lines) in src/app/api/resources/route.ts:17", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/resources/route.ts:17"}, "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-38cb4497082d034c", "name": "Commented-code block (11 lines) in src/app/api/resources/[rid]/route.ts:101", "shortDescription": {"text": "Commented-code block (11 lines) in src/app/api/resources/[rid]/route.ts:101"}, "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-4aae0c951588b2ee", "name": "Commented-code block (5 lines) in src/app/api/audit/[entity_type]/[entity_id]/restore/route.ts:13", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/audit/[entity_type]/[entity_id]/restore/route.ts:13"}, "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-5d2bb2a1fc63ca95", "name": "Commented-code block (5 lines) in src/app/api/audit/export/route.ts:13", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/audit/export/route.ts:13"}, "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-2c34c62ffc805c6a", "name": "Commented-code block (5 lines) in src/app/api/compliance-tags/route.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/compliance-tags/route.ts:5"}, "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-808eeca4577141b6", "name": "Commented-code block (5 lines) in src/app/api/context-sources/route.ts:122", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/context-sources/route.ts:122"}, "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-ce227995e5eb2ef1", "name": "Commented-code block (5 lines) in src/app/api/wizard-drafts/[id]/finalize/route.ts:9", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/wizard-drafts/[id]/finalize/route.ts:9"}, "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-1b929df6e537723a", "name": "Commented-code block (6 lines) in src/app/api/cron/approval-reminders/route.ts:186", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/cron/approval-reminders/route.ts:186"}, "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-435bef9fa141240a", "name": "Commented-code block (5 lines) in src/app/api/cron/apply-retention/route.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/cron/apply-retention/route.ts:8"}, "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-e6c6ee429bd693d4", "name": "Commented-code block (7 lines) in src/app/api/_lib/active-tenant.test.ts:7", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/_lib/active-tenant.test.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5a6d2d69302ce1c7", "name": "Commented-code block (6 lines) in src/app/onboarding/onboarding-client.tsx:67", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/onboarding/onboarding-client.tsx:67"}, "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-5faaf39a1948fe71", "name": "Commented-code block (6 lines) in src/app/(app)/layout.tsx:31", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/(app)/layout.tsx:31"}, "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-fc4453df64c30550", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/self-assessment/[token]/page.tsx:55", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/self-assessment/[token]/page.tsx:55"}, "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-0b98c0f4138d264d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/approve/[token]/page.tsx:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/approve/[token]/page.tsx:40"}, "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-27318be34a37458e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/stakeholders/api.ts:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/stakeholders/api.ts:42"}, "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-06d20c1c9abf2276", "name": "Commented-code block (6 lines) in src/lib/project-readiness/aggregate.test.ts:7", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/project-readiness/aggregate.test.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3ad2c3915cc2f31d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/stakeholder-types/api.ts:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/stakeholder-types/api.ts:26"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-df983ceaba51e6d0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ki/api.ts:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ki/api.ts:47"}, "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-3f376b77b2acb503", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/risk-score/api.ts:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/risk-score/api.ts:36"}, "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-1d2f281ce52e8281", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/risk-score/health-api.ts:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/risk-score/health-api.ts:53"}, "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-585069ff8625782d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai/anthropic-key-validator.ts:5", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai/anthropic-key-validator.ts:5"}, "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-b24673928af133ca", "name": "Commented-code block (5 lines) in src/lib/ai/classify.ts:631", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ai/classify.ts:631"}, "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-080e944ff9d40a21", "name": "Commented-code block (6 lines) in src/lib/ai/cost-cap.ts:137", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/ai/cost-cap.ts:137"}, "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-e4181821b0f3c7cb", "name": "Commented-code block (5 lines) in src/lib/ai/auto-context.ts:965", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ai/auto-context.ts:965"}, "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-a47b046b3681dbbb", "name": "Commented-code block (5 lines) in src/lib/ai/data-privacy-registry.ts:103", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ai/data-privacy-registry.ts:103"}, "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-2b48c2691a9a6de4", "name": "Commented-code block (5 lines) in src/lib/ai/providers/graph-purpose-prompts.ts:426", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/ai/providers/graph-purpose-prompts.ts:426"}, "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-e4f75f294dbd9d2a", "name": "Commented-code block (6 lines) in src/lib/ai/providers/ollama.ts:51", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/ai/providers/ollama.ts:51"}, "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-fbf087bc8ab9b5a8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/jira/api.ts:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/jira/api.ts:44"}, "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-65a6793ef6e84bb3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/jira/inbound-api.ts:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/jira/inbound-api.ts:48"}, "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-01f2ac4b4ed4c5b0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/risk-links/api.ts:43", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/risk-links/api.ts:43"}, "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-cd683db3a08301cf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai-proposals/trajectory-sequence-api.ts:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai-proposals/trajectory-sequence-api.ts:73"}, "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-0388f42dac1c4d13", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai-proposals/proposal-from-context-api.ts:103", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai-proposals/proposal-from-context-api.ts:103"}, "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-c6e022842bcefdfd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai-proposals/risk-proposals-api.ts:97", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai-proposals/risk-proposals-api.ts:97"}, "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-e93a4e7249c12713", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai-proposals/resource-swap-api.ts:81", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai-proposals/resource-swap-api.ts:81"}, "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-a0cdd4fee8d56d09", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai-proposals/stakeholder-proposals-api.ts:106", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai-proposals/stakeholder-proposals-api.ts:106"}, "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-0c03591ff113be94", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai-proposals/cross-project-links-api.ts:86", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai-proposals/cross-project-links-api.ts:86"}, "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-ec3a0efd2dac1da3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/connectors/api.ts:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/connectors/api.ts:40"}, "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-cf2d66d2a7962faf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/resources/api.ts:46", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/resources/api.ts:46"}, "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-54601e764f9bfbd8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/budget/api.ts:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/budget/api.ts:45"}, "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-4b3e0b5a16e6950c", "name": "Commented-code block (5 lines) in src/lib/dashboard/summary.test.ts:348", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/dashboard/summary.test.ts:348"}, "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-871e908987f74cc5", "name": "Commented-code block (7 lines) in src/lib/dashboard/summary.ts:257", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/dashboard/summary.ts:257"}, "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-dc5c4b3f661bb0ae", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/role-rates/api.ts:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/role-rates/api.ts:24"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fd6b036e0c83230b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/master-data/api.ts:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/master-data/api.ts:36"}, "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-415cba70fbcf8680", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/risks/api.ts:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/risks/api.ts:30"}, "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-c79b3cc692f53dac", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/vendors/api.ts:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/vendors/api.ts:48"}, "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-45e141e92730275e", "name": "Commented-code block (7 lines) in src/lib/project-graph/aggregate.ts:361", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/project-graph/aggregate.ts:361"}, "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-8e1b0a6dde75c388", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/stakeholder-coaching/api.ts:89", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/stakeholder-coaching/api.ts:89"}, "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-fa04c640a38bd75b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/audit/api.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/audit/api.ts:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7d36fa8bafb9180d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/compliance/api.ts:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/compliance/api.ts:31"}, "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-1b9e5ea6f7285a93", "name": "Commented-code block (5 lines) in src/lib/motion/use-view-transition.test.ts:26", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/motion/use-view-transition.test.ts:26"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-351ac774649827a0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/project-goals/api.ts:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/project-goals/api.ts:73"}, "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-c89bba406e4c84ed", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/cost/api.ts:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/cost/api.ts:56"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9737b37da474a62c", "name": "Commented-code block (7 lines) in src/lib/cost/synthesize-cost-lines.test.ts:9", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/cost/synthesize-cost-lines.test.ts:9"}, "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-1c1ed62e53e784b8", "name": "Commented-code block (5 lines) in src/lib/cost/synthesize-cost-lines.ts:185", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/cost/synthesize-cost-lines.ts:185"}, "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-f6f1ec140fbb37e1", "name": "Commented-code block (5 lines) in src/lib/cost/role-rate-lookup.test.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/cost/role-rate-lookup.test.ts:8"}, "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-0f0a8c8677709675", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/stakeholder-interactions/api.ts:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/stakeholder-interactions/api.ts:73"}, "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-8c04d587b7d8c566", "name": "Commented-code block (5 lines) in src/lib/supabase/middleware.ts:30", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/supabase/middleware.ts:30"}, "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-8613a1e96092de99", "name": "Commented-code block (5 lines) in src/lib/method-templates/routing.test.ts:358", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/method-templates/routing.test.ts:358"}, "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-934f3694764a662b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/open-items/api.ts:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/open-items/api.ts:31"}, "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-6606d305708593d7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/wizard/draft-storage.ts:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/wizard/draft-storage.ts:28"}, "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-e4344d7de472d2af", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/stakeholder-profiles/api.ts:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/stakeholder-profiles/api.ts:31"}, "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-6e6af863c24a0d1b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/decisions/api.ts:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/decisions/api.ts:32"}, "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-956900c206d1cdcb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/decisions/approval-api.ts:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/decisions/approval-api.ts:44"}, "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-3cfab50745c2c74f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/tenant-settings/api.ts:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/tenant-settings/api.ts:35"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1c6524d236468db0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/project-settings/api.ts:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/project-settings/api.ts:38"}, "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-20268c788f555eed", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/communication/api.ts:52", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/communication/api.ts:52"}, "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-fad817086135a252", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-organization-tree.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-organization-tree.ts:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f2b6585783b54bb1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-project-releases.ts:110", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-project-releases.ts:110"}, "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-31901d2cf70afa25", "name": "Commented-code block (5 lines) in src/hooks/use-work-items.ts:128", "shortDescription": {"text": "Commented-code block (5 lines) in src/hooks/use-work-items.ts:128"}, "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-e0c4507efdd1d37a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-link-inbox.ts:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-link-inbox.ts:54"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-985161fc47290c35", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-work-item-links.ts:105", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-work-item-links.ts:105"}, "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-b2965bad555ed80d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-snapshots.ts:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-snapshots.ts:73"}, "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-c9e16291e0774cf5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-organization-imports.ts:84", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-organization-imports.ts:84"}, "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-adfccd0f57eb742e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-work-item-search.ts:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-work-item-search.ts:72"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/17953"}, "properties": {"repository": "rechnungITC/projektplattform_v3", "repoUrl": "https://github.com/rechnungITC/projektplattform_v3", "branch": "main"}, "results": [{"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-a33b48a6fd51a906", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/stakeholders/communication/participant-pills-strip.tsx:146"}, "properties": {"repobilityId": "b3ddca0bf2ff0c79", "scanner": "scanner-primary", "fingerprint": "a33b48a6fd51a906", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c51c32eb2d122fba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/stakeholders/communication/communication-tab.tsx:371"}, "properties": {"repobilityId": "023e36493b412f10", "scanner": "scanner-primary", "fingerprint": "c51c32eb2d122fba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-613c5d3624a8ebd8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/releases/release-context-panel.tsx:32"}, "properties": {"repobilityId": "ab126c0d0b7de439", "scanner": "scanner-primary", "fingerprint": "613c5d3624a8ebd8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-01121cb088773cfe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/releases/release-scope-panel.tsx:119"}, "properties": {"repobilityId": "ea54fc24eb319971", "scanner": "scanner-primary", "fingerprint": "01121cb088773cfe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-69fb193d3ac4d3df", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/releases/release-page-client.tsx:123"}, "properties": {"repobilityId": "a2f61b344cf6aa49", "scanner": "scanner-primary", "fingerprint": "69fb193d3ac4d3df", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f15e23d86ab1755f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/connectors/connectors-page-client.tsx:281"}, "properties": {"repobilityId": "5dc9dd90d686aa47", "scanner": "scanner-primary", "fingerprint": "f15e23d86ab1755f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f15978828f1259d9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/connectors/jira-webhook-tokens.tsx:199"}, "properties": {"repobilityId": "ded2a1672bb4ac39", "scanner": "scanner-primary", "fingerprint": "f15978828f1259d9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-48189043c9082275", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/parent-project-banner.tsx:125"}, "properties": {"repobilityId": "fd32b2aea5c9ddbb", "scanner": "scanner-primary", "fingerprint": "48189043c9082275", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-87c72781d0bcbc22", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/trajectory-graph-view.tsx:1008"}, "properties": {"repobilityId": "fc0f3ec904b96069", "scanner": "scanner-primary", "fingerprint": "87c72781d0bcbc22", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6e00e1b77b9eca74", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposal-drawer.tsx:385"}, "properties": {"repobilityId": "2f5c742ebcc6cd3b", "scanner": "scanner-primary", "fingerprint": "6e00e1b77b9eca74", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-241e64f81211d254", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/projects-table.tsx:107"}, "properties": {"repobilityId": "1ee2132769c386d2", "scanner": "scanner-primary", "fingerprint": "241e64f81211d254", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1b6c241b5c0c9b34", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/stakeholders/stakeholder-suggestions.tsx:59"}, "properties": {"repobilityId": "a52f6bf4e43045bc", "scanner": "scanner-primary", "fingerprint": "1b6c241b5c0c9b34", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a393e494b013d13c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/stakeholders/stakeholder-table.tsx:104"}, "properties": {"repobilityId": "b48d3fc3f4f70d78", "scanner": "scanner-primary", "fingerprint": "a393e494b013d13c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-18e52e877344ebe8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/goals/goal-detail-panel.tsx:321"}, "properties": {"repobilityId": "ef7a559a6f40cb6c", "scanner": "scanner-primary", "fingerprint": "18e52e877344ebe8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1813de1cac767cb8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/goals/source-ref-combobox.tsx:83"}, "properties": {"repobilityId": "648cee73ad2f5a45", "scanner": "scanner-primary", "fingerprint": "1813de1cac767cb8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-44c97f644f70446b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposals/resource-swap-tab.tsx:277"}, "properties": {"repobilityId": "7eec33fc6bbbb897", "scanner": "scanner-primary", "fingerprint": "44c97f644f70446b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2d197bc658420a29", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposals/backlog-proposal-tab.tsx:805"}, "properties": {"repobilityId": "4ef44db72eaa24f2", "scanner": "scanner-primary", "fingerprint": "2d197bc658420a29", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-39ab3ef9b41db689", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposals/backlog-proposal-tree-node.tsx:222"}, "properties": {"repobilityId": "d9cfba6df55fc380", "scanner": "scanner-primary", "fingerprint": "39ab3ef9b41db689", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dd9e18b4f79f04a5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposals/stakeholder-proposal-tab.tsx:557"}, "properties": {"repobilityId": "7cb5873e1948ec2c", "scanner": "scanner-primary", "fingerprint": "dd9e18b4f79f04a5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-57f131747b487525", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposals/cross-project-links-tab.tsx:287"}, "properties": {"repobilityId": "fe34dd22cbea3d44", "scanner": "scanner-primary", "fingerprint": "57f131747b487525", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2fa81daa48a4d71e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/ai-proposals/risk-proposal-tab.tsx:519"}, "properties": {"repobilityId": "72246f8b4265665b", "scanner": "scanner-primary", "fingerprint": "2fa81daa48a4d71e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-681ed669b7c3b193", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/trajectory/trajectory-node-detail-panel.tsx:197"}, "properties": {"repobilityId": "728e67e11f2049a7", "scanner": "scanner-primary", "fingerprint": "681ed669b7c3b193", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bf75f313aa206e50", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/trajectory/plan-mutate-dialog.tsx:869"}, "properties": {"repobilityId": "e445e6fdc0b0ed6f", "scanner": "scanner-primary", "fingerprint": "bf75f313aa206e50", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fa93bbeeda808805", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/trajectory/bulk-action-bar.tsx:92"}, "properties": {"repobilityId": "e8028faca04e08b4", "scanner": "scanner-primary", "fingerprint": "fa93bbeeda808805", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bedd6719d6ba90b2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/risks/risk-matrix.tsx:104"}, "properties": {"repobilityId": "042ddcad9ad525d9", "scanner": "scanner-primary", "fingerprint": "bedd6719d6ba90b2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-25618fecbe501422", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/risks/risk-links-tab.tsx:246"}, "properties": {"repobilityId": "06e043cbe739b912", "scanner": "scanner-primary", "fingerprint": "25618fecbe501422", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-68ad385f0a294c35", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/dependencies/dependencies-tab-client.tsx:546"}, "properties": {"repobilityId": "0ea72ced02650228", "scanner": "scanner-primary", "fingerprint": "68ad385f0a294c35", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4fbd4d60812f5d56", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/stakeholder/stakeholder-swap-dialog.tsx:235"}, "properties": {"repobilityId": "53035b91875a5163", "scanner": "scanner-primary", "fingerprint": "4fbd4d60812f5d56", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-da539053690b7ae6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/stakeholder/stakeholder-detail-panel.tsx:101"}, "properties": {"repobilityId": "996024f8f224d596", "scanner": "scanner-primary", "fingerprint": "da539053690b7ae6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dd2b143cf4e8cd71", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/open-items/open-items-panel.tsx:223"}, "properties": {"repobilityId": "e1be50a7c457a802", "scanner": "scanner-primary", "fingerprint": "dd2b143cf4e8cd71", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4064971cf7a4e4ea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/wizard/step-ki-backlog.tsx:171"}, "properties": {"repobilityId": "48e5331a86068388", "scanner": "scanner-primary", "fingerprint": "4064971cf7a4e4ea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e1a723165313805d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/projects/communication/outbox-panel.tsx:398"}, "properties": {"repobilityId": "9322db6f6b552439", "scanner": "scanner-primary", "fingerprint": "e1a723165313805d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-78719a1215afd42a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:81"}, "properties": {"repobilityId": "b8c68f17a4018107", "scanner": "scanner-primary", "fingerprint": "78719a1215afd42a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f3c051ad9ca05530", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/resources/resources-page-client.tsx:361"}, "properties": {"repobilityId": "a383b92e00084e44", "scanner": "scanner-primary", "fingerprint": "f3c051ad9ca05530", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-24fc331612e062b1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/resources/tagessatz-combobox.tsx:216"}, "properties": {"repobilityId": "b8cd23a7d1766c4f", "scanner": "scanner-primary", "fingerprint": "24fc331612e062b1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ebf6910000cb34fe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sprints/sprint-card.tsx:94"}, "properties": {"repobilityId": "d0717614dc517cf0", "scanner": "scanner-primary", "fingerprint": "ebf6910000cb34fe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bc9a1bcd3bf697a7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/approval-inbox-panel.tsx:102"}, "properties": {"repobilityId": "991ece7b42c48fde", "scanner": "scanner-primary", "fingerprint": "bc9a1bcd3bf697a7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bfc12d589909f028", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/budget-risk-alerts-panel.tsx:142"}, "properties": {"repobilityId": "3a1d7d740ba5d23e", "scanner": "scanner-primary", "fingerprint": "bfc12d589909f028", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4e06d50982e13eb0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/my-work-panel.tsx:210"}, "properties": {"repobilityId": "c1ac92cc0ddc6a7d", "scanner": "scanner-primary", "fingerprint": "4e06d50982e13eb0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-96296a92b3f00245", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/project-health-exceptions-panel.tsx:120"}, "properties": {"repobilityId": "a22fcb65f70b0deb", "scanner": "scanner-primary", "fingerprint": "96296a92b3f00245", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c7448677b51cf60e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/vendors/vendors-page-client.tsx:318"}, "properties": {"repobilityId": "c016037e3a24b69b", "scanner": "scanner-primary", "fingerprint": "c7448677b51cf60e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1047b3e78adf07ae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/create-work-item-link-dialog.tsx:270"}, "properties": {"repobilityId": "8835a6962b3e6ba5", "scanner": "scanner-primary", "fingerprint": "1047b3e78adf07ae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-85fd040149a0fe05", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/work-item-allocations.tsx:168"}, "properties": {"repobilityId": "ba64f43b8622b2e9", "scanner": "scanner-primary", "fingerprint": "85fd040149a0fe05", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a5a0fb9cb72c7790", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/drag-overlay-card.tsx:59"}, "properties": {"repobilityId": "629c6e8cfc7642ec", "scanner": "scanner-primary", "fingerprint": "a5a0fb9cb72c7790", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-70784cc6eb377e15", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/bulk-assign-phase-dialog.tsx:172"}, "properties": {"repobilityId": "a1f551b3c7daa7a4", "scanner": "scanner-primary", "fingerprint": "70784cc6eb377e15", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-04d8acc68fc0bdf0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/backlog-list.tsx:282"}, "properties": {"repobilityId": "bfe814295fac89cc", "scanner": "scanner-primary", "fingerprint": "04d8acc68fc0bdf0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-81e1be0b3a53d587", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/backlog-board.tsx:540"}, "properties": {"repobilityId": "6b13d759d85e7830", "scanner": "scanner-primary", "fingerprint": "81e1be0b3a53d587", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a640ab022683069b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/cross-project-link-badge.tsx:92"}, "properties": {"repobilityId": "56fecd05cad6d00f", "scanner": "scanner-primary", "fingerprint": "a640ab022683069b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dcb83297df87404e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/jira-export-dialog.tsx:384"}, "properties": {"repobilityId": "4f418266663bf36f", "scanner": "scanner-primary", "fingerprint": "dcb83297df87404e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c66250998a5d4b64", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/work-item-link-row.tsx:92"}, "properties": {"repobilityId": "4f2795eeb56a3128", "scanner": "scanner-primary", "fingerprint": "c66250998a5d4b64", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4e30e30fbbdcfb3b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/work-item-detail-drawer.tsx:291"}, "properties": {"repobilityId": "6f30a61f63de9e47", "scanner": "scanner-primary", "fingerprint": "4e30e30fbbdcfb3b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-723c34fab1ffdfad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/change-parent-dialog.tsx:166"}, "properties": {"repobilityId": "2580a10fe8d21b28", "scanner": "scanner-primary", "fingerprint": "723c34fab1ffdfad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5371a734b41f4892", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/backlog-tree.tsx:382"}, "properties": {"repobilityId": "d905145dc9272571", "scanner": "scanner-primary", "fingerprint": "5371a734b41f4892", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-98388a161c1227d3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/work-items/delivered-by-banner.tsx:60"}, "properties": {"repobilityId": "436d0005166f11d6", "scanner": "scanner-primary", "fingerprint": "98388a161c1227d3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7d0463f4ece5a5ec", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/app/tenant-logo.tsx:55"}, "properties": {"repobilityId": "9305c9f6b2382a2c", "scanner": "scanner-primary", "fingerprint": "7d0463f4ece5a5ec", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b6840d49555c6070", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/app/project-sidebar.tsx:109"}, "properties": {"repobilityId": "2cbb2d36b3027f3f", "scanner": "scanner-primary", "fingerprint": "b6840d49555c6070", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3c97c0834824237f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/app/user-menu.tsx:84"}, "properties": {"repobilityId": "1d42f8460a232450", "scanner": "scanner-primary", "fingerprint": "3c97c0834824237f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1dd9f40ba4702ffd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/app/tenant-switcher.tsx:55"}, "properties": {"repobilityId": "1ea362513b22542e", "scanner": "scanner-primary", "fingerprint": "1dd9f40ba4702ffd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-52416052a59fa03a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project-room/readiness-checklist.tsx:276"}, "properties": {"repobilityId": "85315b41a5550ff0", "scanner": "scanner-primary", "fingerprint": "52416052a59fa03a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-78df5ac3d574c1ec", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project-room/method-header.tsx:96"}, "properties": {"repobilityId": "e6d59f4448317955", "scanner": "scanner-primary", "fingerprint": "78df5ac3d574c1ec", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-04fcda15f092cb99", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/organization/org-detail-panel.tsx:57"}, "properties": {"repobilityId": "2980b8481b767554", "scanner": "scanner-primary", "fingerprint": "04fcda15f092cb99", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-29ad5f440f076be8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/organization/org-unit-combobox.tsx:134"}, "properties": {"repobilityId": "cfc6d2742a8018c6", "scanner": "scanner-primary", "fingerprint": "29ad5f440f076be8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2a7324f6d60a6021", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/organization/org-tree.tsx:220"}, "properties": {"repobilityId": "6d1edf95a881135a", "scanner": "scanner-primary", "fingerprint": "2a7324f6d60a6021", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2a5b8bcb54b5fba5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/phases/phase-card.tsx:450"}, "properties": {"repobilityId": "9aa989ff94cb9a79", "scanner": "scanner-primary", "fingerprint": "2a5b8bcb54b5fba5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6c90bb362db886fa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/phases/reorder-phases-dialog.tsx:154"}, "properties": {"repobilityId": "3ed5e341ecacdc81", "scanner": "scanner-primary", "fingerprint": "6c90bb362db886fa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ae74dda6640fba38", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/reports/snapshot-row.tsx:87"}, "properties": {"repobilityId": "adbcb83c9453d722", "scanner": "scanner-primary", "fingerprint": "ae74dda6640fba38", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-edbaf7bcc9a2320e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/settings/members/members-table.tsx:157"}, "properties": {"repobilityId": "f78ba4a0a9928344", "scanner": "scanner-primary", "fingerprint": "edbaf7bcc9a2320e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6420078012083d6f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/projects/[id]/mitglieder/mitglieder-client.tsx:189"}, "properties": {"repobilityId": "a5ac18c5cd858685", "scanner": "scanner-primary", "fingerprint": "6420078012083d6f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dce6cc3088677314", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(app)/reports/audit/audit-report-client.tsx:245"}, "properties": {"repobilityId": "2bf84ea838c11603", "scanner": "scanner-primary", "fingerprint": "dce6cc3088677314", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fc66f3dd41a53058", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in playwright.config.ts:1"}, "properties": {"repobilityId": "8436cac204492c71", "scanner": "scanner-primary", "fingerprint": "fc66f3dd41a53058", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "playwright.config.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-abe50a8df794f7c7", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/setup-tenant-on-signup/index.ts:22"}, "properties": {"repobilityId": "7626a3c785731b36", "scanner": "scanner-primary", "fingerprint": "abe50a8df794f7c7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/setup-tenant-on-signup/index.ts"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-f560abfb99771ddd", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:81"}, "properties": {"repobilityId": "33f10636e53b4298", "scanner": "scanner-primary", "fingerprint": "f560abfb99771ddd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ui/chart.tsx"}, "region": {"startLine": 81}}}]}, {"ruleId": "scanner-6cfa33b25ae12779", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "677bf5855c605fec", "scanner": "scanner-primary", "fingerprint": "6cfa33b25ae12779", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/schema-drift.yml"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-6cfa33b25ae12779", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "64fa8dc3590f64cb", "scanner": "scanner-primary", "fingerprint": "6cfa33b25ae12779", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/schema-drift.yml"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-f12915681c919d48", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "61dccaab63aa853d", "scanner": "scanner-primary", "fingerprint": "f12915681c919d48", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/supply-chain-audit.yml"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-f12915681c919d48", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "fc235645d9b55a28", "scanner": "scanner-primary", "fingerprint": "f12915681c919d48", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/supply-chain-audit.yml"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-f12915681c919d48", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "61dccaab63aa853d", "scanner": "scanner-primary", "fingerprint": "f12915681c919d48", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/supply-chain-audit.yml"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-f12915681c919d48", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "fc235645d9b55a28", "scanner": "scanner-primary", "fingerprint": "f12915681c919d48", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/supply-chain-audit.yml"}, "region": {"startLine": 51}}}]}, {"ruleId": "scanner-0a50f6ea9e195f10", "level": "note", "message": {"text": "Very large file: src/components/phases/gantt-view.tsx (1806 lines)"}, "properties": {"repobilityId": "ed027e270e19262a", "scanner": "scanner-primary", "fingerprint": "0a50f6ea9e195f10", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-42f88438ba77f80e", "level": "note", "message": {"text": "Very large file: src/lib/ai/router.ts (1932 lines)"}, "properties": {"repobilityId": "d5cf0242ba1876ce", "scanner": "scanner-primary", "fingerprint": "42f88438ba77f80e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "cab1de9680797221", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "5910662b0dd6547e", "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": "b651d4a6d72c4b8f", "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": "aec89af477d9052e", "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": "9978749bf0be0e88", "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": "24d41804a42ef8a7", "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": "e242b2da1af9e93a", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-4136a6e05815a899", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/agents/designer.md"}, "properties": {"repobilityId": "e61a7065e2726c8e", "scanner": "scanner-primary", "fingerprint": "4136a6e05815a899", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/agents/designer.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b887fc8e268e9c6a", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/agents/continuous-improvement-agent.md"}, "properties": {"repobilityId": "a13e21dc5155f94d", "scanner": "scanner-primary", "fingerprint": "b887fc8e268e9c6a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/agents/continuous-improvement-agent.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e7e78eb114002b10", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/agents/backend-dev.md"}, "properties": {"repobilityId": "e5bc0c544e4336b7", "scanner": "scanner-primary", "fingerprint": "e7e78eb114002b10", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/agents/backend-dev.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2f59b98f87280d19", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/agents/documentation-writer.md"}, "properties": {"repobilityId": "6321a6a30f4a71a7", "scanner": "scanner-primary", "fingerprint": "2f59b98f87280d19", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/agents/documentation-writer.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8ad917c589941989", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gitnexus/gitnexus-guide/SKILL.md"}, "properties": {"repobilityId": "2ace49e9cef867d2", "scanner": "scanner-primary", "fingerprint": "8ad917c589941989", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gitnexus/gitnexus-guide/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b7af0ebca00c8e7b", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gitnexus/gitnexus-exploring/SKILL.md"}, "properties": {"repobilityId": "b40fc1ec9784a7c5", "scanner": "scanner-primary", "fingerprint": "b7af0ebca00c8e7b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gitnexus/gitnexus-exploring/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2a26879567d53bb0", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gitnexus/gitnexus-debugging/SKILL.md"}, "properties": {"repobilityId": "483117a0da0cbd14", "scanner": "scanner-primary", "fingerprint": "2a26879567d53bb0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gitnexus/gitnexus-debugging/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-dba4a142db0fca12", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/designer/SKILL.md"}, "properties": {"repobilityId": "4ad4802f20830f9a", "scanner": "scanner-primary", "fingerprint": "dba4a142db0fca12", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/designer/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3a43f0316c09c741", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/continuous-improvement/SKILL.md"}, "properties": {"repobilityId": "e3cee75644bd13da", "scanner": "scanner-primary", "fingerprint": "3a43f0316c09c741", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/continuous-improvement/SKILL.md"}, "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-06bda7a587483e26", "level": "none", "message": {"text": "Commented-code block (6 lines) in eslint.config.mjs:26"}, "properties": {"repobilityId": "51d5905081f433ed", "scanner": "scanner-primary", "fingerprint": "06bda7a587483e26", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a70acbd22230a651", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/PROJ-18-compliance-automatik.spec.ts:5"}, "properties": {"repobilityId": "81d6b1b658f49319", "scanner": "scanner-primary", "fingerprint": "a70acbd22230a651", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-da563166d82e26af", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/PROJ-21-output-rendering.spec.ts:5"}, "properties": {"repobilityId": "1d782b03a1428c89", "scanner": "scanner-primary", "fingerprint": "da563166d82e26af", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3e574128332bdc55", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/PROJ-28-method-aware-navigation.spec.ts:10"}, "properties": {"repobilityId": "8c682aed50f84656", "scanner": "scanner-primary", "fingerprint": "3e574128332bdc55", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-163065dcf711a799", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/PROJ-51-visual-regression-mobile.spec.ts:20"}, "properties": {"repobilityId": "2a14e59380504438", "scanner": "scanner-primary", "fingerprint": "163065dcf711a799", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-38cc003cbe290d51", "level": "none", "message": {"text": "Commented-code block (8 lines) in tests/PROJ-70-delta-dnd.spec.ts:344"}, "properties": {"repobilityId": "bdb64fecb7659597", "scanner": "scanner-primary", "fingerprint": "38cc003cbe290d51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-350de0fe78736aca", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/PROJ-23-sidebar-global.spec.ts:5"}, "properties": {"repobilityId": "8f9feb9681ade1d6", "scanner": "scanner-primary", "fingerprint": "350de0fe78736aca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-70a85bf5cc25cc47", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/fixtures/global-setup.ts:223"}, "properties": {"repobilityId": "fcad8ffcb061c134", "scanner": "scanner-primary", "fingerprint": "70a85bf5cc25cc47", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3d97b4686fa0fd7f", "level": "none", "message": {"text": "Commented-code block (10 lines) in supabase/functions/setup-tenant-on-signup/index.ts:1"}, "properties": {"repobilityId": "bdbeacd0752f1420", "scanner": "scanner-primary", "fingerprint": "3d97b4686fa0fd7f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5e0dcbe9a5c4108c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/types/wizard.ts:68"}, "properties": {"repobilityId": "62063a2bc3cc57c4", "scanner": "scanner-primary", "fingerprint": "5e0dcbe9a5c4108c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-266e4fa60f7ca269", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/types/work-item.ts:152"}, "properties": {"repobilityId": "31f9c7f03043f80f", "scanner": "scanner-primary", "fingerprint": "266e4fa60f7ca269", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-09b81c50d74e1de7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/settings/tenant/ai-providers/ai-providers-page-client.tsx:807"}, "properties": {"repobilityId": "95d4e2fff3f7b8b5", "scanner": "scanner-primary", "fingerprint": "09b81c50d74e1de7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-690aa21a8badbc02", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/stakeholders/communication/communication-tab.tsx:126"}, "properties": {"repobilityId": "839e4a83541d7b25", "scanner": "scanner-primary", "fingerprint": "690aa21a8badbc02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f1002b744bc1c23e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/projects/edit-project-master-data-dialog.tsx:177"}, "properties": {"repobilityId": "e88ace07e1cf3ecc", "scanner": "scanner-primary", "fingerprint": "f1002b744bc1c23e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4f061f50f39382b7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/projects/trajectory-graph-view.tsx:91"}, "properties": {"repobilityId": "266e51c8b68002db", "scanner": "scanner-primary", "fingerprint": "4f061f50f39382b7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b831c28557d4497e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/projects/trajectory-graph-view.tsx:6"}, "properties": {"repobilityId": "a9e66733b2e651bd", "scanner": "scanner-primary", "fingerprint": "b831c28557d4497e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e053f8ff001b4c2c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/projects/trajectory-graph-2d.tsx:187"}, "properties": {"repobilityId": "e706d4d39054bb27", "scanner": "scanner-primary", "fingerprint": "e053f8ff001b4c2c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2f37258d74fbab51", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/projects/ai-proposals/backlog-proposal-tree-node.tsx:309"}, "properties": {"repobilityId": "f6b76d9287e7d56a", "scanner": "scanner-primary", "fingerprint": "2f37258d74fbab51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f18aa9d77fc0b9a3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/projects/trajectory/plan-mutate-drag-handle.tsx:116"}, "properties": {"repobilityId": "ad81a27f280c1c2d", "scanner": "scanner-primary", "fingerprint": "f18aa9d77fc0b9a3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-76ed2bcb6bba6364", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/projects/risks/risk-links-tab.tsx:71"}, "properties": {"repobilityId": "1c75b327a2627d76", "scanner": "scanner-primary", "fingerprint": "76ed2bcb6bba6364", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-49f6af8c6f686012", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/projects/dependencies/dependencies-tab-client.tsx:184"}, "properties": {"repobilityId": "2e41ba0669ea5999", "scanner": "scanner-primary", "fingerprint": "49f6af8c6f686012", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-93a76f7093eb5392", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/projects/stakeholder/stakeholder-swap-dialog.tsx:135"}, "properties": {"repobilityId": "5fb5845910762cc8", "scanner": "scanner-primary", "fingerprint": "93a76f7093eb5392", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fe029401317b9b7c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/projects/wizard/wizard-client.tsx:135"}, "properties": {"repobilityId": "455108570c8942de", "scanner": "scanner-primary", "fingerprint": "fe029401317b9b7c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e32bfe0dfd7a8c06", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/resources/resources-page-client.tsx:65"}, "properties": {"repobilityId": "52200e31d83b7467", "scanner": "scanner-primary", "fingerprint": "e32bfe0dfd7a8c06", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d7a93544b78c19d6", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/resources/resource-form.tsx:73"}, "properties": {"repobilityId": "3f5727e836bace49", "scanner": "scanner-primary", "fingerprint": "d7a93544b78c19d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-98a36b85118d0c4f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/resources/tagessatz-combobox.integration.test.tsx:123"}, "properties": {"repobilityId": "b9470dbe5dad9e81", "scanner": "scanner-primary", "fingerprint": "98a36b85118d0c4f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9cea2e7cccf85c7f", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/resources/tagessatz-combobox.tsx:155"}, "properties": {"repobilityId": "0ef09d7f4fb03c3f", "scanner": "scanner-primary", "fingerprint": "9cea2e7cccf85c7f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3cd285741d1294f6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sprints/edit-sprint-dialog.tsx:115"}, "properties": {"repobilityId": "37167ebd73368e24", "scanner": "scanner-primary", "fingerprint": "3cd285741d1294f6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-93c8006ba7386a26", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sprints/new-sprint-dialog.tsx:107"}, "properties": {"repobilityId": "59f8882d2b44812e", "scanner": "scanner-primary", "fingerprint": "93c8006ba7386a26", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-615519448b1b5370", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sprints/sprint-card.tsx:295"}, "properties": {"repobilityId": "c7dcd2e385adde55", "scanner": "scanner-primary", "fingerprint": "615519448b1b5370", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e9dbd666a06c89e6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/master-data/project-types-page-client.tsx:60"}, "properties": {"repobilityId": "ce2cfd3c7968ff37", "scanner": "scanner-primary", "fingerprint": "e9dbd666a06c89e6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-72a19ef372bef3a4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/milestones/edit-milestone-dialog.tsx:112"}, "properties": {"repobilityId": "71247d3ee2078528", "scanner": "scanner-primary", "fingerprint": "72a19ef372bef3a4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-577fff60e4044896", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/milestones/milestone-status-dialog.tsx:129"}, "properties": {"repobilityId": "25a4592c7dc48bf0", "scanner": "scanner-primary", "fingerprint": "577fff60e4044896", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-928e0f3f0409f3dc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/milestones/new-milestone-dialog.tsx:112"}, "properties": {"repobilityId": "a76625b118446fb9", "scanner": "scanner-primary", "fingerprint": "928e0f3f0409f3dc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ee5851e583bbc6a8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/work-items/new-work-item-dialog.tsx:188"}, "properties": {"repobilityId": "89181c82611c3d02", "scanner": "scanner-primary", "fingerprint": "ee5851e583bbc6a8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c71c5ede9f94daad", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/work-items/edit-work-item-dialog.tsx:171"}, "properties": {"repobilityId": "2d0149b7a0a89d4f", "scanner": "scanner-primary", "fingerprint": "c71c5ede9f94daad", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cbb897b71e93ff33", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/project-room/health-snapshot.tsx:72"}, "properties": {"repobilityId": "5dad6ad63714fd50", "scanner": "scanner-primary", "fingerprint": "cbb897b71e93ff33", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4af99d7c6fff353c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/organization/org-unit-combobox.tsx:93"}, "properties": {"repobilityId": "01b8f3a5631a1aa4", "scanner": "scanner-primary", "fingerprint": "4af99d7c6fff353c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-88dc7976beb40992", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/phases/edit-phase-dialog.tsx:145"}, "properties": {"repobilityId": "f4d9652bb0f010cc", "scanner": "scanner-primary", "fingerprint": "88dc7976beb40992", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c59552a181990c2c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/phases/new-phase-dialog.tsx:119"}, "properties": {"repobilityId": "dd6d32dc4b43898f", "scanner": "scanner-primary", "fingerprint": "c59552a181990c2c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d49dee9aa9d8e760", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/phases/gantt-view.tsx:350"}, "properties": {"repobilityId": "1a1bfc32294cf8d9", "scanner": "scanner-primary", "fingerprint": "d49dee9aa9d8e760", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3a5480374d890275", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/stakeholders/[id]/promote-to-resource/route.ts:14"}, "properties": {"repobilityId": "40897f25b8275966", "scanner": "scanner-primary", "fingerprint": "3a5480374d890275", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d81d33beadb28cef", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/ki/suggestions/[id]/route.ts:34"}, "properties": {"repobilityId": "ccde9ba3de2f4824", "scanner": "scanner-primary", "fingerprint": "d81d33beadb28cef", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-111eb2c9f4158e9a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/projects/route.ts:215"}, "properties": {"repobilityId": "2584661e05adc462", "scanner": "scanner-primary", "fingerprint": "111eb2c9f4158e9a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dccc118b5fef5bdd", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/projects/[id]/stakeholders/route.ts:93"}, "properties": {"repobilityId": "46b8230aa8ed55a7", "scanner": "scanner-primary", "fingerprint": "dccc118b5fef5bdd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1abbc9c4979c4045", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/projects/[id]/stakeholders/route.test.ts:188"}, "properties": {"repobilityId": "aebacaeea5c4e355", "scanner": "scanner-primary", "fingerprint": "1abbc9c4979c4045", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-82d66adf5a2adcfc", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/projects/[id]/stakeholders/[sid]/coaching-trigger/route.ts:65"}, "properties": {"repobilityId": "cd4835bc912baa17", "scanner": "scanner-primary", "fingerprint": "82d66adf5a2adcfc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d7130210f010e17c", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/projects/[id]/stakeholders/[sid]/copy/route.ts:10"}, "properties": {"repobilityId": "3af0ca55585706fa", "scanner": "scanner-primary", "fingerprint": "d7130210f010e17c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-22f072b06a374b68", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/projects/[id]/budget/postings/[pid]/reverse/route.ts:8"}, "properties": {"repobilityId": "d1ad70cd0f98eb16", "scanner": "scanner-primary", "fingerprint": "22f072b06a374b68", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3ec7131f3c6a2956", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/projects/[id]/dependencies/route.ts:14"}, "properties": {"repobilityId": "e19500b05c31afb2", "scanner": "scanner-primary", "fingerprint": "3ec7131f3c6a2956", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8430dfbd28b94073", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/projects/[id]/dependencies/route.test.ts:376"}, "properties": {"repobilityId": "bbe3fa208fa1b8fe", "scanner": "scanner-primary", "fingerprint": "8430dfbd28b94073", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8aadc2c2ca2b100a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/projects/[id]/work-items/[wid]/route.ts:177"}, "properties": {"repobilityId": "1907d7432e4b37ab", "scanner": "scanner-primary", "fingerprint": "8aadc2c2ca2b100a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bd6762f654c0a56a", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/projects/[id]/work-items/[wid]/route.test.ts:5"}, "properties": {"repobilityId": "1f1c315c8f30328c", "scanner": "scanner-primary", "fingerprint": "bd6762f654c0a56a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-97e7438e5ac54f4c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/projects/[id]/work-items/[wid]/sprint/route.ts:52"}, "properties": {"repobilityId": "f7cb1cd9f8947316", "scanner": "scanner-primary", "fingerprint": "97e7438e5ac54f4c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2eaa681306c14a0e", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/projects/[id]/work-items/[wid]/copy/route.ts:10"}, "properties": {"repobilityId": "be9eb0ac1ac00710", "scanner": "scanner-primary", "fingerprint": "2eaa681306c14a0e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-21f55835a1d3896b", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/projects/[id]/work-items/[wid]/tags/route.ts:59"}, "properties": {"repobilityId": "e54e495ca7f06f3d", "scanner": "scanner-primary", "fingerprint": "21f55835a1d3896b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8a453f371e35beb3", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/projects/[id]/work-items/[wid]/tags/[linkId]/route.ts:6"}, "properties": {"repobilityId": "2324be81393fc960", "scanner": "scanner-primary", "fingerprint": "8a453f371e35beb3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1bc78111998b7f10", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/projects/[id]/work-items/[wid]/cost-lines/route.ts:16"}, "properties": {"repobilityId": "4ce4533982340a6b", "scanner": "scanner-primary", "fingerprint": "1bc78111998b7f10", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f754ec716895ee2b", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/app/api/projects/[id]/work-items/sprint-bulk/route.test.ts:3"}, "properties": {"repobilityId": "36809e1e6dd2aff2", "scanner": "scanner-primary", "fingerprint": "f754ec716895ee2b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a580dae2a381e893", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/projects/[id]/cost-summary/route.ts:6"}, "properties": {"repobilityId": "682befe1280926a9", "scanner": "scanner-primary", "fingerprint": "a580dae2a381e893", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-459b17ee3d9e2951", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/projects/[id]/snapshots/route.test.ts:3"}, "properties": {"repobilityId": "5cb3585c8ca2e00f", "scanner": "scanner-primary", "fingerprint": "459b17ee3d9e2951", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4e82a80116702e01", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/app/api/projects/[id]/snapshots/preview-ki/route.ts:17"}, "properties": {"repobilityId": "6f1fcec5f05977b0", "scanner": "scanner-primary", "fingerprint": "4e82a80116702e01", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-859ee36cf5a85ad3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/projects/[id]/transition/route.ts:31"}, "properties": {"repobilityId": "161ed8d8b78cf921", "scanner": "scanner-primary", "fingerprint": "859ee36cf5a85ad3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dc65a3a6c4407376", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/projects/[id]/phases/route.test.ts:15"}, "properties": {"repobilityId": "cb833d26c5438a21", "scanner": "scanner-primary", "fingerprint": "dc65a3a6c4407376", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8d102749dd5d64fd", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/projects/[id]/phases/[pid]/compliance-warnings/route.ts:10"}, "properties": {"repobilityId": "261fdc78de1c9034", "scanner": "scanner-primary", "fingerprint": "8d102749dd5d64fd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5e47c9b04f88717b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/projects/[id]/phases/reorder/route.ts:46"}, "properties": {"repobilityId": "a0f5edcc5f2bd3a3", "scanner": "scanner-primary", "fingerprint": "5e47c9b04f88717b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2ebe3824d66ac097", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/projects/[id]/members/route.test.ts:3"}, "properties": {"repobilityId": "d8611fccb9d656eb", "scanner": "scanner-primary", "fingerprint": "2ebe3824d66ac097", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-73d77e088aaa76bc", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/projects/[id]/decisions/route.test.ts:201"}, "properties": {"repobilityId": "a54a89620da9f051", "scanner": "scanner-primary", "fingerprint": "73d77e088aaa76bc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f1ff30d0f36780ee", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/projects/[id]/stakeholder-health/route.ts:156"}, "properties": {"repobilityId": "8cd9b7abb7ebcdab", "scanner": "scanner-primary", "fingerprint": "f1ff30d0f36780ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4309afd0db1aa066", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/app/api/projects/[id]/stakeholder-health/route.test.ts:3"}, "properties": {"repobilityId": "33b8e66a1b339a8a", "scanner": "scanner-primary", "fingerprint": "4309afd0db1aa066", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2ee5479a3b20725e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/tenants/[id]/settings/route.ts:16"}, "properties": {"repobilityId": "e2104e8bc12682b8", "scanner": "scanner-primary", "fingerprint": "2ee5479a3b20725e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-17b433962ab6e5d5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/tenants/[id]/settings/_schema.ts:21"}, "properties": {"repobilityId": "bb414ec37fb0abc1", "scanner": "scanner-primary", "fingerprint": "17b433962ab6e5d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-62b9fb6ac6788812", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/tenants/[id]/ai-providers/[provider]/route.test.ts:4"}, "properties": {"repobilityId": "21268f391ef5dc60", "scanner": "scanner-primary", "fingerprint": "62b9fb6ac6788812", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3a9256f2e76e3581", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/app/api/tenants/[id]/role-rates/route.ts:20"}, "properties": {"repobilityId": "c9d502f966743191", "scanner": "scanner-primary", "fingerprint": "3a9256f2e76e3581", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-586b116a735b55c6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/tenants/[id]/ai-priority/route.test.ts:43"}, "properties": {"repobilityId": "e629f7be18f35e79", "scanner": "scanner-primary", "fingerprint": "586b116a735b55c6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4cbf6a4afc8d6c3d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/resources/route.ts:17"}, "properties": {"repobilityId": "06d575cd9c4083c8", "scanner": "scanner-primary", "fingerprint": "4cbf6a4afc8d6c3d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-38cb4497082d034c", "level": "none", "message": {"text": "Commented-code block (11 lines) in src/app/api/resources/[rid]/route.ts:101"}, "properties": {"repobilityId": "c72b5ff91680581d", "scanner": "scanner-primary", "fingerprint": "38cb4497082d034c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4aae0c951588b2ee", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/audit/[entity_type]/[entity_id]/restore/route.ts:13"}, "properties": {"repobilityId": "02460c12eea26d2b", "scanner": "scanner-primary", "fingerprint": "4aae0c951588b2ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d2bb2a1fc63ca95", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/audit/export/route.ts:13"}, "properties": {"repobilityId": "705fc6e1a8cfe11e", "scanner": "scanner-primary", "fingerprint": "5d2bb2a1fc63ca95", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c34c62ffc805c6a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/compliance-tags/route.ts:5"}, "properties": {"repobilityId": "5e6608a2e827be04", "scanner": "scanner-primary", "fingerprint": "2c34c62ffc805c6a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-808eeca4577141b6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/context-sources/route.ts:122"}, "properties": {"repobilityId": "836cff2e5acea9db", "scanner": "scanner-primary", "fingerprint": "808eeca4577141b6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ce227995e5eb2ef1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/wizard-drafts/[id]/finalize/route.ts:9"}, "properties": {"repobilityId": "ab95d09628cb08f0", "scanner": "scanner-primary", "fingerprint": "ce227995e5eb2ef1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b929df6e537723a", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/cron/approval-reminders/route.ts:186"}, "properties": {"repobilityId": "874b59b4e77eaf00", "scanner": "scanner-primary", "fingerprint": "1b929df6e537723a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-435bef9fa141240a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/cron/apply-retention/route.ts:8"}, "properties": {"repobilityId": "00a5bafe38d5b929", "scanner": "scanner-primary", "fingerprint": "435bef9fa141240a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e6c6ee429bd693d4", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/_lib/active-tenant.test.ts:7"}, "properties": {"repobilityId": "a765fac2147aac79", "scanner": "scanner-primary", "fingerprint": "e6c6ee429bd693d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5a6d2d69302ce1c7", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/onboarding/onboarding-client.tsx:67"}, "properties": {"repobilityId": "506764043678aa4f", "scanner": "scanner-primary", "fingerprint": "5a6d2d69302ce1c7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5faaf39a1948fe71", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/(app)/layout.tsx:31"}, "properties": {"repobilityId": "9b3baadea954552b", "scanner": "scanner-primary", "fingerprint": "5faaf39a1948fe71", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc4453df64c30550", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/self-assessment/[token]/page.tsx:55"}, "properties": {"repobilityId": "4af56cb9c176f4da", "scanner": "scanner-primary", "fingerprint": "fc4453df64c30550", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0b98c0f4138d264d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/approve/[token]/page.tsx:40"}, "properties": {"repobilityId": "dfd1f0fb67972ef1", "scanner": "scanner-primary", "fingerprint": "0b98c0f4138d264d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-27318be34a37458e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/stakeholders/api.ts:42"}, "properties": {"repobilityId": "35265e301f1c7bd4", "scanner": "scanner-primary", "fingerprint": "27318be34a37458e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-06d20c1c9abf2276", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/project-readiness/aggregate.test.ts:7"}, "properties": {"repobilityId": "a0f634741f85336e", "scanner": "scanner-primary", "fingerprint": "06d20c1c9abf2276", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3ad2c3915cc2f31d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/stakeholder-types/api.ts:26"}, "properties": {"repobilityId": "66d2e568625bf695", "scanner": "scanner-primary", "fingerprint": "3ad2c3915cc2f31d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-df983ceaba51e6d0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ki/api.ts:47"}, "properties": {"repobilityId": "02ac4476d9dd2790", "scanner": "scanner-primary", "fingerprint": "df983ceaba51e6d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3f376b77b2acb503", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/risk-score/api.ts:36"}, "properties": {"repobilityId": "85f66cd88dba77c6", "scanner": "scanner-primary", "fingerprint": "3f376b77b2acb503", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1d2f281ce52e8281", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/risk-score/health-api.ts:53"}, "properties": {"repobilityId": "29fe46fd91be12d7", "scanner": "scanner-primary", "fingerprint": "1d2f281ce52e8281", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-585069ff8625782d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai/anthropic-key-validator.ts:5"}, "properties": {"repobilityId": "1099df2b7f84928f", "scanner": "scanner-primary", "fingerprint": "585069ff8625782d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b24673928af133ca", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ai/classify.ts:631"}, "properties": {"repobilityId": "3430ef6d20ec7e8a", "scanner": "scanner-primary", "fingerprint": "b24673928af133ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-080e944ff9d40a21", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/ai/cost-cap.ts:137"}, "properties": {"repobilityId": "5c502fadc652f354", "scanner": "scanner-primary", "fingerprint": "080e944ff9d40a21", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e4181821b0f3c7cb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ai/auto-context.ts:965"}, "properties": {"repobilityId": "4a771ddc6a228060", "scanner": "scanner-primary", "fingerprint": "e4181821b0f3c7cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a47b046b3681dbbb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ai/data-privacy-registry.ts:103"}, "properties": {"repobilityId": "2b7bd59195fc6c58", "scanner": "scanner-primary", "fingerprint": "a47b046b3681dbbb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2b48c2691a9a6de4", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/ai/providers/graph-purpose-prompts.ts:426"}, "properties": {"repobilityId": "6ac767f2dedfaf96", "scanner": "scanner-primary", "fingerprint": "2b48c2691a9a6de4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e4f75f294dbd9d2a", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/ai/providers/ollama.ts:51"}, "properties": {"repobilityId": "c0320af2b49046b5", "scanner": "scanner-primary", "fingerprint": "e4f75f294dbd9d2a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fbf087bc8ab9b5a8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/jira/api.ts:44"}, "properties": {"repobilityId": "53d59faa807c7260", "scanner": "scanner-primary", "fingerprint": "fbf087bc8ab9b5a8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-65a6793ef6e84bb3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/jira/inbound-api.ts:48"}, "properties": {"repobilityId": "c7ec72b425ea32d8", "scanner": "scanner-primary", "fingerprint": "65a6793ef6e84bb3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-01f2ac4b4ed4c5b0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/risk-links/api.ts:43"}, "properties": {"repobilityId": "e6f87f6b32d79f83", "scanner": "scanner-primary", "fingerprint": "01f2ac4b4ed4c5b0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cd683db3a08301cf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai-proposals/trajectory-sequence-api.ts:73"}, "properties": {"repobilityId": "3225bd32f0d9bcc1", "scanner": "scanner-primary", "fingerprint": "cd683db3a08301cf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0388f42dac1c4d13", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai-proposals/proposal-from-context-api.ts:103"}, "properties": {"repobilityId": "8f03a3f5a309d6df", "scanner": "scanner-primary", "fingerprint": "0388f42dac1c4d13", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c6e022842bcefdfd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai-proposals/risk-proposals-api.ts:97"}, "properties": {"repobilityId": "dadabc5ffd047e80", "scanner": "scanner-primary", "fingerprint": "c6e022842bcefdfd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e93a4e7249c12713", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai-proposals/resource-swap-api.ts:81"}, "properties": {"repobilityId": "c053ef221ea0b556", "scanner": "scanner-primary", "fingerprint": "e93a4e7249c12713", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a0cdd4fee8d56d09", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai-proposals/stakeholder-proposals-api.ts:106"}, "properties": {"repobilityId": "1a35f5b982e5565e", "scanner": "scanner-primary", "fingerprint": "a0cdd4fee8d56d09", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0c03591ff113be94", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai-proposals/cross-project-links-api.ts:86"}, "properties": {"repobilityId": "5228844429211d82", "scanner": "scanner-primary", "fingerprint": "0c03591ff113be94", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ec3a0efd2dac1da3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/connectors/api.ts:40"}, "properties": {"repobilityId": "0225837b59b03581", "scanner": "scanner-primary", "fingerprint": "ec3a0efd2dac1da3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cf2d66d2a7962faf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/resources/api.ts:46"}, "properties": {"repobilityId": "15dd133c8516c116", "scanner": "scanner-primary", "fingerprint": "cf2d66d2a7962faf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-54601e764f9bfbd8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/budget/api.ts:45"}, "properties": {"repobilityId": "48420d03dd1850cf", "scanner": "scanner-primary", "fingerprint": "54601e764f9bfbd8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4b3e0b5a16e6950c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/dashboard/summary.test.ts:348"}, "properties": {"repobilityId": "c035aeb058a6ed85", "scanner": "scanner-primary", "fingerprint": "4b3e0b5a16e6950c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-871e908987f74cc5", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/dashboard/summary.ts:257"}, "properties": {"repobilityId": "5739e6fc7c774e6c", "scanner": "scanner-primary", "fingerprint": "871e908987f74cc5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dc5c4b3f661bb0ae", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/role-rates/api.ts:24"}, "properties": {"repobilityId": "aca7b19c3f1875e9", "scanner": "scanner-primary", "fingerprint": "dc5c4b3f661bb0ae", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fd6b036e0c83230b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/master-data/api.ts:36"}, "properties": {"repobilityId": "4f983bd6d9ba13f9", "scanner": "scanner-primary", "fingerprint": "fd6b036e0c83230b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-415cba70fbcf8680", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/risks/api.ts:30"}, "properties": {"repobilityId": "4ac38beb3fabf853", "scanner": "scanner-primary", "fingerprint": "415cba70fbcf8680", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c79b3cc692f53dac", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/vendors/api.ts:48"}, "properties": {"repobilityId": "8a6f87514e18bcd3", "scanner": "scanner-primary", "fingerprint": "c79b3cc692f53dac", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-45e141e92730275e", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/project-graph/aggregate.ts:361"}, "properties": {"repobilityId": "d2e131894f51dcf3", "scanner": "scanner-primary", "fingerprint": "45e141e92730275e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e1b0a6dde75c388", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/stakeholder-coaching/api.ts:89"}, "properties": {"repobilityId": "abfe4fe2174d2125", "scanner": "scanner-primary", "fingerprint": "8e1b0a6dde75c388", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fa04c640a38bd75b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/audit/api.ts:29"}, "properties": {"repobilityId": "7cc09692115a3cab", "scanner": "scanner-primary", "fingerprint": "fa04c640a38bd75b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7d36fa8bafb9180d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/compliance/api.ts:31"}, "properties": {"repobilityId": "f94d398ecff31afd", "scanner": "scanner-primary", "fingerprint": "7d36fa8bafb9180d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1b9e5ea6f7285a93", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/motion/use-view-transition.test.ts:26"}, "properties": {"repobilityId": "419e534ec6d76ee0", "scanner": "scanner-primary", "fingerprint": "1b9e5ea6f7285a93", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-351ac774649827a0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/project-goals/api.ts:73"}, "properties": {"repobilityId": "2fe3d3d919b29b28", "scanner": "scanner-primary", "fingerprint": "351ac774649827a0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c89bba406e4c84ed", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/cost/api.ts:56"}, "properties": {"repobilityId": "7036bf23cd2a098a", "scanner": "scanner-primary", "fingerprint": "c89bba406e4c84ed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9737b37da474a62c", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/cost/synthesize-cost-lines.test.ts:9"}, "properties": {"repobilityId": "6add21b94f937b1b", "scanner": "scanner-primary", "fingerprint": "9737b37da474a62c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1c1ed62e53e784b8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/cost/synthesize-cost-lines.ts:185"}, "properties": {"repobilityId": "0837cb9453c2452a", "scanner": "scanner-primary", "fingerprint": "1c1ed62e53e784b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f6f1ec140fbb37e1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/cost/role-rate-lookup.test.ts:8"}, "properties": {"repobilityId": "d919f10074acd27b", "scanner": "scanner-primary", "fingerprint": "f6f1ec140fbb37e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f0a8c8677709675", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/stakeholder-interactions/api.ts:73"}, "properties": {"repobilityId": "1ce28cbf853e22c5", "scanner": "scanner-primary", "fingerprint": "0f0a8c8677709675", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8c04d587b7d8c566", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/supabase/middleware.ts:30"}, "properties": {"repobilityId": "b7e1bb242a197869", "scanner": "scanner-primary", "fingerprint": "8c04d587b7d8c566", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8613a1e96092de99", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/method-templates/routing.test.ts:358"}, "properties": {"repobilityId": "693b9702f1d7d154", "scanner": "scanner-primary", "fingerprint": "8613a1e96092de99", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-934f3694764a662b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/open-items/api.ts:31"}, "properties": {"repobilityId": "4f82a18ab4d0c672", "scanner": "scanner-primary", "fingerprint": "934f3694764a662b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6606d305708593d7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/wizard/draft-storage.ts:28"}, "properties": {"repobilityId": "e5c98c3612f1f2f6", "scanner": "scanner-primary", "fingerprint": "6606d305708593d7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e4344d7de472d2af", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/stakeholder-profiles/api.ts:31"}, "properties": {"repobilityId": "8fd49fa6a1900b7f", "scanner": "scanner-primary", "fingerprint": "e4344d7de472d2af", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6e6af863c24a0d1b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/decisions/api.ts:32"}, "properties": {"repobilityId": "784f8206754379e4", "scanner": "scanner-primary", "fingerprint": "6e6af863c24a0d1b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-956900c206d1cdcb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/decisions/approval-api.ts:44"}, "properties": {"repobilityId": "ba283af3c0fd140e", "scanner": "scanner-primary", "fingerprint": "956900c206d1cdcb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3cfab50745c2c74f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/tenant-settings/api.ts:35"}, "properties": {"repobilityId": "c94c955f159ea97b", "scanner": "scanner-primary", "fingerprint": "3cfab50745c2c74f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1c6524d236468db0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/project-settings/api.ts:38"}, "properties": {"repobilityId": "a0919920e4730919", "scanner": "scanner-primary", "fingerprint": "1c6524d236468db0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-20268c788f555eed", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/communication/api.ts:52"}, "properties": {"repobilityId": "a3a8497a8b448ba1", "scanner": "scanner-primary", "fingerprint": "20268c788f555eed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fad817086135a252", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-organization-tree.ts:29"}, "properties": {"repobilityId": "6a3a19af6f77debf", "scanner": "scanner-primary", "fingerprint": "fad817086135a252", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f2b6585783b54bb1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-project-releases.ts:110"}, "properties": {"repobilityId": "d21a853e3eb462c7", "scanner": "scanner-primary", "fingerprint": "f2b6585783b54bb1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-31901d2cf70afa25", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/hooks/use-work-items.ts:128"}, "properties": {"repobilityId": "18d419c33b013e00", "scanner": "scanner-primary", "fingerprint": "31901d2cf70afa25", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e0c4507efdd1d37a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-link-inbox.ts:54"}, "properties": {"repobilityId": "048d0f8446b031da", "scanner": "scanner-primary", "fingerprint": "e0c4507efdd1d37a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-985161fc47290c35", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-work-item-links.ts:105"}, "properties": {"repobilityId": "7ea5e679ceb993ca", "scanner": "scanner-primary", "fingerprint": "985161fc47290c35", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b2965bad555ed80d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-snapshots.ts:73"}, "properties": {"repobilityId": "0823ac9895cab6b3", "scanner": "scanner-primary", "fingerprint": "b2965bad555ed80d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c9e16291e0774cf5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-organization-imports.ts:84"}, "properties": {"repobilityId": "f64d68436a1ea631", "scanner": "scanner-primary", "fingerprint": "c9e16291e0774cf5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-adfccd0f57eb742e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-work-item-search.ts:72"}, "properties": {"repobilityId": "93f5f9c55a455e6f", "scanner": "scanner-primary", "fingerprint": "adfccd0f57eb742e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}]}]}