{"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-184667777694f9d3", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 webapp/app/dashboard/updates/[id]/page.tsx:45", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 webapp/app/dashboard/updates/[id]/page.tsx:45"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-40aebc228635901e", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/app/dashboard/community/page.tsx:113", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/app/dashboard/community/page.tsx:113"}, "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-906cef0939682730", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/app/dashboard/messages/[conversationId]/page.tsx:39", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/app/dashboard/messages/[conversationId]/page.tsx:39"}, "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-7c1e4e3d20bf28e6", "name": "Stray `console.log` in TS/JS \u2014 webapp/app/login/LoginForm.tsx:56", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 webapp/app/login/LoginForm.tsx:56"}, "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-19e1b95778147119", "name": "Stray `console.log` in TS/JS \u2014 webapp/app/api/cron/compliance-sweep/route.ts:68", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 webapp/app/api/cron/compliance-sweep/route.ts:68"}, "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-96745cd7dc9e6405", "name": "Stray `console.log` in TS/JS \u2014 webapp/app/api/cron/account-deletion/finalize/route.ts:59", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 webapp/app/api/cron/account-deletion/finalize/route.ts:59"}, "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-6c9a4f8bafb74ff3", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/app/portal/(protected)/messages/page.tsx:51", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/app/portal/(protected)/messages/page.tsx:51"}, "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-67f8983890c921b9", "name": "Stray `console.log` in TS/JS \u2014 webapp/app/register/RegisterForm.tsx:106", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 webapp/app/register/RegisterForm.tsx:106"}, "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-3850c7fe5c5f147d", "name": "TODO/FIXME marker in shipping code \u2014 webapp/app/actions/compliance.ts:112", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 webapp/app/actions/compliance.ts:112"}, "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-c771ccf4a9a55644", "name": "TODO/FIXME marker in shipping code \u2014 webapp/app/actions/auth.ts:461", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 webapp/app/actions/auth.ts:461"}, "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-67369be03120141a", "name": "Stray `console.log` in TS/JS \u2014 webapp/app/actions/auth.ts:87", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 webapp/app/actions/auth.ts:87"}, "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-5ea861c8e74df455", "name": "Stray `console.log` in TS/JS \u2014 webapp/scripts/migrate-videos-to-stream.ts:74", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 webapp/scripts/migrate-videos-to-stream.ts:74"}, "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-7cc53c5502e2edf4", "name": "TODO/FIXME marker in shipping code \u2014 webapp/scripts/migrate-storage-to-r2.ts:89", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 webapp/scripts/migrate-storage-to-r2.ts:89"}, "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-ddabcc1e18a8173c", "name": "Stray `console.log` in TS/JS \u2014 webapp/scripts/migrate-storage-to-r2.ts:186", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 webapp/scripts/migrate-storage-to-r2.ts:186"}, "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-f62778918161f4ac", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/dashboard/TodaySchedule.tsx:136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/dashboard/TodaySchedule.tsx:136"}, "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-bf24fce934511280", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/dashboard/ActivityFeed.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/dashboard/ActivityFeed.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-8b4138819fd5a2f1", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/dashboard/StatCard.tsx:42", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/dashboard/StatCard.tsx:42"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e632b2731ba9a04b", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/dashboard/ActionItemsList.tsx:135", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/dashboard/ActionItemsList.tsx:135"}, "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-48e0a68841a61a37", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/clients/WaitingListTab.tsx:180", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/clients/WaitingListTab.tsx:180"}, "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-7f810895bccea317", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/clients/ClientCard.tsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/clients/ClientCard.tsx:118"}, "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-a3d53e0304488e07", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/landing/HeroSearch.tsx:277", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/landing/HeroSearch.tsx:277"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1dc13bcf14f71cfb", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/admin/AdminVideosTable.tsx:175", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/admin/AdminVideosTable.tsx:175"}, "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-71c8bd9293e47718", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/admin/ReportsTable.tsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/admin/ReportsTable.tsx:177"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6dd17d18bf3b4cab", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/practice/ProductCardChecklist.tsx:218", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/practice/ProductCardChecklist.tsx:218"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-78c043c00a45c12d", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/video/VideoUploadForm.tsx:644", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/video/VideoUploadForm.tsx:644"}, "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-314c29cdd4e69b67", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/video/VideoCard.tsx:139", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/video/VideoCard.tsx:139"}, "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-5d92ed81bc54275a", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/availability/DateOverrides.tsx:205", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/availability/DateOverrides.tsx:205"}, "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-4cc2b9b8d095e48b", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/testimonials/InviteModal.tsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/testimonials/InviteModal.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-fce1532fd9a3f79e", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/community/MemberCard.tsx:90", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/community/MemberCard.tsx:90"}, "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-6e7218fa472dae2c", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/community/PostForm.tsx:360", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/community/PostForm.tsx:360"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-65e6909f789cbfa3", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/community/PostCard.tsx:121", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/community/PostCard.tsx:121"}, "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-c9a85658ddc8507b", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/community/LinkPreview.tsx:36", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/community/LinkPreview.tsx:36"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1af50fedc4cc403a", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/community/admin/MemberManager.tsx:270", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/community/admin/MemberManager.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-45023f541be8a8e8", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/community/admin/CategoryManager.tsx:234", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/community/admin/CategoryManager.tsx:234"}, "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-fb30a6e937a9bce0", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/management/VerificationMemberCard.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/management/VerificationMemberCard.tsx:92"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cd2e106a6eeac7f4", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/messages/ConversationList.tsx:140", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/messages/ConversationList.tsx:140"}, "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-5b7324a36a7bf53b", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/settings/BlockedUsersSection.tsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/settings/BlockedUsersSection.tsx:118"}, "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-b27848929c853881", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/analytics/VideoAnalyticsSection.tsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/analytics/VideoAnalyticsSection.tsx:142"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f73ed540e9515a9e", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/analytics/TopServicesTable.tsx:36", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/analytics/TopServicesTable.tsx:36"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fe72b94b225063e4", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/therapist-profile/sections/LinksSection.tsx:317", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/therapist-profile/sections/LinksSection.tsx:317"}, "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-fa44b4e63f9282c1", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/video-feed/VideoWall.tsx:150", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/video-feed/VideoWall.tsx:150"}, "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-d2c7c777b46390e8", "name": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/video-feed/DesktopVideoFeed.tsx:180", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/video-feed/DesktopVideoFeed.tsx:180"}, "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-964dec74a206aec8", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 webapp/lib/utils/seo.tsx:48", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 webapp/lib/utils/seo.tsx:48"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6f0abbb0c53331ea", "name": "Stray `console.log` in TS/JS \u2014 webapp/lib/compliance/eval/convergence.eval.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 webapp/lib/compliance/eval/convergence.eval.ts:48"}, "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-545d5d7bb5882d4b", "name": "Stray `console.log` in TS/JS \u2014 ubuntu/src/index.ts:81", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ubuntu/src/index.ts:81"}, "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-7df85652c6b7cf10", "name": "Stray `console.log` in TS/JS \u2014 ubuntu/src/transcribe.ts:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ubuntu/src/transcribe.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-60b5452439d3c06f", "name": "Stray `console.log` in TS/JS \u2014 docs/scripts/generate-guide-screenshots.ts:129", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 docs/scripts/generate-guide-screenshots.ts:129"}, "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-6474a65504b9a78d", "name": "Stray `console.log` in TS/JS \u2014 docs/scripts/generate-marketing-deck.ts:1217", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 docs/scripts/generate-marketing-deck.ts:1217"}, "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-092af8ddc323b0b2", "name": "Stray `console.log` in TS/JS \u2014 docs/scripts/_generate-pdf.js:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 docs/scripts/_generate-pdf.js:26"}, "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-f48819b2724cc628", "name": "Stray `console.log` in TS/JS \u2014 docs/compliance/video/remotion/scripts/generate-audio.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 docs/compliance/video/remotion/scripts/generate-audio.ts:51"}, "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-db28e22eeb3356ab", "name": "Stray `console.log` in TS/JS \u2014 services/transcription/src/index.ts:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 services/transcription/src/index.ts:89"}, "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-767e6cb1a8ce5185", "name": "Stray `console.log` in TS/JS \u2014 services/transcription/src/transcribe.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 services/transcription/src/transcribe.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-2161ded6a847ae1f", "name": "Runtime dotenv file present in repo: webapp/.env.sentry-build-plugin", "shortDescription": {"text": "Runtime dotenv file present in repo: webapp/.env.sentry-build-plugin"}, "fullDescription": {"text": "`webapp/.env.sentry-build-plugin` looks like a runtime dotenv file. It contains secret-looking assignments for SENTRY_AUTH_TOKEN. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-b138305134d2d766", "name": "Insecure pattern 'dangerous_innerhtml' in webapp/app/dashboard/updates/[id]/page.tsx:45", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in webapp/app/dashboard/updates/[id]/page.tsx:45"}, "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-285145f3cc44ecd4", "name": "Insecure pattern 'dangerous_innerhtml' in webapp/lib/utils/seo.tsx:48", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in webapp/lib/utils/seo.tsx:48"}, "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-298d737ed49b6225", "name": "Insecure pattern 'node_child_process' in ubuntu/src/transcribe.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in ubuntu/src/transcribe.ts:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d4f7cadd07dba8c5", "name": "Possible secret in docs/scripts/generate-guide-screenshots.ts", "shortDescription": {"text": "Possible secret in docs/scripts/generate-guide-screenshots.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-ba66a43932ab67be", "name": "Insecure pattern 'node_child_process' in docs/scripts/_generate-pdf.js:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in docs/scripts/_generate-pdf.js:2"}, "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-cf4bfd4db9072725", "name": "Insecure pattern 'node_child_process' in services/transcription/src/transcribe.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in services/transcription/src/transcribe.ts:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4b954c8a57ff7171", "name": "Very large file: webapp/app/directory/[slug]/page.tsx (1403 lines)", "shortDescription": {"text": "Very large file: webapp/app/directory/[slug]/page.tsx (1403 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-26ad72458e0d4782", "name": "Very large file: webapp/app/actions/therapist-videos.ts (2024 lines)", "shortDescription": {"text": "Very large file: webapp/app/actions/therapist-videos.ts (2024 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-bd9a59b771f8be48", "name": "Very large file: webapp/app/actions/clients.ts (1585 lines)", "shortDescription": {"text": "Very large file: webapp/app/actions/clients.ts (1585 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-b2a6b4418d23fd26", "name": "Very large file: webapp/app/actions/community.ts (2535 lines)", "shortDescription": {"text": "Very large file: webapp/app/actions/community.ts (2535 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-4dc54330ddcf3400", "name": "Very large file: webapp/app/actions/bookings.ts (1948 lines)", "shortDescription": {"text": "Very large file: webapp/app/actions/bookings.ts (1948 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-08d10b03175ddc94", "name": "Very large file: webapp/app/actions/community-admin.ts (2090 lines)", "shortDescription": {"text": "Very large file: webapp/app/actions/community-admin.ts (2090 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-1d11d64aa58a9df3", "name": "Very large file: webapp/lib/types/database.ts (5888 lines)", "shortDescription": {"text": "Very large file: webapp/lib/types/database.ts (5888 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-7912744aa6bcc7bd", "name": "Very large file: webapp/lib/email/templates.ts (2888 lines)", "shortDescription": {"text": "Very large file: webapp/lib/email/templates.ts (2888 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-4c1ef9a91109a7eb", "name": "Very large file: docs/scripts/generate-guide-screenshots.ts (2500 lines)", "shortDescription": {"text": "Very large file: docs/scripts/generate-guide-screenshots.ts (2500 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": "23 test file(s) for 646 source file(s) (ratio 0.04). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 177 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 285 placeholder/mock markers across 92 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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. 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-cc55229a7a3c078d", "name": "Agent authority lacks a verifier contract: .mcp.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .mcp.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-715fdb10f9c85b74", "name": "Agent instruction/config may expose a secret: claude.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: claude.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6158cb6e7ccf9500", "name": "Commented-code block (5 lines) in webapp/vitest.eval.config.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/vitest.eval.config.ts: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-0007a5a35bbfa68e", "name": "Commented-code block (6 lines) in webapp/app/page.tsx:226", "shortDescription": {"text": "Commented-code block (6 lines) in webapp/app/page.tsx:226"}, "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-b47c73162a1d986d", "name": "Commented-code block (5 lines) in webapp/app/robots.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/app/robots.ts: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-a58eb67819f2ffd0", "name": "Commented-code block (5 lines) in webapp/app/waitlist/WaitlistForm.tsx:120", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/app/waitlist/WaitlistForm.tsx:120"}, "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-0f5db0ade9eb8504", "name": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/app/api/whatsapp/click/[therapistId]/route.ts:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/app/api/whatsapp/click/[therapistId]/route.ts:54"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cff19fa0fe32613b", "name": "Commented-code block (6 lines) in webapp/app/api/management/compliance/run/route.ts:77", "shortDescription": {"text": "Commented-code block (6 lines) in webapp/app/api/management/compliance/run/route.ts:77"}, "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-0a81704e6c497b86", "name": "Commented-code block (6 lines) in webapp/app/api/email/unsubscribe/route.ts:8", "shortDescription": {"text": "Commented-code block (6 lines) in webapp/app/api/email/unsubscribe/route.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3e0329e8ef3af5e9", "name": "Commented-code block (5 lines) in webapp/app/directory/page.tsx:15", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/app/directory/page.tsx:15"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4cc17e0f54af10a2", "name": "Commented-code block (5 lines) in webapp/app/directory/[slug]/page.tsx:54", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/app/directory/[slug]/page.tsx:54"}, "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-488284c07924d3f2", "name": "Commented-code block (6 lines) in webapp/app/portal/(protected)/messages/[id]/page.tsx:65", "shortDescription": {"text": "Commented-code block (6 lines) in webapp/app/portal/(protected)/messages/[id]/page.tsx:65"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ddfbe7bff2f2c085", "name": "Commented-code block (6 lines) in webapp/app/actions/feedback.ts:213", "shortDescription": {"text": "Commented-code block (6 lines) in webapp/app/actions/feedback.ts:213"}, "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-a01bf4af552103d5", "name": "Commented-code block (5 lines) in webapp/app/actions/waitlist.ts:17", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/app/actions/waitlist.ts:17"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8ff5c080ab0c0642", "name": "Commented-code block (7 lines) in webapp/app/actions/therapist-products.ts:1017", "shortDescription": {"text": "Commented-code block (7 lines) in webapp/app/actions/therapist-products.ts:1017"}, "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-10b55aff1c250b0d", "name": "Commented-code block (5 lines) in webapp/app/actions/client-notes.ts:145", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/app/actions/client-notes.ts:145"}, "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-598594594f20d60e", "name": "Commented-code block (5 lines) in webapp/app/actions/therapist-terms.ts:259", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/app/actions/therapist-terms.ts:259"}, "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-abb911c66e5d704a", "name": "Commented-code block (9 lines) in webapp/app/actions/therapist-practice-locations.ts:72", "shortDescription": {"text": "Commented-code block (9 lines) in webapp/app/actions/therapist-practice-locations.ts:72"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-995032a780f4cb68", "name": "Commented-code block (5 lines) in webapp/app/actions/auth.ts:47", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/app/actions/auth.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-560e6d9def8df146", "name": "Commented-code block (5 lines) in webapp/app/actions/client-portal.ts:180", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/app/actions/client-portal.ts:180"}, "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-381ea74d2fc32023", "name": "Commented-code block (6 lines) in webapp/app/actions/therapist-videos.ts:693", "shortDescription": {"text": "Commented-code block (6 lines) in webapp/app/actions/therapist-videos.ts:693"}, "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-50ec9a438758caa9", "name": "Commented-code block (6 lines) in webapp/app/actions/therapist-profile.ts:519", "shortDescription": {"text": "Commented-code block (6 lines) in webapp/app/actions/therapist-profile.ts:519"}, "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-66415a10f0dcf36c", "name": "Commented-code block (6 lines) in webapp/app/actions/messages.ts:39", "shortDescription": {"text": "Commented-code block (6 lines) in webapp/app/actions/messages.ts:39"}, "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-c4b16b2331282450", "name": "Commented-code block (5 lines) in webapp/app/actions/clients.ts:421", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/app/actions/clients.ts:421"}, "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-7cc643f3264e2ff7", "name": "Commented-code block (5 lines) in webapp/app/actions/community.ts:30", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/app/actions/community.ts:30"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c5602e23bf500a38", "name": "Commented-code block (5 lines) in webapp/app/actions/availability.ts:23", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/app/actions/availability.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-22e86eb2ec1c2345", "name": "Commented-code block (5 lines) in webapp/app/actions/reports-admin.ts:400", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/app/actions/reports-admin.ts:400"}, "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-223b6756e68291ae", "name": "Commented-code block (5 lines) in webapp/app/actions/bookings.ts:695", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/app/actions/bookings.ts:695"}, "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-2919d90836807dce", "name": "Commented-code block (5 lines) in webapp/app/actions/waiting-list.ts:193", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/app/actions/waiting-list.ts:193"}, "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-690df715bd04a3cd", "name": "Commented-code block (7 lines) in webapp/app/actions/community-admin.ts:643", "shortDescription": {"text": "Commented-code block (7 lines) in webapp/app/actions/community-admin.ts:643"}, "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-f5f6dcfd8471b1f6", "name": "Commented-code block (6 lines) in webapp/app/actions/profile.ts:133", "shortDescription": {"text": "Commented-code block (6 lines) in webapp/app/actions/profile.ts:133"}, "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-8ec1fceb958dd73a", "name": "Commented-code block (5 lines) in webapp/app/actions/admin-videos.ts:14", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/app/actions/admin-videos.ts:14"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-de3fe47d1c613c92", "name": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/app/actions/admin-videos.ts:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/app/actions/admin-videos.ts:47"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d8e4224ac094f779", "name": "Commented-code block (5 lines) in webapp/app/actions/testimonials.ts:437", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/app/actions/testimonials.ts:437"}, "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-b01bf9042d2ac1de", "name": "Commented-code block (5 lines) in webapp/app/session-rsvp/error/page.tsx:14", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/app/session-rsvp/error/page.tsx:14"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e944f4f773ccc21f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/scripts/migrate-videos-to-stream.ts:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/scripts/migrate-videos-to-stream.ts:49"}, "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-042219b451edc19e", "name": "Commented-code block (5 lines) in webapp/components/landing/HeroSearch.tsx:58", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/components/landing/HeroSearch.tsx:58"}, "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-e9671b3751437f9e", "name": "Commented-code block (5 lines) in webapp/components/providers/SyncfusionProvider.tsx:7", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/components/providers/SyncfusionProvider.tsx:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-136b05e1b958cb72", "name": "Commented-code block (10 lines) in webapp/components/admin/RoleManagement.tsx:25", "shortDescription": {"text": "Commented-code block (10 lines) in webapp/components/admin/RoleManagement.tsx:25"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-60f35ec5f81a57c5", "name": "Commented-code block (5 lines) in webapp/components/profile/ProfilePhotoUpload.tsx:32", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/components/profile/ProfilePhotoUpload.tsx:32"}, "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-f1f5635a40e5381f", "name": "Commented-code block (5 lines) in webapp/components/testimonials/TestimonialForm.tsx:76", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/components/testimonials/TestimonialForm.tsx:76"}, "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-01205ae3a416f013", "name": "Commented-code block (7 lines) in webapp/components/community/PinLockPostButtons.tsx:16", "shortDescription": {"text": "Commented-code block (7 lines) in webapp/components/community/PinLockPostButtons.tsx:16"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-31e1b24f06d32ea2", "name": "Commented-code block (6 lines) in webapp/components/community/DeletePostButton.tsx:11", "shortDescription": {"text": "Commented-code block (6 lines) in webapp/components/community/DeletePostButton.tsx:11"}, "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-577a0a8924bc9781", "name": "Commented-code block (6 lines) in webapp/components/community/admin/CommunitySettingsForm.tsx:38", "shortDescription": {"text": "Commented-code block (6 lines) in webapp/components/community/admin/CommunitySettingsForm.tsx:38"}, "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-a9959d1fdc07d718", "name": "Commented-code block (5 lines) in webapp/components/management/compliance/ComplianceRunDialog.tsx:31", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/components/management/compliance/ComplianceRunDialog.tsx:31"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-813dcd1570b99cb8", "name": "Commented-code block (5 lines) in webapp/components/directory/TherapistAvatarWithVideo.tsx:54", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/components/directory/TherapistAvatarWithVideo.tsx:54"}, "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-6e06daf655de3584", "name": "Commented-code block (6 lines) in webapp/components/cookies/CookieConsentBanner.tsx:25", "shortDescription": {"text": "Commented-code block (6 lines) in webapp/components/cookies/CookieConsentBanner.tsx:25"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ab393f73d4ca7c30", "name": "Commented-code block (8 lines) in webapp/components/therapist-profile/TherapistProfilePageContent.tsx:82", "shortDescription": {"text": "Commented-code block (8 lines) in webapp/components/therapist-profile/TherapistProfilePageContent.tsx:82"}, "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-8c810e89b6355e44", "name": "Commented-code block (5 lines) in webapp/components/ui/Navbar.tsx:43", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/components/ui/Navbar.tsx:43"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4ea541da71421c65", "name": "Commented-code block (5 lines) in webapp/components/ui/PasswordInput.tsx:48", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/components/ui/PasswordInput.tsx:48"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-763052dbbd2e58e5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/lib/utils/videoEmbed.ts:129", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/lib/utils/videoEmbed.ts:129"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-30fa714f49680e1a", "name": "Commented-code block (12 lines) in webapp/lib/utils/seo.tsx:62", "shortDescription": {"text": "Commented-code block (12 lines) in webapp/lib/utils/seo.tsx:62"}, "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-9f9ab0f0b2d5c508", "name": "Commented-code block (6 lines) in webapp/lib/account/delete.ts:225", "shortDescription": {"text": "Commented-code block (6 lines) in webapp/lib/account/delete.ts:225"}, "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-283a564c029099d1", "name": "Commented-code block (5 lines) in webapp/lib/observability/ops-event.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/lib/observability/ops-event.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0488df2e4039a378", "name": "Commented-code block (6 lines) in webapp/lib/community/og-fetch.ts:10", "shortDescription": {"text": "Commented-code block (6 lines) in webapp/lib/community/og-fetch.ts:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eccdae39f13fe875", "name": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/lib/cloudflare/stream.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/lib/cloudflare/stream.ts:27"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cda1499c076fe5b4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/lib/calendar/zoom.ts:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/lib/calendar/zoom.ts:56"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cb6a727934e00e70", "name": "Commented-code block (21 lines) in webapp/lib/calendar/encryption.ts:20", "shortDescription": {"text": "Commented-code block (21 lines) in webapp/lib/calendar/encryption.ts:20"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f2bba76ea9cadba3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/lib/calendar/microsoft.ts:62", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/lib/calendar/microsoft.ts:62"}, "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-82128c85fc0f8346", "name": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/lib/calendar/revoke.ts:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/lib/calendar/revoke.ts:40"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e06523d7fb0a294f", "name": "Commented-code block (7 lines) in webapp/lib/calendar/google.ts:8", "shortDescription": {"text": "Commented-code block (7 lines) in webapp/lib/calendar/google.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aac3890a13a3a8ca", "name": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/lib/calendar/google.ts:83", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/lib/calendar/google.ts:83"}, "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-5bb95e098b4d0af9", "name": "Commented-code block (5 lines) in webapp/lib/validation/professional-bodies.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/lib/validation/professional-bodies.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-69658632fc647e99", "name": "Commented-code block (5 lines) in webapp/lib/validation/products.ts:138", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/lib/validation/products.ts:138"}, "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-80493c022ddb0811", "name": "Commented-code block (6 lines) in webapp/lib/validation/search-filters.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in webapp/lib/validation/search-filters.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-639dee0898a6c977", "name": "Commented-code block (5 lines) in webapp/lib/validation/client-portal.ts:13", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/lib/validation/client-portal.ts:13"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7df07714b3d20c7c", "name": "Commented-code block (6 lines) in webapp/lib/validation/therapist-profile.ts:7", "shortDescription": {"text": "Commented-code block (6 lines) in webapp/lib/validation/therapist-profile.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2289c8a87f05c979", "name": "Commented-code block (5 lines) in webapp/lib/validation/clients.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/lib/validation/clients.ts: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-3fd411bf28fd8634", "name": "Commented-code block (7 lines) in webapp/lib/validation/registration-screening.ts:54", "shortDescription": {"text": "Commented-code block (7 lines) in webapp/lib/validation/registration-screening.ts:54"}, "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-9729e0b8f1779322", "name": "Commented-code block (6 lines) in webapp/lib/compliance/run-review.ts:245", "shortDescription": {"text": "Commented-code block (6 lines) in webapp/lib/compliance/run-review.ts:245"}, "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-2ae03b3491f8b125", "name": "Commented-code block (7 lines) in webapp/lib/compliance/review-engine.ts:259", "shortDescription": {"text": "Commented-code block (7 lines) in webapp/lib/compliance/review-engine.ts:259"}, "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-f07bb8bd461ab275", "name": "Commented-code block (5 lines) in webapp/lib/compliance/client.ts:19", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/lib/compliance/client.ts:19"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-24ef2f270a0d98f4", "name": "Commented-code block (6 lines) in webapp/lib/compliance/content-snapshot.ts:155", "shortDescription": {"text": "Commented-code block (6 lines) in webapp/lib/compliance/content-snapshot.ts:155"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0bb1b13da4701466", "name": "Commented-code block (7 lines) in webapp/lib/compliance/eval/convergence.eval.ts:64", "shortDescription": {"text": "Commented-code block (7 lines) in webapp/lib/compliance/eval/convergence.eval.ts:64"}, "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-d00a25b4d90d94c7", "name": "Commented-code block (5 lines) in webapp/lib/constants/homepage-meta.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in webapp/lib/constants/homepage-meta.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b9ec4dccc92a22d9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 ubuntu/src/transcribe.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ubuntu/src/transcribe.ts:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-568959bccbc00761", "name": "Legacy-named symbol `eleven_multilingual_v2` in docs/compliance/video/remotion/scripts/generate-audio.ts:13", "shortDescription": {"text": "Legacy-named symbol `eleven_multilingual_v2` in docs/compliance/video/remotion/scripts/generate-audio.ts:13"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-512746646f64fc78", "name": "`fetch()` without try/.catch or AbortSignal \u2014 docs/compliance/video/remotion/scripts/generate-audio.ts:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 docs/compliance/video/remotion/scripts/generate-audio.ts:28"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6adfe3d30ee9355f", "name": "40 env vars used in code but missing from .env.example", "shortDescription": {"text": "40 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANTHROPIC_API_KEY`, `BASE_URL`, `CALENDAR_TOKEN_ENCRYPTION_KEY`, `CALENDAR_TOKEN_ENCRYPTION_KEY_V`, `CI`, `COMPLIANCE_REVIEW_MODEL`, `COMPLIANCE_VOTE_SAMPLES`, `CRON_SECRET` + 32 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-3679df466b25dbee", "name": "Dangling fetch: POST /api/admin/impersonate (webapp/components/admin/ImpersonateButton.tsx:17)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/impersonate (webapp/components/admin/ImpersonateButton.tsx:17)"}, "fullDescription": {"text": "`webapp/components/admin/ImpersonateButton.tsx:17` calls `POST /api/admin/impersonate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/impersonate`\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-46ea56fd04a7cd31", "name": "Dangling fetch: POST /api/admin/stop-impersonating (webapp/components/admin/ImpersonationBanner.tsx:11)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/stop-impersonating (webapp/components/admin/ImpersonationBanner.tsx:11)"}, "fullDescription": {"text": "`webapp/components/admin/ImpersonationBanner.tsx:11` calls `POST /api/admin/stop-impersonating` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/stop-impersonating`\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-ab389372dca78d31", "name": "Dangling fetch: POST /api/management/compliance/run (webapp/components/management/compliance/ComplianceRunDialog.tsx:86)", "shortDescription": {"text": "Dangling fetch: POST /api/management/compliance/run (webapp/components/management/compliance/ComplianceRunDialog.tsx:86)"}, "fullDescription": {"text": "`webapp/components/management/compliance/ComplianceRunDialog.tsx:86` calls `POST /api/management/compliance/run` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/management/compliance/run`\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-91a85ba11c6cc9a6", "name": "Dangling fetch: POST /api/analytics/track (webapp/components/analytics/TrackEvent.tsx:18)", "shortDescription": {"text": "Dangling fetch: POST /api/analytics/track (webapp/components/analytics/TrackEvent.tsx:18)"}, "fullDescription": {"text": "`webapp/components/analytics/TrackEvent.tsx:18` calls `POST /api/analytics/track` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/analytics/track`\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-c60aa772a736b35e", "name": "Dangling fetch: POST /api/analytics/track-batch (webapp/components/analytics/TrackSearchImpressions.tsx:15)", "shortDescription": {"text": "Dangling fetch: POST /api/analytics/track-batch (webapp/components/analytics/TrackSearchImpressions.tsx:15)"}, "fullDescription": {"text": "`webapp/components/analytics/TrackSearchImpressions.tsx:15` calls `POST /api/analytics/track-batch` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/analytics/track-batch`\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-29f4420f851c53ce", "name": "Dangling fetch: POST /api/dashboard/compliance/rerun (webapp/components/compliance/MemberCompliancePanel.tsx:79)", "shortDescription": {"text": "Dangling fetch: POST /api/dashboard/compliance/rerun (webapp/components/compliance/MemberCompliancePanel.tsx:79)"}, "fullDescription": {"text": "`webapp/components/compliance/MemberCompliancePanel.tsx:79` calls `POST /api/dashboard/compliance/rerun` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/dashboard/compliance/rerun`\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-cf8396db0991c551", "name": "Dangling fetch: GET /api/locations/autocomplete?q=${encodeURIComponent(term)} (webapp/components/ui/LocationAutocomplete", "shortDescription": {"text": "Dangling fetch: GET /api/locations/autocomplete?q=${encodeURIComponent(term)} (webapp/components/ui/LocationAutocomplete.tsx:54)"}, "fullDescription": {"text": "`webapp/components/ui/LocationAutocomplete.tsx:54` calls `GET /api/locations/autocomplete?q=${encodeURIComponent(term)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/locations/autocomplete`\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-72341e5bff00b025", "name": "Dangling fetch: POST https://challenges.cloudflare.com/turnstile/v0/siteverify (webapp/lib/turnstile.ts:31)", "shortDescription": {"text": "Dangling fetch: POST https://challenges.cloudflare.com/turnstile/v0/siteverify (webapp/lib/turnstile.ts:31)"}, "fullDescription": {"text": "`webapp/lib/turnstile.ts:31` calls `POST https://challenges.cloudflare.com/turnstile/v0/siteverify` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/challenges.cloudflare.com/turnstile/v0/siteverify`\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-f707f9ecd18b6eba", "name": "Dangling fetch: POST /api/analytics/track-video (webapp/lib/hooks/useVideoAnalytics.ts:32)", "shortDescription": {"text": "Dangling fetch: POST /api/analytics/track-video (webapp/lib/hooks/useVideoAnalytics.ts:32)"}, "fullDescription": {"text": "`webapp/lib/hooks/useVideoAnalytics.ts:32` calls `POST /api/analytics/track-video` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/analytics/track-video`\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-dadd95b152f50e88", "name": "Dangling fetch: POST https://oauth2.googleapis.com/revoke (webapp/lib/calendar/revoke.ts:40)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/revoke (webapp/lib/calendar/revoke.ts:40)"}, "fullDescription": {"text": "`webapp/lib/calendar/revoke.ts:40` calls `POST https://oauth2.googleapis.com/revoke` 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/revoke`\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-dbc617a5775017b4", "name": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${VOICE}/with-timestamps (docs/compliance/video/remotio", "shortDescription": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${VOICE}/with-timestamps (docs/compliance/video/remotion/scripts/generate-audio.ts:28)"}, "fullDescription": {"text": "`docs/compliance/video/remotion/scripts/generate-audio.ts:28` calls `POST https://api.elevenlabs.io/v1/text-to-speech/${VOICE}/with-timestamps` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.elevenlabs.io/v1/text-to-speech/<p>/with-timestamps`\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-6f2957b381c87292", "name": "Unused endpoint: POST /webhook/transcribe", "shortDescription": {"text": "Unused endpoint: POST /webhook/transcribe"}, "fullDescription": {"text": "`ubuntu/src/index.ts` declares `POST /webhook/transcribe` 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-9285f551fa6418c8", "name": "Unused endpoint: POST /retry/:videoId", "shortDescription": {"text": "Unused endpoint: POST /retry/:videoId"}, "fullDescription": {"text": "`ubuntu/src/index.ts` declares `POST /retry/:videoId` 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/24103"}, "properties": {"repository": "allingtm/findhypnotherapy", "repoUrl": "https://github.com/allingtm/findhypnotherapy", "branch": "main"}, "results": [{"ruleId": "scanner-184667777694f9d3", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 webapp/app/dashboard/updates/[id]/page.tsx:45"}, "properties": {"repobilityId": "f0c175949c6848ea", "scanner": "scanner-primary", "fingerprint": "184667777694f9d3", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-40aebc228635901e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/app/dashboard/community/page.tsx:113"}, "properties": {"repobilityId": "7df422b57f0f22a2", "scanner": "scanner-primary", "fingerprint": "40aebc228635901e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-906cef0939682730", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/app/dashboard/messages/[conversationId]/page.tsx:39"}, "properties": {"repobilityId": "1164ecc1e330da6b", "scanner": "scanner-primary", "fingerprint": "906cef0939682730", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7c1e4e3d20bf28e6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 webapp/app/login/LoginForm.tsx:56"}, "properties": {"repobilityId": "732fb705bb43ff98", "scanner": "scanner-primary", "fingerprint": "7c1e4e3d20bf28e6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-19e1b95778147119", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 webapp/app/api/cron/compliance-sweep/route.ts:68"}, "properties": {"repobilityId": "0ee8de03a7572d18", "scanner": "scanner-primary", "fingerprint": "19e1b95778147119", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-96745cd7dc9e6405", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 webapp/app/api/cron/account-deletion/finalize/route.ts:59"}, "properties": {"repobilityId": "41d093774450062e", "scanner": "scanner-primary", "fingerprint": "96745cd7dc9e6405", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6c9a4f8bafb74ff3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/app/portal/(protected)/messages/page.tsx:51"}, "properties": {"repobilityId": "2b85b51652f8e535", "scanner": "scanner-primary", "fingerprint": "6c9a4f8bafb74ff3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-67f8983890c921b9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 webapp/app/register/RegisterForm.tsx:106"}, "properties": {"repobilityId": "49f27920b3d6c306", "scanner": "scanner-primary", "fingerprint": "67f8983890c921b9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3850c7fe5c5f147d", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 webapp/app/actions/compliance.ts:112"}, "properties": {"repobilityId": "2dd7661e5464eabd", "scanner": "scanner-primary", "fingerprint": "3850c7fe5c5f147d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-c771ccf4a9a55644", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 webapp/app/actions/auth.ts:461"}, "properties": {"repobilityId": "af1ea91a959e0ef0", "scanner": "scanner-primary", "fingerprint": "c771ccf4a9a55644", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-67369be03120141a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 webapp/app/actions/auth.ts:87"}, "properties": {"repobilityId": "90d90ad69c2ee6fa", "scanner": "scanner-primary", "fingerprint": "67369be03120141a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5ea861c8e74df455", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 webapp/scripts/migrate-videos-to-stream.ts:74"}, "properties": {"repobilityId": "ed97ccd7858cddb4", "scanner": "scanner-primary", "fingerprint": "5ea861c8e74df455", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7cc53c5502e2edf4", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 webapp/scripts/migrate-storage-to-r2.ts:89"}, "properties": {"repobilityId": "f4558e27ccfb956c", "scanner": "scanner-primary", "fingerprint": "7cc53c5502e2edf4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-ddabcc1e18a8173c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 webapp/scripts/migrate-storage-to-r2.ts:186"}, "properties": {"repobilityId": "8d89f1bee6a4eab8", "scanner": "scanner-primary", "fingerprint": "ddabcc1e18a8173c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f62778918161f4ac", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/dashboard/TodaySchedule.tsx:136"}, "properties": {"repobilityId": "4245a606be09a34f", "scanner": "scanner-primary", "fingerprint": "f62778918161f4ac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bf24fce934511280", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/dashboard/ActivityFeed.tsx:149"}, "properties": {"repobilityId": "1d905943cede832c", "scanner": "scanner-primary", "fingerprint": "bf24fce934511280", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8b4138819fd5a2f1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/dashboard/StatCard.tsx:42"}, "properties": {"repobilityId": "607a3b9cc0ab56f5", "scanner": "scanner-primary", "fingerprint": "8b4138819fd5a2f1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e632b2731ba9a04b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/dashboard/ActionItemsList.tsx:135"}, "properties": {"repobilityId": "a9fd1b7334d8865b", "scanner": "scanner-primary", "fingerprint": "e632b2731ba9a04b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-48e0a68841a61a37", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/clients/WaitingListTab.tsx:180"}, "properties": {"repobilityId": "cbea749d6b6edb1c", "scanner": "scanner-primary", "fingerprint": "48e0a68841a61a37", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7f810895bccea317", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/clients/ClientCard.tsx:118"}, "properties": {"repobilityId": "e65febdb8a1d45bd", "scanner": "scanner-primary", "fingerprint": "7f810895bccea317", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a3d53e0304488e07", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/landing/HeroSearch.tsx:277"}, "properties": {"repobilityId": "1d70a3dfdf242302", "scanner": "scanner-primary", "fingerprint": "a3d53e0304488e07", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1dc13bcf14f71cfb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/admin/AdminVideosTable.tsx:175"}, "properties": {"repobilityId": "391f271599f102ab", "scanner": "scanner-primary", "fingerprint": "1dc13bcf14f71cfb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-71c8bd9293e47718", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/admin/ReportsTable.tsx:177"}, "properties": {"repobilityId": "d2698e3b6fafb901", "scanner": "scanner-primary", "fingerprint": "71c8bd9293e47718", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6dd17d18bf3b4cab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/practice/ProductCardChecklist.tsx:218"}, "properties": {"repobilityId": "917a33153bc8cf41", "scanner": "scanner-primary", "fingerprint": "6dd17d18bf3b4cab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-78c043c00a45c12d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/video/VideoUploadForm.tsx:644"}, "properties": {"repobilityId": "a602d33ce7bf25ab", "scanner": "scanner-primary", "fingerprint": "78c043c00a45c12d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-314c29cdd4e69b67", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/video/VideoCard.tsx:139"}, "properties": {"repobilityId": "2734b4ec617ae530", "scanner": "scanner-primary", "fingerprint": "314c29cdd4e69b67", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5d92ed81bc54275a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/availability/DateOverrides.tsx:205"}, "properties": {"repobilityId": "20afdcaa1b5d14fc", "scanner": "scanner-primary", "fingerprint": "5d92ed81bc54275a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4cc2b9b8d095e48b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/testimonials/InviteModal.tsx:111"}, "properties": {"repobilityId": "7179ab90edb5b74b", "scanner": "scanner-primary", "fingerprint": "4cc2b9b8d095e48b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fce1532fd9a3f79e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/community/MemberCard.tsx:90"}, "properties": {"repobilityId": "ce870119a1268daf", "scanner": "scanner-primary", "fingerprint": "fce1532fd9a3f79e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6e7218fa472dae2c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/community/PostForm.tsx:360"}, "properties": {"repobilityId": "21c3dfb02751afb3", "scanner": "scanner-primary", "fingerprint": "6e7218fa472dae2c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-65e6909f789cbfa3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/community/PostCard.tsx:121"}, "properties": {"repobilityId": "41a97d1579959444", "scanner": "scanner-primary", "fingerprint": "65e6909f789cbfa3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c9a85658ddc8507b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/community/LinkPreview.tsx:36"}, "properties": {"repobilityId": "b909be106e2cc63f", "scanner": "scanner-primary", "fingerprint": "c9a85658ddc8507b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1af50fedc4cc403a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/community/admin/MemberManager.tsx:270"}, "properties": {"repobilityId": "6e0820d4e548d5e2", "scanner": "scanner-primary", "fingerprint": "1af50fedc4cc403a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-45023f541be8a8e8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/community/admin/CategoryManager.tsx:234"}, "properties": {"repobilityId": "3d19437c14b9ac3c", "scanner": "scanner-primary", "fingerprint": "45023f541be8a8e8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fb30a6e937a9bce0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/management/VerificationMemberCard.tsx:92"}, "properties": {"repobilityId": "55667f93f6374d72", "scanner": "scanner-primary", "fingerprint": "fb30a6e937a9bce0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cd2e106a6eeac7f4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/messages/ConversationList.tsx:140"}, "properties": {"repobilityId": "12d79f33f9f1371b", "scanner": "scanner-primary", "fingerprint": "cd2e106a6eeac7f4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5b7324a36a7bf53b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/settings/BlockedUsersSection.tsx:118"}, "properties": {"repobilityId": "0a37df9eb70488fa", "scanner": "scanner-primary", "fingerprint": "5b7324a36a7bf53b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b27848929c853881", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/analytics/VideoAnalyticsSection.tsx:142"}, "properties": {"repobilityId": "3840bd4ca4438886", "scanner": "scanner-primary", "fingerprint": "b27848929c853881", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f73ed540e9515a9e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/analytics/TopServicesTable.tsx:36"}, "properties": {"repobilityId": "14221430a6b4d35c", "scanner": "scanner-primary", "fingerprint": "f73ed540e9515a9e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fe72b94b225063e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/therapist-profile/sections/LinksSection.tsx:317"}, "properties": {"repobilityId": "8edffa8997213d1b", "scanner": "scanner-primary", "fingerprint": "fe72b94b225063e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fa44b4e63f9282c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/video-feed/VideoWall.tsx:150"}, "properties": {"repobilityId": "928756340fd56828", "scanner": "scanner-primary", "fingerprint": "fa44b4e63f9282c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d2c7c777b46390e8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 webapp/components/video-feed/DesktopVideoFeed.tsx:180"}, "properties": {"repobilityId": "2965b45e0507ccab", "scanner": "scanner-primary", "fingerprint": "d2c7c777b46390e8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-964dec74a206aec8", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 webapp/lib/utils/seo.tsx:48"}, "properties": {"repobilityId": "8ea2fb5017328d6f", "scanner": "scanner-primary", "fingerprint": "964dec74a206aec8", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6f0abbb0c53331ea", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 webapp/lib/compliance/eval/convergence.eval.ts:48"}, "properties": {"repobilityId": "486c74c635c9987c", "scanner": "scanner-primary", "fingerprint": "6f0abbb0c53331ea", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-545d5d7bb5882d4b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ubuntu/src/index.ts:81"}, "properties": {"repobilityId": "b79e9d15ba03cfac", "scanner": "scanner-primary", "fingerprint": "545d5d7bb5882d4b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7df85652c6b7cf10", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ubuntu/src/transcribe.ts:54"}, "properties": {"repobilityId": "f690f91dc13a709d", "scanner": "scanner-primary", "fingerprint": "7df85652c6b7cf10", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-60b5452439d3c06f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 docs/scripts/generate-guide-screenshots.ts:129"}, "properties": {"repobilityId": "cd5ed528fc8d4a1f", "scanner": "scanner-primary", "fingerprint": "60b5452439d3c06f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6474a65504b9a78d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 docs/scripts/generate-marketing-deck.ts:1217"}, "properties": {"repobilityId": "47f6f5d409af8083", "scanner": "scanner-primary", "fingerprint": "6474a65504b9a78d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-092af8ddc323b0b2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 docs/scripts/_generate-pdf.js:26"}, "properties": {"repobilityId": "42dde2454bf40ec6", "scanner": "scanner-primary", "fingerprint": "092af8ddc323b0b2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f48819b2724cc628", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 docs/compliance/video/remotion/scripts/generate-audio.ts:51"}, "properties": {"repobilityId": "3eaa05ad5a96b884", "scanner": "scanner-primary", "fingerprint": "f48819b2724cc628", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-db28e22eeb3356ab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 services/transcription/src/index.ts:89"}, "properties": {"repobilityId": "0b182011c8525a2e", "scanner": "scanner-primary", "fingerprint": "db28e22eeb3356ab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-767e6cb1a8ce5185", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 services/transcription/src/transcribe.ts:23"}, "properties": {"repobilityId": "fd6ac2a328912605", "scanner": "scanner-primary", "fingerprint": "767e6cb1a8ce5185", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2161ded6a847ae1f", "level": "error", "message": {"text": "Runtime dotenv file present in repo: webapp/.env.sentry-build-plugin"}, "properties": {"repobilityId": "b71e11c8bb9d8db8", "scanner": "scanner-primary", "fingerprint": "2161ded6a847ae1f", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env", "env_file_with_secret"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "webapp/.env.sentry-build-plugin"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b138305134d2d766", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in webapp/app/dashboard/updates/[id]/page.tsx:45"}, "properties": {"repobilityId": "a4fd24850480758a", "scanner": "scanner-primary", "fingerprint": "b138305134d2d766", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "webapp/app/dashboard/updates/[id]/page.tsx"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-285145f3cc44ecd4", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in webapp/lib/utils/seo.tsx:48"}, "properties": {"repobilityId": "63bd1e12b1141329", "scanner": "scanner-primary", "fingerprint": "285145f3cc44ecd4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "webapp/lib/utils/seo.tsx"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-298d737ed49b6225", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in ubuntu/src/transcribe.ts:1"}, "properties": {"repobilityId": "5048b7af7a472071", "scanner": "scanner-primary", "fingerprint": "298d737ed49b6225", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ubuntu/src/transcribe.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d4f7cadd07dba8c5", "level": "error", "message": {"text": "Possible secret in docs/scripts/generate-guide-screenshots.ts"}, "properties": {"repobilityId": "3548ed227478f9ee", "scanner": "scanner-primary", "fingerprint": "d4f7cadd07dba8c5", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/scripts/generate-guide-screenshots.ts"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-ba66a43932ab67be", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in docs/scripts/_generate-pdf.js:2"}, "properties": {"repobilityId": "4711389281489ed0", "scanner": "scanner-primary", "fingerprint": "ba66a43932ab67be", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/scripts/_generate-pdf.js"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-cf4bfd4db9072725", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in services/transcription/src/transcribe.ts:1"}, "properties": {"repobilityId": "5530cdc092ee2568", "scanner": "scanner-primary", "fingerprint": "cf4bfd4db9072725", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/transcription/src/transcribe.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4b954c8a57ff7171", "level": "note", "message": {"text": "Very large file: webapp/app/directory/[slug]/page.tsx (1403 lines)"}, "properties": {"repobilityId": "7be628b64d27ed9b", "scanner": "scanner-primary", "fingerprint": "4b954c8a57ff7171", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-26ad72458e0d4782", "level": "note", "message": {"text": "Very large file: webapp/app/actions/therapist-videos.ts (2024 lines)"}, "properties": {"repobilityId": "f7176bbaf484de71", "scanner": "scanner-primary", "fingerprint": "26ad72458e0d4782", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bd9a59b771f8be48", "level": "note", "message": {"text": "Very large file: webapp/app/actions/clients.ts (1585 lines)"}, "properties": {"repobilityId": "677faffaa439b95d", "scanner": "scanner-primary", "fingerprint": "bd9a59b771f8be48", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b2a6b4418d23fd26", "level": "note", "message": {"text": "Very large file: webapp/app/actions/community.ts (2535 lines)"}, "properties": {"repobilityId": "7e90ec600f768b17", "scanner": "scanner-primary", "fingerprint": "b2a6b4418d23fd26", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4dc54330ddcf3400", "level": "note", "message": {"text": "Very large file: webapp/app/actions/bookings.ts (1948 lines)"}, "properties": {"repobilityId": "a5212a27910309fa", "scanner": "scanner-primary", "fingerprint": "4dc54330ddcf3400", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-08d10b03175ddc94", "level": "note", "message": {"text": "Very large file: webapp/app/actions/community-admin.ts (2090 lines)"}, "properties": {"repobilityId": "85f7cfbcd55d51b0", "scanner": "scanner-primary", "fingerprint": "08d10b03175ddc94", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1d11d64aa58a9df3", "level": "note", "message": {"text": "Very large file: webapp/lib/types/database.ts (5888 lines)"}, "properties": {"repobilityId": "a280462500cfe006", "scanner": "scanner-primary", "fingerprint": "1d11d64aa58a9df3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7912744aa6bcc7bd", "level": "note", "message": {"text": "Very large file: webapp/lib/email/templates.ts (2888 lines)"}, "properties": {"repobilityId": "a30e3573b8fa8ac4", "scanner": "scanner-primary", "fingerprint": "7912744aa6bcc7bd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4c1ef9a91109a7eb", "level": "note", "message": {"text": "Very large file: docs/scripts/generate-guide-screenshots.ts (2500 lines)"}, "properties": {"repobilityId": "9247eb626588aa5b", "scanner": "scanner-primary", "fingerprint": "4c1ef9a91109a7eb", "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": "d469f81b3b32955b", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "7f8020ea562847ee", "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": "3c48de9572e18f3b", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "4551a63e1620b8d0", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "9a25359e1771ca13", "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": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "6821c2daa1a8e688", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "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": "6bfbd174e12fe35c", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-cc55229a7a3c078d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .mcp.json"}, "properties": {"repobilityId": "51942fb3d5b8b5b4", "scanner": "scanner-primary", "fingerprint": "cc55229a7a3c078d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "mcp_config"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".mcp.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-715fdb10f9c85b74", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: claude.md"}, "properties": {"repobilityId": "c351897f3969c518", "scanner": "scanner-primary", "fingerprint": "715fdb10f9c85b74", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "claude.md"}, "region": {"startLine": 67}}}]}, {"ruleId": "scanner-6158cb6e7ccf9500", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/vitest.eval.config.ts:4"}, "properties": {"repobilityId": "b7993ad052a3b0a1", "scanner": "scanner-primary", "fingerprint": "6158cb6e7ccf9500", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0007a5a35bbfa68e", "level": "none", "message": {"text": "Commented-code block (6 lines) in webapp/app/page.tsx:226"}, "properties": {"repobilityId": "ea147d1ccf4a657c", "scanner": "scanner-primary", "fingerprint": "0007a5a35bbfa68e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b47c73162a1d986d", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/app/robots.ts:4"}, "properties": {"repobilityId": "3c46f75b691a5e10", "scanner": "scanner-primary", "fingerprint": "b47c73162a1d986d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a58eb67819f2ffd0", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/app/waitlist/WaitlistForm.tsx:120"}, "properties": {"repobilityId": "ce4f9350b5e31372", "scanner": "scanner-primary", "fingerprint": "a58eb67819f2ffd0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f5db0ade9eb8504", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/app/api/whatsapp/click/[therapistId]/route.ts:54"}, "properties": {"repobilityId": "2412413ea0b6a417", "scanner": "scanner-primary", "fingerprint": "0f5db0ade9eb8504", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cff19fa0fe32613b", "level": "none", "message": {"text": "Commented-code block (6 lines) in webapp/app/api/management/compliance/run/route.ts:77"}, "properties": {"repobilityId": "bc01e14bc99f624d", "scanner": "scanner-primary", "fingerprint": "cff19fa0fe32613b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0a81704e6c497b86", "level": "none", "message": {"text": "Commented-code block (6 lines) in webapp/app/api/email/unsubscribe/route.ts:8"}, "properties": {"repobilityId": "ffa8d8c4a0ac2818", "scanner": "scanner-primary", "fingerprint": "0a81704e6c497b86", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3e0329e8ef3af5e9", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/app/directory/page.tsx:15"}, "properties": {"repobilityId": "de4c190cdb7131ba", "scanner": "scanner-primary", "fingerprint": "3e0329e8ef3af5e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4cc17e0f54af10a2", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/app/directory/[slug]/page.tsx:54"}, "properties": {"repobilityId": "3c76586ab5e07918", "scanner": "scanner-primary", "fingerprint": "4cc17e0f54af10a2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-488284c07924d3f2", "level": "none", "message": {"text": "Commented-code block (6 lines) in webapp/app/portal/(protected)/messages/[id]/page.tsx:65"}, "properties": {"repobilityId": "9188a2a0006a3482", "scanner": "scanner-primary", "fingerprint": "488284c07924d3f2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ddfbe7bff2f2c085", "level": "none", "message": {"text": "Commented-code block (6 lines) in webapp/app/actions/feedback.ts:213"}, "properties": {"repobilityId": "e5d6591a75dcdf9d", "scanner": "scanner-primary", "fingerprint": "ddfbe7bff2f2c085", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a01bf4af552103d5", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/app/actions/waitlist.ts:17"}, "properties": {"repobilityId": "df794b2dfa0b4b65", "scanner": "scanner-primary", "fingerprint": "a01bf4af552103d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8ff5c080ab0c0642", "level": "none", "message": {"text": "Commented-code block (7 lines) in webapp/app/actions/therapist-products.ts:1017"}, "properties": {"repobilityId": "4f89b33b71b635df", "scanner": "scanner-primary", "fingerprint": "8ff5c080ab0c0642", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-10b55aff1c250b0d", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/app/actions/client-notes.ts:145"}, "properties": {"repobilityId": "790a19bbf008a171", "scanner": "scanner-primary", "fingerprint": "10b55aff1c250b0d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-598594594f20d60e", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/app/actions/therapist-terms.ts:259"}, "properties": {"repobilityId": "b71d98f7b8441a5a", "scanner": "scanner-primary", "fingerprint": "598594594f20d60e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-abb911c66e5d704a", "level": "none", "message": {"text": "Commented-code block (9 lines) in webapp/app/actions/therapist-practice-locations.ts:72"}, "properties": {"repobilityId": "9f3270febd8ad306", "scanner": "scanner-primary", "fingerprint": "abb911c66e5d704a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-995032a780f4cb68", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/app/actions/auth.ts:47"}, "properties": {"repobilityId": "79da9f90580ea510", "scanner": "scanner-primary", "fingerprint": "995032a780f4cb68", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-560e6d9def8df146", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/app/actions/client-portal.ts:180"}, "properties": {"repobilityId": "2ecb52446e88b741", "scanner": "scanner-primary", "fingerprint": "560e6d9def8df146", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-381ea74d2fc32023", "level": "none", "message": {"text": "Commented-code block (6 lines) in webapp/app/actions/therapist-videos.ts:693"}, "properties": {"repobilityId": "3d793f245a0a5520", "scanner": "scanner-primary", "fingerprint": "381ea74d2fc32023", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-50ec9a438758caa9", "level": "none", "message": {"text": "Commented-code block (6 lines) in webapp/app/actions/therapist-profile.ts:519"}, "properties": {"repobilityId": "c575421ca375cd11", "scanner": "scanner-primary", "fingerprint": "50ec9a438758caa9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-66415a10f0dcf36c", "level": "none", "message": {"text": "Commented-code block (6 lines) in webapp/app/actions/messages.ts:39"}, "properties": {"repobilityId": "9a6899a3a51f954b", "scanner": "scanner-primary", "fingerprint": "66415a10f0dcf36c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c4b16b2331282450", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/app/actions/clients.ts:421"}, "properties": {"repobilityId": "0cb728344213a606", "scanner": "scanner-primary", "fingerprint": "c4b16b2331282450", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7cc643f3264e2ff7", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/app/actions/community.ts:30"}, "properties": {"repobilityId": "675854f9451fef18", "scanner": "scanner-primary", "fingerprint": "7cc643f3264e2ff7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c5602e23bf500a38", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/app/actions/availability.ts:23"}, "properties": {"repobilityId": "9e55f327b66c399e", "scanner": "scanner-primary", "fingerprint": "c5602e23bf500a38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-22e86eb2ec1c2345", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/app/actions/reports-admin.ts:400"}, "properties": {"repobilityId": "9f9fbc5ff95f8bbc", "scanner": "scanner-primary", "fingerprint": "22e86eb2ec1c2345", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-223b6756e68291ae", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/app/actions/bookings.ts:695"}, "properties": {"repobilityId": "96e6d43f3c2643a3", "scanner": "scanner-primary", "fingerprint": "223b6756e68291ae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2919d90836807dce", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/app/actions/waiting-list.ts:193"}, "properties": {"repobilityId": "f2229acbe1726a4a", "scanner": "scanner-primary", "fingerprint": "2919d90836807dce", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-690df715bd04a3cd", "level": "none", "message": {"text": "Commented-code block (7 lines) in webapp/app/actions/community-admin.ts:643"}, "properties": {"repobilityId": "be23f3e9f01fbefc", "scanner": "scanner-primary", "fingerprint": "690df715bd04a3cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f5f6dcfd8471b1f6", "level": "none", "message": {"text": "Commented-code block (6 lines) in webapp/app/actions/profile.ts:133"}, "properties": {"repobilityId": "91b6b23f2ffdc0e5", "scanner": "scanner-primary", "fingerprint": "f5f6dcfd8471b1f6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8ec1fceb958dd73a", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/app/actions/admin-videos.ts:14"}, "properties": {"repobilityId": "5d091618a7b068b8", "scanner": "scanner-primary", "fingerprint": "8ec1fceb958dd73a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-de3fe47d1c613c92", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/app/actions/admin-videos.ts:47"}, "properties": {"repobilityId": "6a13235b84335759", "scanner": "scanner-primary", "fingerprint": "de3fe47d1c613c92", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d8e4224ac094f779", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/app/actions/testimonials.ts:437"}, "properties": {"repobilityId": "79cc9b01b506d799", "scanner": "scanner-primary", "fingerprint": "d8e4224ac094f779", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b01bf9042d2ac1de", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/app/session-rsvp/error/page.tsx:14"}, "properties": {"repobilityId": "da8cfc0220c68baa", "scanner": "scanner-primary", "fingerprint": "b01bf9042d2ac1de", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e944f4f773ccc21f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/scripts/migrate-videos-to-stream.ts:49"}, "properties": {"repobilityId": "b4e1b998e35777e0", "scanner": "scanner-primary", "fingerprint": "e944f4f773ccc21f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-042219b451edc19e", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/components/landing/HeroSearch.tsx:58"}, "properties": {"repobilityId": "20f6c266c00af319", "scanner": "scanner-primary", "fingerprint": "042219b451edc19e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e9671b3751437f9e", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/components/providers/SyncfusionProvider.tsx:7"}, "properties": {"repobilityId": "3923594da2d0effe", "scanner": "scanner-primary", "fingerprint": "e9671b3751437f9e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-136b05e1b958cb72", "level": "none", "message": {"text": "Commented-code block (10 lines) in webapp/components/admin/RoleManagement.tsx:25"}, "properties": {"repobilityId": "625a1ae1104af384", "scanner": "scanner-primary", "fingerprint": "136b05e1b958cb72", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-60f35ec5f81a57c5", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/components/profile/ProfilePhotoUpload.tsx:32"}, "properties": {"repobilityId": "b3260e145ef328c5", "scanner": "scanner-primary", "fingerprint": "60f35ec5f81a57c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f1f5635a40e5381f", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/components/testimonials/TestimonialForm.tsx:76"}, "properties": {"repobilityId": "11142204492396e9", "scanner": "scanner-primary", "fingerprint": "f1f5635a40e5381f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-01205ae3a416f013", "level": "none", "message": {"text": "Commented-code block (7 lines) in webapp/components/community/PinLockPostButtons.tsx:16"}, "properties": {"repobilityId": "cda859223e490d84", "scanner": "scanner-primary", "fingerprint": "01205ae3a416f013", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-31e1b24f06d32ea2", "level": "none", "message": {"text": "Commented-code block (6 lines) in webapp/components/community/DeletePostButton.tsx:11"}, "properties": {"repobilityId": "1cd034844ab8bf23", "scanner": "scanner-primary", "fingerprint": "31e1b24f06d32ea2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-577a0a8924bc9781", "level": "none", "message": {"text": "Commented-code block (6 lines) in webapp/components/community/admin/CommunitySettingsForm.tsx:38"}, "properties": {"repobilityId": "499a886166c6c4ea", "scanner": "scanner-primary", "fingerprint": "577a0a8924bc9781", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a9959d1fdc07d718", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/components/management/compliance/ComplianceRunDialog.tsx:31"}, "properties": {"repobilityId": "eb7778c34b7d1d8b", "scanner": "scanner-primary", "fingerprint": "a9959d1fdc07d718", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-813dcd1570b99cb8", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/components/directory/TherapistAvatarWithVideo.tsx:54"}, "properties": {"repobilityId": "e92d4d1cb04913bc", "scanner": "scanner-primary", "fingerprint": "813dcd1570b99cb8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6e06daf655de3584", "level": "none", "message": {"text": "Commented-code block (6 lines) in webapp/components/cookies/CookieConsentBanner.tsx:25"}, "properties": {"repobilityId": "a177b9fa2d3da86a", "scanner": "scanner-primary", "fingerprint": "6e06daf655de3584", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ab393f73d4ca7c30", "level": "none", "message": {"text": "Commented-code block (8 lines) in webapp/components/therapist-profile/TherapistProfilePageContent.tsx:82"}, "properties": {"repobilityId": "34d8e2a40598ff42", "scanner": "scanner-primary", "fingerprint": "ab393f73d4ca7c30", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8c810e89b6355e44", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/components/ui/Navbar.tsx:43"}, "properties": {"repobilityId": "7d0957201fe7734e", "scanner": "scanner-primary", "fingerprint": "8c810e89b6355e44", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4ea541da71421c65", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/components/ui/PasswordInput.tsx:48"}, "properties": {"repobilityId": "076d25355bc43664", "scanner": "scanner-primary", "fingerprint": "4ea541da71421c65", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-763052dbbd2e58e5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/lib/utils/videoEmbed.ts:129"}, "properties": {"repobilityId": "4aeb2e1887ff5eab", "scanner": "scanner-primary", "fingerprint": "763052dbbd2e58e5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-30fa714f49680e1a", "level": "none", "message": {"text": "Commented-code block (12 lines) in webapp/lib/utils/seo.tsx:62"}, "properties": {"repobilityId": "a244e811babd9c6e", "scanner": "scanner-primary", "fingerprint": "30fa714f49680e1a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9f9ab0f0b2d5c508", "level": "none", "message": {"text": "Commented-code block (6 lines) in webapp/lib/account/delete.ts:225"}, "properties": {"repobilityId": "a84606db49bacb77", "scanner": "scanner-primary", "fingerprint": "9f9ab0f0b2d5c508", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-283a564c029099d1", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/lib/observability/ops-event.ts:1"}, "properties": {"repobilityId": "1e62c10efec83e41", "scanner": "scanner-primary", "fingerprint": "283a564c029099d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0488df2e4039a378", "level": "none", "message": {"text": "Commented-code block (6 lines) in webapp/lib/community/og-fetch.ts:10"}, "properties": {"repobilityId": "ae108a54b79b6cbe", "scanner": "scanner-primary", "fingerprint": "0488df2e4039a378", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eccdae39f13fe875", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/lib/cloudflare/stream.ts:27"}, "properties": {"repobilityId": "c31e59467f93a6ff", "scanner": "scanner-primary", "fingerprint": "eccdae39f13fe875", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cda1499c076fe5b4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/lib/calendar/zoom.ts:56"}, "properties": {"repobilityId": "9660e37738f1e18d", "scanner": "scanner-primary", "fingerprint": "cda1499c076fe5b4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cb6a727934e00e70", "level": "none", "message": {"text": "Commented-code block (21 lines) in webapp/lib/calendar/encryption.ts:20"}, "properties": {"repobilityId": "9c5430bda5324e97", "scanner": "scanner-primary", "fingerprint": "cb6a727934e00e70", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2bba76ea9cadba3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/lib/calendar/microsoft.ts:62"}, "properties": {"repobilityId": "deaea534dc6a72bb", "scanner": "scanner-primary", "fingerprint": "f2bba76ea9cadba3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-82128c85fc0f8346", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/lib/calendar/revoke.ts:40"}, "properties": {"repobilityId": "7886a0308657d264", "scanner": "scanner-primary", "fingerprint": "82128c85fc0f8346", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e06523d7fb0a294f", "level": "none", "message": {"text": "Commented-code block (7 lines) in webapp/lib/calendar/google.ts:8"}, "properties": {"repobilityId": "ccf6c52bf434bb36", "scanner": "scanner-primary", "fingerprint": "e06523d7fb0a294f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aac3890a13a3a8ca", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 webapp/lib/calendar/google.ts:83"}, "properties": {"repobilityId": "634bf7f0f10eb45e", "scanner": "scanner-primary", "fingerprint": "aac3890a13a3a8ca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5bb95e098b4d0af9", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/lib/validation/professional-bodies.ts:3"}, "properties": {"repobilityId": "fa5c5a0faf286e4d", "scanner": "scanner-primary", "fingerprint": "5bb95e098b4d0af9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-69658632fc647e99", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/lib/validation/products.ts:138"}, "properties": {"repobilityId": "9a47affbc2f20e3c", "scanner": "scanner-primary", "fingerprint": "69658632fc647e99", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-80493c022ddb0811", "level": "none", "message": {"text": "Commented-code block (6 lines) in webapp/lib/validation/search-filters.ts:3"}, "properties": {"repobilityId": "3751522dec0519f0", "scanner": "scanner-primary", "fingerprint": "80493c022ddb0811", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-639dee0898a6c977", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/lib/validation/client-portal.ts:13"}, "properties": {"repobilityId": "0139f5152969a14f", "scanner": "scanner-primary", "fingerprint": "639dee0898a6c977", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7df07714b3d20c7c", "level": "none", "message": {"text": "Commented-code block (6 lines) in webapp/lib/validation/therapist-profile.ts:7"}, "properties": {"repobilityId": "6179961596aac412", "scanner": "scanner-primary", "fingerprint": "7df07714b3d20c7c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2289c8a87f05c979", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/lib/validation/clients.ts:4"}, "properties": {"repobilityId": "c94db29418044dc3", "scanner": "scanner-primary", "fingerprint": "2289c8a87f05c979", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3fd411bf28fd8634", "level": "none", "message": {"text": "Commented-code block (7 lines) in webapp/lib/validation/registration-screening.ts:54"}, "properties": {"repobilityId": "aaf3f21b808738cb", "scanner": "scanner-primary", "fingerprint": "3fd411bf28fd8634", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9729e0b8f1779322", "level": "none", "message": {"text": "Commented-code block (6 lines) in webapp/lib/compliance/run-review.ts:245"}, "properties": {"repobilityId": "74b7e82e0b142c65", "scanner": "scanner-primary", "fingerprint": "9729e0b8f1779322", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2ae03b3491f8b125", "level": "none", "message": {"text": "Commented-code block (7 lines) in webapp/lib/compliance/review-engine.ts:259"}, "properties": {"repobilityId": "a9119d2aac7323f0", "scanner": "scanner-primary", "fingerprint": "2ae03b3491f8b125", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f07bb8bd461ab275", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/lib/compliance/client.ts:19"}, "properties": {"repobilityId": "95ea21c780fd35a6", "scanner": "scanner-primary", "fingerprint": "f07bb8bd461ab275", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-24ef2f270a0d98f4", "level": "none", "message": {"text": "Commented-code block (6 lines) in webapp/lib/compliance/content-snapshot.ts:155"}, "properties": {"repobilityId": "8a321cc2ce78121a", "scanner": "scanner-primary", "fingerprint": "24ef2f270a0d98f4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0bb1b13da4701466", "level": "none", "message": {"text": "Commented-code block (7 lines) in webapp/lib/compliance/eval/convergence.eval.ts:64"}, "properties": {"repobilityId": "c5199e686094b759", "scanner": "scanner-primary", "fingerprint": "0bb1b13da4701466", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d00a25b4d90d94c7", "level": "none", "message": {"text": "Commented-code block (5 lines) in webapp/lib/constants/homepage-meta.ts:1"}, "properties": {"repobilityId": "6613c075a3339ec7", "scanner": "scanner-primary", "fingerprint": "d00a25b4d90d94c7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9ec4dccc92a22d9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ubuntu/src/transcribe.ts:29"}, "properties": {"repobilityId": "7767dfbd91721920", "scanner": "scanner-primary", "fingerprint": "b9ec4dccc92a22d9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-568959bccbc00761", "level": "note", "message": {"text": "Legacy-named symbol `eleven_multilingual_v2` in docs/compliance/video/remotion/scripts/generate-audio.ts:13"}, "properties": {"repobilityId": "916d2f85c69121bd", "scanner": "scanner-primary", "fingerprint": "568959bccbc00761", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-512746646f64fc78", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 docs/compliance/video/remotion/scripts/generate-audio.ts:28"}, "properties": {"repobilityId": "5060e799b46f2783", "scanner": "scanner-primary", "fingerprint": "512746646f64fc78", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6adfe3d30ee9355f", "level": "note", "message": {"text": "40 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "a58f987b7fee95b4", "scanner": "scanner-primary", "fingerprint": "6adfe3d30ee9355f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-3679df466b25dbee", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/impersonate (webapp/components/admin/ImpersonateButton.tsx:17)"}, "properties": {"repobilityId": "640915e1089ef01b", "scanner": "scanner-primary", "fingerprint": "3679df466b25dbee", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-46ea56fd04a7cd31", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/stop-impersonating (webapp/components/admin/ImpersonationBanner.tsx:11)"}, "properties": {"repobilityId": "617cfbe223c735b0", "scanner": "scanner-primary", "fingerprint": "46ea56fd04a7cd31", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ab389372dca78d31", "level": "error", "message": {"text": "Dangling fetch: POST /api/management/compliance/run (webapp/components/management/compliance/ComplianceRunDialog.tsx:86)"}, "properties": {"repobilityId": "7b769abe648750e5", "scanner": "scanner-primary", "fingerprint": "ab389372dca78d31", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-91a85ba11c6cc9a6", "level": "error", "message": {"text": "Dangling fetch: POST /api/analytics/track (webapp/components/analytics/TrackEvent.tsx:18)"}, "properties": {"repobilityId": "e1d4db65bafb7ba2", "scanner": "scanner-primary", "fingerprint": "91a85ba11c6cc9a6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c60aa772a736b35e", "level": "error", "message": {"text": "Dangling fetch: POST /api/analytics/track-batch (webapp/components/analytics/TrackSearchImpressions.tsx:15)"}, "properties": {"repobilityId": "11918099730795ab", "scanner": "scanner-primary", "fingerprint": "c60aa772a736b35e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-29f4420f851c53ce", "level": "error", "message": {"text": "Dangling fetch: POST /api/dashboard/compliance/rerun (webapp/components/compliance/MemberCompliancePanel.tsx:79)"}, "properties": {"repobilityId": "a1b9032f0dd9d314", "scanner": "scanner-primary", "fingerprint": "29f4420f851c53ce", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cf8396db0991c551", "level": "error", "message": {"text": "Dangling fetch: GET /api/locations/autocomplete?q=${encodeURIComponent(term)} (webapp/components/ui/LocationAutocomplete.tsx:54)"}, "properties": {"repobilityId": "18d0a1e9bb14f1ba", "scanner": "scanner-primary", "fingerprint": "cf8396db0991c551", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-72341e5bff00b025", "level": "error", "message": {"text": "Dangling fetch: POST https://challenges.cloudflare.com/turnstile/v0/siteverify (webapp/lib/turnstile.ts:31)"}, "properties": {"repobilityId": "b04b2fe98457b6eb", "scanner": "scanner-primary", "fingerprint": "72341e5bff00b025", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f707f9ecd18b6eba", "level": "error", "message": {"text": "Dangling fetch: POST /api/analytics/track-video (webapp/lib/hooks/useVideoAnalytics.ts:32)"}, "properties": {"repobilityId": "45afef1abd16528f", "scanner": "scanner-primary", "fingerprint": "f707f9ecd18b6eba", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dadd95b152f50e88", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/revoke (webapp/lib/calendar/revoke.ts:40)"}, "properties": {"repobilityId": "f583b9f045bbf1d6", "scanner": "scanner-primary", "fingerprint": "dadd95b152f50e88", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dbc617a5775017b4", "level": "error", "message": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${VOICE}/with-timestamps (docs/compliance/video/remotion/scripts/generate-audio.ts:28)"}, "properties": {"repobilityId": "babca5cb4c8f2db4", "scanner": "scanner-primary", "fingerprint": "dbc617a5775017b4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6f2957b381c87292", "level": "note", "message": {"text": "Unused endpoint: POST /webhook/transcribe"}, "properties": {"repobilityId": "635ea328560cc151", "scanner": "scanner-primary", "fingerprint": "6f2957b381c87292", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9285f551fa6418c8", "level": "note", "message": {"text": "Unused endpoint: POST /retry/:videoId"}, "properties": {"repobilityId": "8ff397b72d0a40ac", "scanner": "scanner-primary", "fingerprint": "9285f551fa6418c8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}