{"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-07a3462072296068", "name": "Stray `console.log` in TS/JS \u2014 NEXUS_Prisma_Seed.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 NEXUS_Prisma_Seed.ts:9"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f572b52e13e25b5f", "name": "Stray `console.log` in TS/JS \u2014 packages/prisma/prisma/seed.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/prisma/prisma/seed.ts:9"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6785ea0beaa6d104", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-components-module.ts:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-components-module.ts:54"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4e53d408bea0fa07", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-cm-links.ts:93", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-cm-links.ts:93"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b5e5222e6e3e6e69", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/index.ts:115", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/index.ts:115"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7ae73dfeab1efe9a", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/worker.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/worker.ts:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c7537090681e3d5c", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/emailAgent/processor.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/emailAgent/processor.ts:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-36209cc253a05e88", "name": "TODO/FIXME marker in shipping code \u2014 apps/api/src/routes/onboarding.ts:151", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/api/src/routes/onboarding.ts:151"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a08959233524f8d6", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/routes/formulationsGate.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/routes/formulationsGate.ts:23"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ac1dd98c1240e290", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/cowork-detail.tsx:986", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/cowork-detail.tsx:986"}, "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-abe2b3d0b844150a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/agent-settings.tsx:270", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/agent-settings.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-938c0112f1a96541", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/everything.tsx:339", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/everything.tsx:339"}, "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-ad942e84cc4a6548", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/docs.tsx:188", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/docs.tsx:188"}, "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-9e56613c8228311d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/cowork.tsx:147", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/cowork.tsx:147"}, "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-d7c3dfdb08b5057c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/dept-manager.tsx:1014", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/dept-manager.tsx:1014"}, "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-25dddaf4ade22af9", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/dashboard.tsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/dashboard.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-6ee83df237e4aa5e", "name": "TODO/FIXME marker in shipping code \u2014 apps/web/src/app/routes/dashboard.tsx:473", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/src/app/routes/dashboard.tsx:473"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1534b87c92a98290", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/integrations.tsx:626", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/integrations.tsx:626"}, "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-6f09de6a429e105c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/departments/ops.tsx:336", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/departments/ops.tsx:336"}, "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-c0fa5ed527089cbf", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/departments/rd.tsx:581", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/departments/rd.tsx:581"}, "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-dfa071df2532b40e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/Dialog.tsx:54", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/Dialog.tsx:54"}, "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-263c0fa8727cfa4e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/briefs/BriefDetailView.tsx:141", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/briefs/BriefDetailView.tsx:141"}, "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-cbe05692f3ef22cc", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/briefs/NewBriefModal.tsx:909", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/briefs/NewBriefModal.tsx:909"}, "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-e9d9f234eac5490f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/TransferDetailModal.tsx:236", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/TransferDetailModal.tsx:236"}, "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-b1a9b0c0bd89fd3e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/SharePointFolderModal.tsx:99", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/SharePointFolderModal.tsx:99"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e4ed23079f48f72b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/FormulationDetailModal.tsx:245", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/FormulationDetailModal.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-d3c7f9ced95d55c4", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/IssueLogger.tsx:209", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/IssueLogger.tsx:209"}, "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-9e53de7edd87fa96", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/NewTransferModal.tsx:613", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/NewTransferModal.tsx:613"}, "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-01885ef1cce22303", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/SharePointLinks.tsx:58", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/SharePointLinks.tsx:58"}, "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-534d903a641c5e04", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/CMDetailModal.tsx:279", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/CMDetailModal.tsx:279"}, "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-babee4d0fbfaee53", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/FormulationDetailDrawer.tsx:327", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/FormulationDetailDrawer.tsx:327"}, "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-be82a73de6cb6397", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/NewFormulationModal.tsx:340", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/NewFormulationModal.tsx:340"}, "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-418317ad35ea1c2b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/DocumentPanel.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/DocumentPanel.tsx:149"}, "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-e15632d71c1d2fba", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/TechTransferDetailDrawer.tsx:422", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/TechTransferDetailDrawer.tsx:422"}, "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-8d82f4a2b766bf15", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/components/ComponentDetail.tsx:633", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/components/ComponentDetail.tsx:633"}, "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-85631bb0afa63ffd", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/npd/NewNPDProjectModal.tsx:634", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/npd/NewNPDProjectModal.tsx:634"}, "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-f2b1d0acfa03373d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/npd/NPDProjectDetail.tsx:377", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/npd/NPDProjectDetail.tsx:377"}, "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-7ece974691d84c3c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/artwork/ArtworkProjectDetail.tsx:413", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/artwork/ArtworkProjectDetail.tsx:413"}, "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-6a82e30e738b3436", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/rd/artwork/ArtworkProjectDetail.tsx:703", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/rd/artwork/ArtworkProjectDetail.tsx:703"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1585f11a01fd7594", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/AddToCowork.tsx:235", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/AddToCowork.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-59319bd638134326", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/TaskAttachments.tsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/TaskAttachments.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-f0c20117a4bda737", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/CMPicker.tsx:115", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/CMPicker.tsx:115"}, "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-1db37d9e469bfb35", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/UserPicker.tsx:117", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/UserPicker.tsx:117"}, "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-7890c44533b8d5e3", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/ConnectMicrosoft.tsx:66", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/ConnectMicrosoft.tsx:66"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-36e5acfa8214761f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/OneDrivePicker.tsx:161", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/OneDrivePicker.tsx:161"}, "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-b24fb1abfcaac809", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/FullPageForm.tsx:58", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/FullPageForm.tsx:58"}, "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-70a1cefe11a07229", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/ProductSelect.tsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/ProductSelect.tsx:111"}, "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-6cc1ab540c9ceac1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/BriefAutocomplete.tsx:157", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/BriefAutocomplete.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-c399a665e37a8c1a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ops/ComponentsTab.tsx:259", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ops/ComponentsTab.tsx:259"}, "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-f6c65648f0eb7ecd", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ops/brand-transition/BrandTransitionModule.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ops/brand-transition/BrandTransitionModule.tsx:263"}, "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-6f0de20628213a07", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ops/production/ProductionModule.tsx:637", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ops/production/ProductionModule.tsx:637"}, "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-f73d443a5f4a6116", "name": "Insecure pattern 'dangerous_innerhtml' in NEXUS_v3_Demo.html:3", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in NEXUS_v3_Demo.html:3"}, "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-c572f89584da9e89", "name": "Insecure pattern 'direct_innerhtml_assignment' in NEXUS_v3_Demo.html:3", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in NEXUS_v3_Demo.html:3"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-382592c81b2e8b15", "name": "Insecure pattern 'node_child_process' in scripts/dev.mjs:7", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/dev.mjs:7"}, "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-82c70328d610a11a", "name": "Insecure pattern 'node_child_process' in scripts/setup.mjs:6", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/setup.mjs:6"}, "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-55a7e82ad99f6e93", "name": "Insecure pattern 'cors_wildcard' in apps/web/vite.config.ts:25", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in apps/web/vite.config.ts:25"}, "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-c27789be642af10a", "name": "Very large file: apps/web/src/app/routes/cowork-detail.tsx (1316 lines)", "shortDescription": {"text": "Very large file: apps/web/src/app/routes/cowork-detail.tsx (1316 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-619864b31355e641", "name": "Very large file: apps/web/src/app/routes/dept-manager.tsx (1460 lines)", "shortDescription": {"text": "Very large file: apps/web/src/app/routes/dept-manager.tsx (1460 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-fc441c023c9a35b5", "name": "Very large file: apps/web/src/app/routes/departments/rd.tsx (1812 lines)", "shortDescription": {"text": "Very large file: apps/web/src/app/routes/departments/rd.tsx (1812 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-ceeecbe017eb24b4", "name": "Very large file: apps/web/src/components/rd/components/ComponentDetail.tsx (1386 lines)", "shortDescription": {"text": "Very large file: apps/web/src/components/rd/components/ComponentDetail.tsx (1386 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-01622c5880995c2e", "name": "Very large file: apps/web/src/components/rd/npd/NPDProjectDetail.tsx (1496 lines)", "shortDescription": {"text": "Very large file: apps/web/src/components/rd/npd/NPDProjectDetail.tsx (1496 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-585993e0977a6e28", "name": "Very large file: apps/web/src/components/rd/artwork/ArtworkProjectDetail.tsx (1266 lines)", "shortDescription": {"text": "Very large file: apps/web/src/components/rd/artwork/ArtworkProjectDetail.tsx (1266 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-13fd10ec0e639449", "name": "Very large file: apps/web/src/components/ops/production/ProductionModule.tsx (1574 lines)", "shortDescription": {"text": "Very large file: apps/web/src/components/ops/production/ProductionModule.tsx (1574 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 155 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-faccb9061e9b52a0", "name": "No README detected", "shortDescription": {"text": "No README detected"}, "fullDescription": {"text": "No README file was found. Generated repos without README context are hard to operate, validate, or safely hand off."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9ef25fb2357b0972", "name": "Node manifest has dependencies but no lockfile: packages/prisma/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/prisma/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2699d5f16ae11282", "name": "Node manifest has dependencies but no lockfile: packages/shared/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/shared/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b06b8d86f24c77f9", "name": "Node manifest has dependencies but no lockfile: apps/api/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/api/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 96 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 622 placeholder/mock markers across 46 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests, operator-readme, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, tests, operator-readme, lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2679282aa1c484b5", "name": "Agent authority lacks a verifier contract: AGENTS.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: AGENTS.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-829522e8bd2a6622", "name": "Commented-code block (8 lines) in scripts/migrate-cm-links.ts:3", "shortDescription": {"text": "Commented-code block (8 lines) in scripts/migrate-cm-links.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-94895bdadedd1c43", "name": "Commented-code block (6 lines) in apps/api/src/index.ts:51", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/index.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-2a82f0136ec16c99", "name": "Commented-code block (6 lines) in apps/api/src/auth/session.ts:90", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/auth/session.ts:90"}, "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-676120c6952314b4", "name": "Commented-code block (5 lines) in apps/api/src/lib/microsoftGraph.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/lib/microsoftGraph.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-d1ece61814d07d0c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/microsoftGraph.ts:102", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/microsoftGraph.ts:102"}, "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-2b8e208d442cda88", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/oauth.ts:41", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/oauth.ts:41"}, "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-baf4c30ec28771d8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/objectStorage/objectStorage.ts:301", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/objectStorage/objectStorage.ts:301"}, "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-39d58fd4c556ba87", "name": "Commented-code block (6 lines) in apps/api/src/lib/objectStorage/objectAcl.ts:9", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/lib/objectStorage/objectAcl.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-eb41895b620215ec", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/emailAgent/graphClient.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/emailAgent/graphClient.ts:23"}, "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-b6d4369ee844c5d8", "name": "Commented-code block (5 lines) in apps/api/src/routes/microsoftGraph.ts:178", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/routes/microsoftGraph.ts:178"}, "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-359b1ad9a944f144", "name": "Commented-code block (5 lines) in apps/api/src/routes/documents.ts:47", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/routes/documents.ts:47"}, "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-15a123f2de88411c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/integrations.ts:159", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/integrations.ts:159"}, "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-d1f6ebf0ccb45d9d", "name": "Commented-code block (5 lines) in apps/api/src/routes/formulationsGate.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/routes/formulationsGate.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-b6f0fd1939e697fa", "name": "Commented-code block (5 lines) in apps/api/src/routes/sharepoint.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/routes/sharepoint.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-e003880596b6bbe6", "name": "Commented-code block (5 lines) in apps/api/src/routes/cowork.ts:422", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/routes/cowork.ts:422"}, "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-122d4fff038f2b0d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/routes/cowork-detail.tsx:843", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/routes/cowork-detail.tsx:843"}, "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-d416b6b64818f3f4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/routes/docs.tsx:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/routes/docs.tsx: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-0bb5bd7d95ddabca", "name": "Commented-code block (5 lines) in apps/web/src/stores/appStore.ts:23", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/stores/appStore.ts:23"}, "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-93f83942fff72a5a", "name": "Commented-code block (5 lines) in apps/web/src/components/briefs/BriefStatusSelect.tsx:5", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/components/briefs/BriefStatusSelect.tsx: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-05a4a2ec9b151001", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/shared/TaskAttachments.tsx:381", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/shared/TaskAttachments.tsx:381"}, "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-ee6dbfc29e94a6cc", "name": "Commented-code block (5 lines) in apps/web/src/components/shared/Toast.tsx:4", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/components/shared/Toast.tsx:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-022e6399d1ef2beb", "name": "12 env vars used in code but missing from .env.example", "shortDescription": {"text": "12 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AZURE_CLIENT_ID`, `AZURE_CLIENT_SECRET`, `AZURE_TENANT_ID`, `DEV`, `MICROSOFT_GRAPH_REDIRECT_URI`, `PRIVATE_OBJECT_DIR`, `PUBLIC_OBJECT_SEARCH_PATHS`, `REPLIT_DEPLOYMENT` + 4 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-704f1925a78df5e5", "name": "Dangling fetch: POST https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token (apps/api/src/lib/microsoftGraph.ts", "shortDescription": {"text": "Dangling fetch: POST https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token (apps/api/src/lib/microsoftGraph.ts:102)"}, "fullDescription": {"text": "`apps/api/src/lib/microsoftGraph.ts:102` calls `POST https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/login.microsoftonline.com/<p>/oauth2/v2.0/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a9a759301ceb6c1c", "name": "Dangling fetch: POST https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token (apps/api/src/lib/oauth.ts:41)", "shortDescription": {"text": "Dangling fetch: POST https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token (apps/api/src/lib/oauth.ts:41)"}, "fullDescription": {"text": "`apps/api/src/lib/oauth.ts:41` calls `POST https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/login.microsoftonline.com/<p>/oauth2/v2.0/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a47e7e28cb7484a9", "name": "Dangling fetch: POST https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token (apps/api/src/lib/oauth.ts:73)", "shortDescription": {"text": "Dangling fetch: POST https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token (apps/api/src/lib/oauth.ts:73)"}, "fullDescription": {"text": "`apps/api/src/lib/oauth.ts:73` calls `POST https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/login.microsoftonline.com/<p>/oauth2/v2.0/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1481227614066e0b", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (apps/api/src/lib/oauth.ts:104)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (apps/api/src/lib/oauth.ts:104)"}, "fullDescription": {"text": "`apps/api/src/lib/oauth.ts:104` calls `POST https://oauth2.googleapis.com/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/oauth2.googleapis.com/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6d306321a00dbddf", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (apps/api/src/lib/oauth.ts:130)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (apps/api/src/lib/oauth.ts:130)"}, "fullDescription": {"text": "`apps/api/src/lib/oauth.ts:130` calls `POST https://oauth2.googleapis.com/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/oauth2.googleapis.com/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b15e687e7d2f7168", "name": "Dangling fetch: POST https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token (apps/api/src/services/emailAgent/g", "shortDescription": {"text": "Dangling fetch: POST https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token (apps/api/src/services/emailAgent/graphClient.ts:23)"}, "fullDescription": {"text": "`apps/api/src/services/emailAgent/graphClient.ts:23` calls `POST https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/login.microsoftonline.com/<p>/oauth2/v2.0/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0ba5404e50f55a73", "name": "Dangling fetch: POST /api/v1/formulations-gate/unlock (apps/web/src/components/rd/FormulationsGate.tsx:50)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/formulations-gate/unlock (apps/web/src/components/rd/FormulationsGate.tsx:50)"}, "fullDescription": {"text": "`apps/web/src/components/rd/FormulationsGate.tsx:50` calls `POST /api/v1/formulations-gate/unlock` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/formulations-gate/unlock`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b28d92215a503990", "name": "Unused endpoint: USE /auth", "shortDescription": {"text": "Unused endpoint: USE /auth"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /auth` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d367c8685c1053d7", "name": "Unused endpoint: USE /departments", "shortDescription": {"text": "Unused endpoint: USE /departments"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /departments` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bcd26870d5c1931e", "name": "Unused endpoint: USE /tasks", "shortDescription": {"text": "Unused endpoint: USE /tasks"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /tasks` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-71b828f5117ca53a", "name": "Unused endpoint: USE /cowork", "shortDescription": {"text": "Unused endpoint: USE /cowork"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /cowork` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-428d7ebee5918103", "name": "Unused endpoint: USE /documents", "shortDescription": {"text": "Unused endpoint: USE /documents"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /documents` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-624b87cd9ac7e111", "name": "Unused endpoint: USE /everything", "shortDescription": {"text": "Unused endpoint: USE /everything"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /everything` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-427e80097ea0fbf3", "name": "Unused endpoint: USE /integrations/microsoft", "shortDescription": {"text": "Unused endpoint: USE /integrations/microsoft"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /integrations/microsoft` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd458eb13d1de46b", "name": "Unused endpoint: USE /integrations", "shortDescription": {"text": "Unused endpoint: USE /integrations"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /integrations` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6bdcbf2073dfa768", "name": "Unused endpoint: USE /ai", "shortDescription": {"text": "Unused endpoint: USE /ai"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /ai` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b2696aceaeefa8a0", "name": "Unused endpoint: USE /pulse", "shortDescription": {"text": "Unused endpoint: USE /pulse"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /pulse` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0383e55fcf6c08cf", "name": "Unused endpoint: USE /onboarding", "shortDescription": {"text": "Unused endpoint: USE /onboarding"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /onboarding` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7b12e7758445a1a5", "name": "Unused endpoint: USE /briefs", "shortDescription": {"text": "Unused endpoint: USE /briefs"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /briefs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9b1fb43ed17da784", "name": "Unused endpoint: USE /cms", "shortDescription": {"text": "Unused endpoint: USE /cms"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /cms` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b7020af8b527755f", "name": "Unused endpoint: USE /members", "shortDescription": {"text": "Unused endpoint: USE /members"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /members` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4fe1add535c906f1", "name": "Unused endpoint: USE /email-agent", "shortDescription": {"text": "Unused endpoint: USE /email-agent"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /email-agent` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9860e6655b7dabe6", "name": "Unused endpoint: USE /products", "shortDescription": {"text": "Unused endpoint: USE /products"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /products` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2a0aab6471eff3f1", "name": "Unused endpoint: USE /brand-transition", "shortDescription": {"text": "Unused endpoint: USE /brand-transition"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /brand-transition` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0b708b53c6ec8c59", "name": "Unused endpoint: USE /tech-transfer-stages", "shortDescription": {"text": "Unused endpoint: USE /tech-transfer-stages"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /tech-transfer-stages` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d0e4081c03638a55", "name": "Unused endpoint: USE /formulations-gate", "shortDescription": {"text": "Unused endpoint: USE /formulations-gate"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /formulations-gate` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a8c1f40026445e12", "name": "Unused endpoint: USE /formulation-detail", "shortDescription": {"text": "Unused endpoint: USE /formulation-detail"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /formulation-detail` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-62c7934f5eb371cc", "name": "Unused endpoint: USE /sharepoint", "shortDescription": {"text": "Unused endpoint: USE /sharepoint"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /sharepoint` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1bc898b3b7565990", "name": "Unused endpoint: USE /uploads", "shortDescription": {"text": "Unused endpoint: USE /uploads"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /uploads` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-94da1aaaf36cc41f", "name": "Unused endpoint: USE /api/v1", "shortDescription": {"text": "Unused endpoint: USE /api/v1"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /api/v1` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-065403d78bac995f", "name": "Unused endpoint: USE /api/v1/webhooks", "shortDescription": {"text": "Unused endpoint: USE /api/v1/webhooks"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /api/v1/webhooks` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3d72750b1a6cab38", "name": "Unused endpoint: GET /api/login", "shortDescription": {"text": "Unused endpoint: GET /api/login"}, "fullDescription": {"text": "`apps/api/src/auth/session.ts` declares `GET /api/login` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e75f055deeb9fa12", "name": "Unused endpoint: GET /api/logout", "shortDescription": {"text": "Unused endpoint: GET /api/logout"}, "fullDescription": {"text": "`apps/api/src/auth/session.ts` declares `GET /api/logout` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-37c16400c70bc384", "name": "Unused endpoint: GET /api/dev-login", "shortDescription": {"text": "Unused endpoint: GET /api/dev-login"}, "fullDescription": {"text": "`apps/api/src/auth/session.ts` declares `GET /api/dev-login` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd1dc91abf32142d", "name": "Unused endpoint: GET /me", "shortDescription": {"text": "Unused endpoint: GET /me"}, "fullDescription": {"text": "`apps/api/src/routes/microsoftGraph.ts` declares `GET /me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f20731a9f5a4f71d", "name": "Unused endpoint: GET /connect", "shortDescription": {"text": "Unused endpoint: GET /connect"}, "fullDescription": {"text": "`apps/api/src/routes/microsoftGraph.ts` declares `GET /connect` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cdfb578618cf2542", "name": "Unused endpoint: GET /callback", "shortDescription": {"text": "Unused endpoint: GET /callback"}, "fullDescription": {"text": "`apps/api/src/routes/microsoftGraph.ts` declares `GET /callback` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-46c4a540ce96e69d", "name": "Unused endpoint: GET /mail/search", "shortDescription": {"text": "Unused endpoint: GET /mail/search"}, "fullDescription": {"text": "`apps/api/src/routes/microsoftGraph.ts` declares `GET /mail/search` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8115143955a8c485", "name": "Unused endpoint: GET /onedrive/children", "shortDescription": {"text": "Unused endpoint: GET /onedrive/children"}, "fullDescription": {"text": "`apps/api/src/routes/microsoftGraph.ts` declares `GET /onedrive/children` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5a196d5b7b5ce94d", "name": "Unused endpoint: GET /onedrive/search", "shortDescription": {"text": "Unused endpoint: GET /onedrive/search"}, "fullDescription": {"text": "`apps/api/src/routes/microsoftGraph.ts` declares `GET /onedrive/search` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-540ebf4772ccf420", "name": "Unused endpoint: POST /disconnect", "shortDescription": {"text": "Unused endpoint: POST /disconnect"}, "fullDescription": {"text": "`apps/api/src/routes/microsoftGraph.ts` declares `POST /disconnect` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-36bcba01523ecfa5", "name": "Unused endpoint: POST /request-url", "shortDescription": {"text": "Unused endpoint: POST /request-url"}, "fullDescription": {"text": "`apps/api/src/routes/uploads.ts` declares `POST /request-url` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-42dda9f7f05dcc58", "name": "Unused endpoint: GET /objects/*", "shortDescription": {"text": "Unused endpoint: GET /objects/*"}, "fullDescription": {"text": "`apps/api/src/routes/uploads.ts` declares `GET /objects/*` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`apps/api/src/routes/onboarding.ts` declares `POST /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-99dd780fd6317231", "name": "Unused endpoint: GET /check-slug/:slug", "shortDescription": {"text": "Unused endpoint: GET /check-slug/:slug"}, "fullDescription": {"text": "`apps/api/src/routes/onboarding.ts` declares `GET /check-slug/:slug` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`apps/api/src/routes/products.ts` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ca5756175765b49d", "name": "Unused endpoint: GET /:id", "shortDescription": {"text": "Unused endpoint: GET /:id"}, "fullDescription": {"text": "`apps/api/src/routes/products.ts` declares `GET /:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5fbc954f63526821", "name": "Unused endpoint: PATCH /:id", "shortDescription": {"text": "Unused endpoint: PATCH /:id"}, "fullDescription": {"text": "`apps/api/src/routes/products.ts` declares `PATCH /:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a61c112b611f4bb", "name": "Unused endpoint: DELETE /:id", "shortDescription": {"text": "Unused endpoint: DELETE /:id"}, "fullDescription": {"text": "`apps/api/src/routes/products.ts` declares `DELETE /:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-75a9bbb8649fbdf2", "name": "Unused endpoint: POST /sync-kareve", "shortDescription": {"text": "Unused endpoint: POST /sync-kareve"}, "fullDescription": {"text": "`apps/api/src/routes/products.ts` declares `POST /sync-kareve` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6236b283b79811b8", "name": "Unused endpoint: POST /upload", "shortDescription": {"text": "Unused endpoint: POST /upload"}, "fullDescription": {"text": "`apps/api/src/routes/documents.ts` declares `POST /upload` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-26d06f9282988c81", "name": "Unused endpoint: POST /:type/connect", "shortDescription": {"text": "Unused endpoint: POST /:type/connect"}, "fullDescription": {"text": "`apps/api/src/routes/integrations.ts` declares `POST /:type/connect` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e04e2e3f391fac8e", "name": "Unused endpoint: GET /microsoft/callback", "shortDescription": {"text": "Unused endpoint: GET /microsoft/callback"}, "fullDescription": {"text": "`apps/api/src/routes/integrations.ts` declares `GET /microsoft/callback` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-424854ab10436e86", "name": "Unused endpoint: GET /google/callback", "shortDescription": {"text": "Unused endpoint: GET /google/callback"}, "fullDescription": {"text": "`apps/api/src/routes/integrations.ts` declares `GET /google/callback` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-56cf198ac94907ba", "name": "Unused endpoint: POST /:type/disconnect", "shortDescription": {"text": "Unused endpoint: POST /:type/disconnect"}, "fullDescription": {"text": "`apps/api/src/routes/integrations.ts` declares `POST /:type/disconnect` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cca18e8dd722466f", "name": "Unused endpoint: POST /:type/sync", "shortDescription": {"text": "Unused endpoint: POST /:type/sync"}, "fullDescription": {"text": "`apps/api/src/routes/integrations.ts` declares `POST /:type/sync` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d85b09e253dd016c", "name": "Unused endpoint: GET /:type/status", "shortDescription": {"text": "Unused endpoint: GET /:type/status"}, "fullDescription": {"text": "`apps/api/src/routes/integrations.ts` declares `GET /:type/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24716"}, "properties": {"repository": "bridgesystemsllc/Nexus-Collab", "repoUrl": "https://github.com/bridgesystemsllc/Nexus-Collab", "branch": "main"}, "results": [{"ruleId": "scanner-07a3462072296068", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 NEXUS_Prisma_Seed.ts:9"}, "properties": {"repobilityId": "d138880655bb58fb", "scanner": "scanner-primary", "fingerprint": "07a3462072296068", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f572b52e13e25b5f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/prisma/prisma/seed.ts:9"}, "properties": {"repobilityId": "e1701616aae0e240", "scanner": "scanner-primary", "fingerprint": "f572b52e13e25b5f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6785ea0beaa6d104", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-components-module.ts:54"}, "properties": {"repobilityId": "5026476f903bfdf2", "scanner": "scanner-primary", "fingerprint": "6785ea0beaa6d104", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4e53d408bea0fa07", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-cm-links.ts:93"}, "properties": {"repobilityId": "56be50aa1f0d8b5e", "scanner": "scanner-primary", "fingerprint": "4e53d408bea0fa07", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b5e5222e6e3e6e69", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/index.ts:115"}, "properties": {"repobilityId": "a178156af585d748", "scanner": "scanner-primary", "fingerprint": "b5e5222e6e3e6e69", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7ae73dfeab1efe9a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/worker.ts:18"}, "properties": {"repobilityId": "9c4f0fcfab73348b", "scanner": "scanner-primary", "fingerprint": "7ae73dfeab1efe9a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c7537090681e3d5c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/services/emailAgent/processor.ts:15"}, "properties": {"repobilityId": "2c2ce2c647bc445b", "scanner": "scanner-primary", "fingerprint": "c7537090681e3d5c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-36209cc253a05e88", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/api/src/routes/onboarding.ts:151"}, "properties": {"repobilityId": "c654c7d1604382c7", "scanner": "scanner-primary", "fingerprint": "36209cc253a05e88", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-a08959233524f8d6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/routes/formulationsGate.ts:23"}, "properties": {"repobilityId": "6bb0e8dff1e70fb5", "scanner": "scanner-primary", "fingerprint": "a08959233524f8d6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ac1dd98c1240e290", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/cowork-detail.tsx:986"}, "properties": {"repobilityId": "242d9d9ce65578d1", "scanner": "scanner-primary", "fingerprint": "ac1dd98c1240e290", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-abe2b3d0b844150a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/agent-settings.tsx:270"}, "properties": {"repobilityId": "a4d85945cdb01256", "scanner": "scanner-primary", "fingerprint": "abe2b3d0b844150a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-938c0112f1a96541", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/everything.tsx:339"}, "properties": {"repobilityId": "0c090fbebdbf97ce", "scanner": "scanner-primary", "fingerprint": "938c0112f1a96541", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ad942e84cc4a6548", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/docs.tsx:188"}, "properties": {"repobilityId": "b849034a4825cf5f", "scanner": "scanner-primary", "fingerprint": "ad942e84cc4a6548", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9e56613c8228311d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/cowork.tsx:147"}, "properties": {"repobilityId": "fa4398199683062b", "scanner": "scanner-primary", "fingerprint": "9e56613c8228311d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d7c3dfdb08b5057c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/dept-manager.tsx:1014"}, "properties": {"repobilityId": "7fc40c4bb52514d8", "scanner": "scanner-primary", "fingerprint": "d7c3dfdb08b5057c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-25dddaf4ade22af9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/dashboard.tsx:123"}, "properties": {"repobilityId": "5c0330cb31828272", "scanner": "scanner-primary", "fingerprint": "25dddaf4ade22af9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6ee83df237e4aa5e", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/src/app/routes/dashboard.tsx:473"}, "properties": {"repobilityId": "04d3aca66bd24715", "scanner": "scanner-primary", "fingerprint": "6ee83df237e4aa5e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-1534b87c92a98290", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/integrations.tsx:626"}, "properties": {"repobilityId": "dfed678947f5fd01", "scanner": "scanner-primary", "fingerprint": "1534b87c92a98290", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6f09de6a429e105c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/departments/ops.tsx:336"}, "properties": {"repobilityId": "b718973ad694f23d", "scanner": "scanner-primary", "fingerprint": "6f09de6a429e105c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c0fa5ed527089cbf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/routes/departments/rd.tsx:581"}, "properties": {"repobilityId": "6501a849811309d4", "scanner": "scanner-primary", "fingerprint": "c0fa5ed527089cbf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dfa071df2532b40e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/Dialog.tsx:54"}, "properties": {"repobilityId": "59c402932299089c", "scanner": "scanner-primary", "fingerprint": "dfa071df2532b40e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-263c0fa8727cfa4e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/briefs/BriefDetailView.tsx:141"}, "properties": {"repobilityId": "627b5168316b9552", "scanner": "scanner-primary", "fingerprint": "263c0fa8727cfa4e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cbe05692f3ef22cc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/briefs/NewBriefModal.tsx:909"}, "properties": {"repobilityId": "19eca57e3bc68143", "scanner": "scanner-primary", "fingerprint": "cbe05692f3ef22cc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e9d9f234eac5490f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/TransferDetailModal.tsx:236"}, "properties": {"repobilityId": "e256bec113c03675", "scanner": "scanner-primary", "fingerprint": "e9d9f234eac5490f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b1a9b0c0bd89fd3e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/SharePointFolderModal.tsx:99"}, "properties": {"repobilityId": "0fd40573a0ce7c2a", "scanner": "scanner-primary", "fingerprint": "b1a9b0c0bd89fd3e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e4ed23079f48f72b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/FormulationDetailModal.tsx:245"}, "properties": {"repobilityId": "9e9b02c162d82364", "scanner": "scanner-primary", "fingerprint": "e4ed23079f48f72b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d3c7f9ced95d55c4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/IssueLogger.tsx:209"}, "properties": {"repobilityId": "f76ba430036110d3", "scanner": "scanner-primary", "fingerprint": "d3c7f9ced95d55c4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9e53de7edd87fa96", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/NewTransferModal.tsx:613"}, "properties": {"repobilityId": "ce9d498665cf6d75", "scanner": "scanner-primary", "fingerprint": "9e53de7edd87fa96", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-01885ef1cce22303", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/SharePointLinks.tsx:58"}, "properties": {"repobilityId": "bf802a37bbb5ac83", "scanner": "scanner-primary", "fingerprint": "01885ef1cce22303", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-534d903a641c5e04", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/CMDetailModal.tsx:279"}, "properties": {"repobilityId": "cba8c16869c830e8", "scanner": "scanner-primary", "fingerprint": "534d903a641c5e04", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-babee4d0fbfaee53", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/FormulationDetailDrawer.tsx:327"}, "properties": {"repobilityId": "2c634a3e3fa958fd", "scanner": "scanner-primary", "fingerprint": "babee4d0fbfaee53", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-be82a73de6cb6397", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/NewFormulationModal.tsx:340"}, "properties": {"repobilityId": "e67ecf921bec74f9", "scanner": "scanner-primary", "fingerprint": "be82a73de6cb6397", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-418317ad35ea1c2b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/DocumentPanel.tsx:149"}, "properties": {"repobilityId": "4853977d29f53dd9", "scanner": "scanner-primary", "fingerprint": "418317ad35ea1c2b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e15632d71c1d2fba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/TechTransferDetailDrawer.tsx:422"}, "properties": {"repobilityId": "e7bf313e52134980", "scanner": "scanner-primary", "fingerprint": "e15632d71c1d2fba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8d82f4a2b766bf15", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/components/ComponentDetail.tsx:633"}, "properties": {"repobilityId": "e2777bbcd8aac873", "scanner": "scanner-primary", "fingerprint": "8d82f4a2b766bf15", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-85631bb0afa63ffd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/npd/NewNPDProjectModal.tsx:634"}, "properties": {"repobilityId": "cb9a7d2350e035b0", "scanner": "scanner-primary", "fingerprint": "85631bb0afa63ffd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f2b1d0acfa03373d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/npd/NPDProjectDetail.tsx:377"}, "properties": {"repobilityId": "7e39d1712e9929b8", "scanner": "scanner-primary", "fingerprint": "f2b1d0acfa03373d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7ece974691d84c3c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/rd/artwork/ArtworkProjectDetail.tsx:413"}, "properties": {"repobilityId": "307b7870d9bc511d", "scanner": "scanner-primary", "fingerprint": "7ece974691d84c3c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6a82e30e738b3436", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/rd/artwork/ArtworkProjectDetail.tsx:703"}, "properties": {"repobilityId": "82cbb7ebe6327086", "scanner": "scanner-primary", "fingerprint": "6a82e30e738b3436", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1585f11a01fd7594", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/AddToCowork.tsx:235"}, "properties": {"repobilityId": "d6a416a1a8f392b2", "scanner": "scanner-primary", "fingerprint": "1585f11a01fd7594", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-59319bd638134326", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/TaskAttachments.tsx:123"}, "properties": {"repobilityId": "844347a1689a5fb0", "scanner": "scanner-primary", "fingerprint": "59319bd638134326", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f0c20117a4bda737", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/CMPicker.tsx:115"}, "properties": {"repobilityId": "4cb48744d239c9c4", "scanner": "scanner-primary", "fingerprint": "f0c20117a4bda737", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1db37d9e469bfb35", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/UserPicker.tsx:117"}, "properties": {"repobilityId": "544939bc31000eea", "scanner": "scanner-primary", "fingerprint": "1db37d9e469bfb35", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7890c44533b8d5e3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/ConnectMicrosoft.tsx:66"}, "properties": {"repobilityId": "115ecf804c83deeb", "scanner": "scanner-primary", "fingerprint": "7890c44533b8d5e3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-36e5acfa8214761f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/OneDrivePicker.tsx:161"}, "properties": {"repobilityId": "9126e36cd920d763", "scanner": "scanner-primary", "fingerprint": "36e5acfa8214761f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b24fb1abfcaac809", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/FullPageForm.tsx:58"}, "properties": {"repobilityId": "080482d81a8add67", "scanner": "scanner-primary", "fingerprint": "b24fb1abfcaac809", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-70a1cefe11a07229", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/ProductSelect.tsx:111"}, "properties": {"repobilityId": "57e8366f047d80e8", "scanner": "scanner-primary", "fingerprint": "70a1cefe11a07229", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6cc1ab540c9ceac1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/shared/BriefAutocomplete.tsx:157"}, "properties": {"repobilityId": "1f547a641c0bbffe", "scanner": "scanner-primary", "fingerprint": "6cc1ab540c9ceac1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c399a665e37a8c1a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ops/ComponentsTab.tsx:259"}, "properties": {"repobilityId": "3009021cfdd06bd9", "scanner": "scanner-primary", "fingerprint": "c399a665e37a8c1a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f6c65648f0eb7ecd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ops/brand-transition/BrandTransitionModule.tsx:263"}, "properties": {"repobilityId": "89992f05f76607fe", "scanner": "scanner-primary", "fingerprint": "f6c65648f0eb7ecd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6f0de20628213a07", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ops/production/ProductionModule.tsx:637"}, "properties": {"repobilityId": "0f77fb2b69a95637", "scanner": "scanner-primary", "fingerprint": "6f0de20628213a07", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f73d443a5f4a6116", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in NEXUS_v3_Demo.html:3"}, "properties": {"repobilityId": "7084b4a5a72ba2f7", "scanner": "scanner-primary", "fingerprint": "f73d443a5f4a6116", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "NEXUS_v3_Demo.html"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-c572f89584da9e89", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in NEXUS_v3_Demo.html:3"}, "properties": {"repobilityId": "6779055934f1554c", "scanner": "scanner-primary", "fingerprint": "c572f89584da9e89", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "NEXUS_v3_Demo.html"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-382592c81b2e8b15", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/dev.mjs:7"}, "properties": {"repobilityId": "ccf61f89afbd7b7b", "scanner": "scanner-primary", "fingerprint": "382592c81b2e8b15", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/dev.mjs"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-82c70328d610a11a", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/setup.mjs:6"}, "properties": {"repobilityId": "00bd869a0a0e0da6", "scanner": "scanner-primary", "fingerprint": "82c70328d610a11a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/setup.mjs"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-55a7e82ad99f6e93", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in apps/web/vite.config.ts:25"}, "properties": {"repobilityId": "1a9cd0ec0bbe209a", "scanner": "scanner-primary", "fingerprint": "55a7e82ad99f6e93", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/vite.config.ts"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-c27789be642af10a", "level": "note", "message": {"text": "Very large file: apps/web/src/app/routes/cowork-detail.tsx (1316 lines)"}, "properties": {"repobilityId": "87ee66b295fc3096", "scanner": "scanner-primary", "fingerprint": "c27789be642af10a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-619864b31355e641", "level": "note", "message": {"text": "Very large file: apps/web/src/app/routes/dept-manager.tsx (1460 lines)"}, "properties": {"repobilityId": "84ba4fe599b18aec", "scanner": "scanner-primary", "fingerprint": "619864b31355e641", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fc441c023c9a35b5", "level": "note", "message": {"text": "Very large file: apps/web/src/app/routes/departments/rd.tsx (1812 lines)"}, "properties": {"repobilityId": "a446da0ea88a5238", "scanner": "scanner-primary", "fingerprint": "fc441c023c9a35b5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ceeecbe017eb24b4", "level": "note", "message": {"text": "Very large file: apps/web/src/components/rd/components/ComponentDetail.tsx (1386 lines)"}, "properties": {"repobilityId": "16be1942f1786ccb", "scanner": "scanner-primary", "fingerprint": "ceeecbe017eb24b4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-01622c5880995c2e", "level": "note", "message": {"text": "Very large file: apps/web/src/components/rd/npd/NPDProjectDetail.tsx (1496 lines)"}, "properties": {"repobilityId": "ff52eb967d8acafb", "scanner": "scanner-primary", "fingerprint": "01622c5880995c2e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-585993e0977a6e28", "level": "note", "message": {"text": "Very large file: apps/web/src/components/rd/artwork/ArtworkProjectDetail.tsx (1266 lines)"}, "properties": {"repobilityId": "73623e9a85933599", "scanner": "scanner-primary", "fingerprint": "585993e0977a6e28", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-13fd10ec0e639449", "level": "note", "message": {"text": "Very large file: apps/web/src/components/ops/production/ProductionModule.tsx (1574 lines)"}, "properties": {"repobilityId": "1e9213ea77e77acb", "scanner": "scanner-primary", "fingerprint": "13fd10ec0e639449", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "f4ba0b58cd955c95", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-faccb9061e9b52a0", "level": "note", "message": {"text": "No README detected"}, "properties": {"repobilityId": "2473cb6715472b1c", "scanner": "scanner-primary", "fingerprint": "faccb9061e9b52a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-9ef25fb2357b0972", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/prisma/package.json"}, "properties": {"repobilityId": "a5686703b75485df", "scanner": "scanner-primary", "fingerprint": "9ef25fb2357b0972", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/prisma/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2699d5f16ae11282", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/shared/package.json"}, "properties": {"repobilityId": "37ac218a4ef9b430", "scanner": "scanner-primary", "fingerprint": "2699d5f16ae11282", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/shared/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b06b8d86f24c77f9", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/api/package.json"}, "properties": {"repobilityId": "ce77cd34ed0306d4", "scanner": "scanner-primary", "fingerprint": "b06b8d86f24c77f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "cede96eff58fa1ed", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "7349697b010715ff", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "73853fb71b774e52", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "3f7d0e5e2d34819f", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "ae8ed167d39ee829", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-2679282aa1c484b5", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: AGENTS.md"}, "properties": {"repobilityId": "27d579812e6be614", "scanner": "scanner-primary", "fingerprint": "2679282aa1c484b5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "agents_md"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "AGENTS.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-829522e8bd2a6622", "level": "none", "message": {"text": "Commented-code block (8 lines) in scripts/migrate-cm-links.ts:3"}, "properties": {"repobilityId": "4e5641a39a50f53a", "scanner": "scanner-primary", "fingerprint": "829522e8bd2a6622", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-94895bdadedd1c43", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/index.ts:51"}, "properties": {"repobilityId": "f8cd411e27434ffd", "scanner": "scanner-primary", "fingerprint": "94895bdadedd1c43", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2a82f0136ec16c99", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/auth/session.ts:90"}, "properties": {"repobilityId": "34ca27c7ce70c188", "scanner": "scanner-primary", "fingerprint": "2a82f0136ec16c99", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-676120c6952314b4", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/lib/microsoftGraph.ts:6"}, "properties": {"repobilityId": "95fd936ed0018c9a", "scanner": "scanner-primary", "fingerprint": "676120c6952314b4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d1ece61814d07d0c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/microsoftGraph.ts:102"}, "properties": {"repobilityId": "d39343e74b1fdfbf", "scanner": "scanner-primary", "fingerprint": "d1ece61814d07d0c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2b8e208d442cda88", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/oauth.ts:41"}, "properties": {"repobilityId": "e79c44af97899d44", "scanner": "scanner-primary", "fingerprint": "2b8e208d442cda88", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-baf4c30ec28771d8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/lib/objectStorage/objectStorage.ts:301"}, "properties": {"repobilityId": "2b2841a04583da12", "scanner": "scanner-primary", "fingerprint": "baf4c30ec28771d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-39d58fd4c556ba87", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/lib/objectStorage/objectAcl.ts:9"}, "properties": {"repobilityId": "6210230e302c4da2", "scanner": "scanner-primary", "fingerprint": "39d58fd4c556ba87", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eb41895b620215ec", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/services/emailAgent/graphClient.ts:23"}, "properties": {"repobilityId": "1336d953aa3a4653", "scanner": "scanner-primary", "fingerprint": "eb41895b620215ec", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b6d4369ee844c5d8", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/routes/microsoftGraph.ts:178"}, "properties": {"repobilityId": "e72bc8fa10d1c0b4", "scanner": "scanner-primary", "fingerprint": "b6d4369ee844c5d8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-359b1ad9a944f144", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/routes/documents.ts:47"}, "properties": {"repobilityId": "4a30149a55a76316", "scanner": "scanner-primary", "fingerprint": "359b1ad9a944f144", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-15a123f2de88411c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/integrations.ts:159"}, "properties": {"repobilityId": "d502477e16a5551f", "scanner": "scanner-primary", "fingerprint": "15a123f2de88411c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d1f6ebf0ccb45d9d", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/routes/formulationsGate.ts:5"}, "properties": {"repobilityId": "7c8c4db7f22cdcf9", "scanner": "scanner-primary", "fingerprint": "d1f6ebf0ccb45d9d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b6f0fd1939e697fa", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/routes/sharepoint.ts:5"}, "properties": {"repobilityId": "8d3dc5831bc7e7ac", "scanner": "scanner-primary", "fingerprint": "b6f0fd1939e697fa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e003880596b6bbe6", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/routes/cowork.ts:422"}, "properties": {"repobilityId": "d6f5108e805c8916", "scanner": "scanner-primary", "fingerprint": "e003880596b6bbe6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-122d4fff038f2b0d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/routes/cowork-detail.tsx:843"}, "properties": {"repobilityId": "1d441a73ae6aff7b", "scanner": "scanner-primary", "fingerprint": "122d4fff038f2b0d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d416b6b64818f3f4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/routes/docs.tsx:48"}, "properties": {"repobilityId": "d0c34980a58ebdf6", "scanner": "scanner-primary", "fingerprint": "d416b6b64818f3f4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0bb5bd7d95ddabca", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/stores/appStore.ts:23"}, "properties": {"repobilityId": "8eb66c5fb9f35a56", "scanner": "scanner-primary", "fingerprint": "0bb5bd7d95ddabca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-93f83942fff72a5a", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/components/briefs/BriefStatusSelect.tsx:5"}, "properties": {"repobilityId": "e1d0a78d2913496f", "scanner": "scanner-primary", "fingerprint": "93f83942fff72a5a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-05a4a2ec9b151001", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/shared/TaskAttachments.tsx:381"}, "properties": {"repobilityId": "20f594832b34400e", "scanner": "scanner-primary", "fingerprint": "05a4a2ec9b151001", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ee6dbfc29e94a6cc", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/components/shared/Toast.tsx:4"}, "properties": {"repobilityId": "07fb85d41503abc4", "scanner": "scanner-primary", "fingerprint": "ee6dbfc29e94a6cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-022e6399d1ef2beb", "level": "note", "message": {"text": "12 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "7bf4178327da75a2", "scanner": "scanner-primary", "fingerprint": "022e6399d1ef2beb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-704f1925a78df5e5", "level": "error", "message": {"text": "Dangling fetch: POST https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token (apps/api/src/lib/microsoftGraph.ts:102)"}, "properties": {"repobilityId": "394c6e847309c91d", "scanner": "scanner-primary", "fingerprint": "704f1925a78df5e5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a9a759301ceb6c1c", "level": "error", "message": {"text": "Dangling fetch: POST https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token (apps/api/src/lib/oauth.ts:41)"}, "properties": {"repobilityId": "3d0c8191a780ec6e", "scanner": "scanner-primary", "fingerprint": "a9a759301ceb6c1c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a47e7e28cb7484a9", "level": "error", "message": {"text": "Dangling fetch: POST https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token (apps/api/src/lib/oauth.ts:73)"}, "properties": {"repobilityId": "c505f241839fd00d", "scanner": "scanner-primary", "fingerprint": "a47e7e28cb7484a9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1481227614066e0b", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (apps/api/src/lib/oauth.ts:104)"}, "properties": {"repobilityId": "720ebfdcd30391d7", "scanner": "scanner-primary", "fingerprint": "1481227614066e0b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6d306321a00dbddf", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (apps/api/src/lib/oauth.ts:130)"}, "properties": {"repobilityId": "58d7903ee97b810a", "scanner": "scanner-primary", "fingerprint": "6d306321a00dbddf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b15e687e7d2f7168", "level": "error", "message": {"text": "Dangling fetch: POST https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token (apps/api/src/services/emailAgent/graphClient.ts:23)"}, "properties": {"repobilityId": "6508c4b4adfec180", "scanner": "scanner-primary", "fingerprint": "b15e687e7d2f7168", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0ba5404e50f55a73", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/formulations-gate/unlock (apps/web/src/components/rd/FormulationsGate.tsx:50)"}, "properties": {"repobilityId": "56a7919f36752270", "scanner": "scanner-primary", "fingerprint": "0ba5404e50f55a73", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b28d92215a503990", "level": "note", "message": {"text": "Unused endpoint: USE /auth"}, "properties": {"repobilityId": "adb097e4ee82f3d6", "scanner": "scanner-primary", "fingerprint": "b28d92215a503990", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d367c8685c1053d7", "level": "note", "message": {"text": "Unused endpoint: USE /departments"}, "properties": {"repobilityId": "90a3b4259beb7bc0", "scanner": "scanner-primary", "fingerprint": "d367c8685c1053d7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bcd26870d5c1931e", "level": "note", "message": {"text": "Unused endpoint: USE /tasks"}, "properties": {"repobilityId": "6c9e2b0cc44e170d", "scanner": "scanner-primary", "fingerprint": "bcd26870d5c1931e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-71b828f5117ca53a", "level": "note", "message": {"text": "Unused endpoint: USE /cowork"}, "properties": {"repobilityId": "7fb4b173b747f359", "scanner": "scanner-primary", "fingerprint": "71b828f5117ca53a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-428d7ebee5918103", "level": "note", "message": {"text": "Unused endpoint: USE /documents"}, "properties": {"repobilityId": "8a724ad371f1e859", "scanner": "scanner-primary", "fingerprint": "428d7ebee5918103", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-624b87cd9ac7e111", "level": "note", "message": {"text": "Unused endpoint: USE /everything"}, "properties": {"repobilityId": "cd8102749754823c", "scanner": "scanner-primary", "fingerprint": "624b87cd9ac7e111", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-427e80097ea0fbf3", "level": "note", "message": {"text": "Unused endpoint: USE /integrations/microsoft"}, "properties": {"repobilityId": "c35ab0f5e6d745ac", "scanner": "scanner-primary", "fingerprint": "427e80097ea0fbf3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd458eb13d1de46b", "level": "note", "message": {"text": "Unused endpoint: USE /integrations"}, "properties": {"repobilityId": "af197be385db8430", "scanner": "scanner-primary", "fingerprint": "fd458eb13d1de46b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6bdcbf2073dfa768", "level": "note", "message": {"text": "Unused endpoint: USE /ai"}, "properties": {"repobilityId": "781acfa026f1ea9b", "scanner": "scanner-primary", "fingerprint": "6bdcbf2073dfa768", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b2696aceaeefa8a0", "level": "note", "message": {"text": "Unused endpoint: USE /pulse"}, "properties": {"repobilityId": "01b4f9cd7194e727", "scanner": "scanner-primary", "fingerprint": "b2696aceaeefa8a0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0383e55fcf6c08cf", "level": "note", "message": {"text": "Unused endpoint: USE /onboarding"}, "properties": {"repobilityId": "6037b68db69fc59c", "scanner": "scanner-primary", "fingerprint": "0383e55fcf6c08cf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7b12e7758445a1a5", "level": "note", "message": {"text": "Unused endpoint: USE /briefs"}, "properties": {"repobilityId": "daa16e2ad6da9ac2", "scanner": "scanner-primary", "fingerprint": "7b12e7758445a1a5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9b1fb43ed17da784", "level": "note", "message": {"text": "Unused endpoint: USE /cms"}, "properties": {"repobilityId": "0f069758d1f7f7d5", "scanner": "scanner-primary", "fingerprint": "9b1fb43ed17da784", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b7020af8b527755f", "level": "note", "message": {"text": "Unused endpoint: USE /members"}, "properties": {"repobilityId": "044d8355231bcb4e", "scanner": "scanner-primary", "fingerprint": "b7020af8b527755f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4fe1add535c906f1", "level": "note", "message": {"text": "Unused endpoint: USE /email-agent"}, "properties": {"repobilityId": "f0bebfd4bc480d6c", "scanner": "scanner-primary", "fingerprint": "4fe1add535c906f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9860e6655b7dabe6", "level": "note", "message": {"text": "Unused endpoint: USE /products"}, "properties": {"repobilityId": "7932a28a1e71278e", "scanner": "scanner-primary", "fingerprint": "9860e6655b7dabe6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2a0aab6471eff3f1", "level": "note", "message": {"text": "Unused endpoint: USE /brand-transition"}, "properties": {"repobilityId": "5f09b8e303ab6773", "scanner": "scanner-primary", "fingerprint": "2a0aab6471eff3f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0b708b53c6ec8c59", "level": "note", "message": {"text": "Unused endpoint: USE /tech-transfer-stages"}, "properties": {"repobilityId": "e2a1f4378ac1c4f7", "scanner": "scanner-primary", "fingerprint": "0b708b53c6ec8c59", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d0e4081c03638a55", "level": "note", "message": {"text": "Unused endpoint: USE /formulations-gate"}, "properties": {"repobilityId": "1891c75e2b3c69f2", "scanner": "scanner-primary", "fingerprint": "d0e4081c03638a55", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a8c1f40026445e12", "level": "note", "message": {"text": "Unused endpoint: USE /formulation-detail"}, "properties": {"repobilityId": "325174bfc56b7f4c", "scanner": "scanner-primary", "fingerprint": "a8c1f40026445e12", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-62c7934f5eb371cc", "level": "note", "message": {"text": "Unused endpoint: USE /sharepoint"}, "properties": {"repobilityId": "4c4fac4f8613fec0", "scanner": "scanner-primary", "fingerprint": "62c7934f5eb371cc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1bc898b3b7565990", "level": "note", "message": {"text": "Unused endpoint: USE /uploads"}, "properties": {"repobilityId": "6c06cdb1d30426fb", "scanner": "scanner-primary", "fingerprint": "1bc898b3b7565990", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-94da1aaaf36cc41f", "level": "note", "message": {"text": "Unused endpoint: USE /api/v1"}, "properties": {"repobilityId": "a55eeaeb8e73f088", "scanner": "scanner-primary", "fingerprint": "94da1aaaf36cc41f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-065403d78bac995f", "level": "note", "message": {"text": "Unused endpoint: USE /api/v1/webhooks"}, "properties": {"repobilityId": "498a875f4a77dac7", "scanner": "scanner-primary", "fingerprint": "065403d78bac995f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3d72750b1a6cab38", "level": "note", "message": {"text": "Unused endpoint: GET /api/login"}, "properties": {"repobilityId": "e5857409a3562cfd", "scanner": "scanner-primary", "fingerprint": "3d72750b1a6cab38", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e75f055deeb9fa12", "level": "note", "message": {"text": "Unused endpoint: GET /api/logout"}, "properties": {"repobilityId": "0fecd979f7c744eb", "scanner": "scanner-primary", "fingerprint": "e75f055deeb9fa12", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-37c16400c70bc384", "level": "note", "message": {"text": "Unused endpoint: GET /api/dev-login"}, "properties": {"repobilityId": "b383861e21740d0e", "scanner": "scanner-primary", "fingerprint": "37c16400c70bc384", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "0d4a141d754189bb", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f20731a9f5a4f71d", "level": "note", "message": {"text": "Unused endpoint: GET /connect"}, "properties": {"repobilityId": "51cae3a392267386", "scanner": "scanner-primary", "fingerprint": "f20731a9f5a4f71d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cdfb578618cf2542", "level": "note", "message": {"text": "Unused endpoint: GET /callback"}, "properties": {"repobilityId": "de093e1c47c7fcb4", "scanner": "scanner-primary", "fingerprint": "cdfb578618cf2542", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-46c4a540ce96e69d", "level": "note", "message": {"text": "Unused endpoint: GET /mail/search"}, "properties": {"repobilityId": "daf426eec3a20ca0", "scanner": "scanner-primary", "fingerprint": "46c4a540ce96e69d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8115143955a8c485", "level": "note", "message": {"text": "Unused endpoint: GET /onedrive/children"}, "properties": {"repobilityId": "5703c994870dcac4", "scanner": "scanner-primary", "fingerprint": "8115143955a8c485", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5a196d5b7b5ce94d", "level": "note", "message": {"text": "Unused endpoint: GET /onedrive/search"}, "properties": {"repobilityId": "0782ab0ced71b73c", "scanner": "scanner-primary", "fingerprint": "5a196d5b7b5ce94d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-540ebf4772ccf420", "level": "note", "message": {"text": "Unused endpoint: POST /disconnect"}, "properties": {"repobilityId": "de6df69aea1e73f3", "scanner": "scanner-primary", "fingerprint": "540ebf4772ccf420", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-36bcba01523ecfa5", "level": "note", "message": {"text": "Unused endpoint: POST /request-url"}, "properties": {"repobilityId": "38480116215e1c47", "scanner": "scanner-primary", "fingerprint": "36bcba01523ecfa5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-42dda9f7f05dcc58", "level": "note", "message": {"text": "Unused endpoint: GET /objects/*"}, "properties": {"repobilityId": "8e7a34153c73fa76", "scanner": "scanner-primary", "fingerprint": "42dda9f7f05dcc58", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "d73b0a21d6535f6d", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-99dd780fd6317231", "level": "note", "message": {"text": "Unused endpoint: GET /check-slug/:slug"}, "properties": {"repobilityId": "b50077aabf45976e", "scanner": "scanner-primary", "fingerprint": "99dd780fd6317231", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "d2a0d6a3b0185302", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca5756175765b49d", "level": "note", "message": {"text": "Unused endpoint: GET /:id"}, "properties": {"repobilityId": "0b9847247580c374", "scanner": "scanner-primary", "fingerprint": "ca5756175765b49d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5fbc954f63526821", "level": "note", "message": {"text": "Unused endpoint: PATCH /:id"}, "properties": {"repobilityId": "eae92080357fe94b", "scanner": "scanner-primary", "fingerprint": "5fbc954f63526821", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a61c112b611f4bb", "level": "note", "message": {"text": "Unused endpoint: DELETE /:id"}, "properties": {"repobilityId": "bee4f5b61c32fd1f", "scanner": "scanner-primary", "fingerprint": "7a61c112b611f4bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-75a9bbb8649fbdf2", "level": "note", "message": {"text": "Unused endpoint: POST /sync-kareve"}, "properties": {"repobilityId": "e8adbe4e4ef652ad", "scanner": "scanner-primary", "fingerprint": "75a9bbb8649fbdf2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6236b283b79811b8", "level": "note", "message": {"text": "Unused endpoint: POST /upload"}, "properties": {"repobilityId": "fed58e2a8bc0ea11", "scanner": "scanner-primary", "fingerprint": "6236b283b79811b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-26d06f9282988c81", "level": "note", "message": {"text": "Unused endpoint: POST /:type/connect"}, "properties": {"repobilityId": "3da32b8db5792208", "scanner": "scanner-primary", "fingerprint": "26d06f9282988c81", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e04e2e3f391fac8e", "level": "note", "message": {"text": "Unused endpoint: GET /microsoft/callback"}, "properties": {"repobilityId": "e57faa2e119ca2d6", "scanner": "scanner-primary", "fingerprint": "e04e2e3f391fac8e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-424854ab10436e86", "level": "note", "message": {"text": "Unused endpoint: GET /google/callback"}, "properties": {"repobilityId": "a872062e02c813e8", "scanner": "scanner-primary", "fingerprint": "424854ab10436e86", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-56cf198ac94907ba", "level": "note", "message": {"text": "Unused endpoint: POST /:type/disconnect"}, "properties": {"repobilityId": "a4ec4c8d43f9c160", "scanner": "scanner-primary", "fingerprint": "56cf198ac94907ba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cca18e8dd722466f", "level": "note", "message": {"text": "Unused endpoint: POST /:type/sync"}, "properties": {"repobilityId": "3b915dde4246c2f5", "scanner": "scanner-primary", "fingerprint": "cca18e8dd722466f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d85b09e253dd016c", "level": "note", "message": {"text": "Unused endpoint: GET /:type/status"}, "properties": {"repobilityId": "1d583444016fddcd", "scanner": "scanner-primary", "fingerprint": "d85b09e253dd016c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}