{"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-b6279a373e3b0304", "name": "Stray `console.log` in TS/JS \u2014 web-app/test-auth.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/test-auth.js:9"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9dbd55d8d0a6ab67", "name": "Stray `console.log` in TS/JS \u2014 web-app/email-live-sync-worker.js:180", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/email-live-sync-worker.js:180"}, "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-489e2bd440a56a8e", "name": "Stray `console.log` in TS/JS \u2014 web-app/start.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/start.js:10"}, "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-83b78a25a269675e", "name": "Stray `console.log` in TS/JS \u2014 web-app/scripts/check-api.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/check-api.js:5"}, "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-d1bc66bba27941e9", "name": "Stray `console.log` in TS/JS \u2014 web-app/scripts/check-api-docs-coverage.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/check-api-docs-coverage.ts:32"}, "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-c93661d9a35b43d8", "name": "Stray `console.log` in TS/JS \u2014 web-app/scripts/add-pending-user.js:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/add-pending-user.js:41"}, "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-8df15a1ff7bc4bdd", "name": "Stray `console.log` in TS/JS \u2014 web-app/scripts/migrate-todoist.ts:4", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/migrate-todoist.ts:4"}, "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-5e7c7803eb93dff1", "name": "Stray `console.log` in TS/JS \u2014 web-app/scripts/add-member-to-org.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/add-member-to-org.js:22"}, "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-27e997b8c7cd5df5", "name": "Stray `console.log` in TS/JS \u2014 web-app/scripts/update-spencer-email.ts:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/update-spencer-email.ts:5"}, "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-572a6b39176d293b", "name": "Stray `console.log` in TS/JS \u2014 web-app/scripts/update-user-status.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/update-user-status.js:22"}, "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-7474a422887a1048", "name": "Stray `console.log` in TS/JS \u2014 web-app/scripts/test-dependencies.js:4", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/test-dependencies.js:4"}, "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-3a86dec0344ee4c6", "name": "Stray `console.log` in TS/JS \u2014 web-app/scripts/simple-dependency-test.js:4", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/simple-dependency-test.js:4"}, "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-a9c15090732d2812", "name": "Stray `console.log` in TS/JS \u2014 web-app/scripts/update-overdue-tasks.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/update-overdue-tasks.ts:40"}, "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-7b039b6f7ce5fcad", "name": "Stray `console.log` in TS/JS \u2014 web-app/scripts/test-dependencies-basic.js:4", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/test-dependencies-basic.js:4"}, "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-6d36e6c81bc26670", "name": "Stray `console.log` in TS/JS \u2014 web-app/scripts/fix-subtasks.ts:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/fix-subtasks.ts:5"}, "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-5d9dca3de8db8347", "name": "Stray `console.log` in TS/JS \u2014 web-app/scripts/test-basic-api.js:4", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/test-basic-api.js:4"}, "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-962150a559d5a764", "name": "Stray `console.log` in TS/JS \u2014 web-app/scripts/update-users.js:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/update-users.js:31"}, "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-3919cc5662a7f052", "name": "Stray `console.log` in TS/JS \u2014 web-app/scripts/test-subtask-completion.js:4", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/test-subtask-completion.js:4"}, "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-169e66e27d466d0f", "name": "Stray `console.log` in TS/JS \u2014 web-app/scripts/test-database.ts:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/test-database.ts:5"}, "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-e255d3115d541770", "name": "Stray `console.log` in TS/JS \u2014 web-app/scripts/start.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/start.js:8"}, "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-631998b210288832", "name": "Stray `console.log` in TS/JS \u2014 web-app/scripts/ai-memory-evaluate.ts:155", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/ai-memory-evaluate.ts:155"}, "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-3f818d4f374dee98", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-thread-attachments.tsx:128", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-thread-attachments.tsx:128"}, "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-f1334b6903e5d399", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-thread-modal.tsx:1205", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-thread-modal.tsx:1205"}, "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-c57ed64afe5e24a4", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-drafts-view.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-drafts-view.tsx:109"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b3e0e590ffdb7ff7", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/bulk-edit-modal.tsx:650", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/bulk-edit-modal.tsx:650"}, "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-3a5947c84bc50059", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/sender-history-modal.tsx:143", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/sender-history-modal.tsx:143"}, "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-7b4aaf51a237e090", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/sidebar.tsx:289", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/sidebar.tsx:289"}, "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-4ddfa22b0e9eab64", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-outbound-composer-modal.tsx:668", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-outbound-composer-modal.tsx:668"}, "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-1656d9cbc9178e39", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/ai-memory-tab.tsx:254", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/ai-memory-tab.tsx:254"}, "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-07c4184984640507", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/task-modal.tsx:956", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/task-modal.tsx:956"}, "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-6b0b258d4bd0dcf4", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/edit-project-modal.tsx:699", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/edit-project-modal.tsx:699"}, "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-75299b725e39a76f", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/project-section-board.tsx:366", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/project-section-board.tsx:366"}, "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-21e4f5ec1bdce077", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-inbox-view.tsx:4736", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-inbox-view.tsx:4736"}, "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-79dc5d1df65dfe41", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-starred-view.tsx:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-starred-view.tsx:107"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1e934c091a040c7a", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/existing-member-picker.tsx:91", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/existing-member-picker.tsx:91"}, "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-f3ebf1462f121b30", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/todoist-sync-preview-modal.tsx:290", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/todoist-sync-preview-modal.tsx:290"}, "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-78898f1c57520420", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/focus-time-organization-panel.tsx:260", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/focus-time-organization-panel.tsx:260"}, "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-9b3b7577707fe823", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/history-timeline-scrubber.tsx:268", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/history-timeline-scrubber.tsx:268"}, "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-bbeb4b00ee0818b9", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/task-list.tsx:512", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/task-list.tsx:512"}, "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-60773c0f70e4ff05", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 web-app/components/task-list.tsx:470", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 web-app/components/task-list.tsx:470"}, "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-41d6a2cc1e940aa1", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/nav-tasks-modal.tsx:159", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/nav-tasks-modal.tsx:159"}, "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-e5dd61a95266af07", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/delete-project-modal.tsx:176", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/delete-project-modal.tsx:176"}, "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-ca1a6744b0a65e0b", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-work-list.tsx:1167", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-work-list.tsx:1167"}, "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-d739844c774229e4", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/kanban-view.tsx:315", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/kanban-view.tsx:315"}, "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-09dff7490aeafdde", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-spam-review-modal.tsx:514", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-spam-review-modal.tsx:514"}, "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-112484243445bdd3", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/todoist-quick-sync-modal.tsx:264", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/todoist-quick-sync-modal.tsx:264"}, "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-5ee1e0594d174d72", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/ai-decision-history-tab.tsx:143", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/ai-decision-history-tab.tsx:143"}, "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-0d8629471609e706", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-attachment-lightbox.tsx:219", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-attachment-lightbox.tsx:219"}, "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-41dc915a5eae326c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 web-app/components/ui/rich-text-content.tsx:19", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 web-app/components/ui/rich-text-content.tsx:19"}, "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-62831e5386aaa1f5", "name": "Stray `console.log` in TS/JS \u2014 web-app/contexts/AuthContext.tsx:69", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/contexts/AuthContext.tsx:69"}, "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-f228b5c8a66b06d3", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/app/settings/page.tsx:1089", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/app/settings/page.tsx:1089"}, "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-27692b4d49af677d", "name": "Stray `console.log` in TS/JS \u2014 web-app/app/api/sync/database/route.ts:107", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/app/api/sync/database/route.ts:107"}, "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-2f6cdd8931dacca0", "name": "Stray `console.log` in TS/JS \u2014 web-app/app/api/auth/login/route.ts:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/app/api/auth/login/route.ts:8"}, "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-edd5f595bdbee817", "name": "Stray `console.log` in TS/JS \u2014 web-app/app/api/mobile/auth/apple/route.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/app/api/mobile/auth/apple/route.ts:32"}, "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-4d01818930054fc4", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/app/trash/page.tsx:284", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/app/trash/page.tsx:284"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-934e01359e55ab28", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/app/desktop/page.tsx:189", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/app/desktop/page.tsx:189"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-59b81b12c1139155", "name": "`truncate` class without `title=` for hover reveal \u2014 web-app/app/[view]/view-client.tsx:344", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/app/[view]/view-client.tsx:344"}, "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-a4a9b45619b815ac", "name": "TODO/FIXME marker in shipping code \u2014 web-app/app/[view]/view-client.tsx:2499", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 web-app/app/[view]/view-client.tsx:2499"}, "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-0997b6aa50bc8f99", "name": "Stray `console.log` in TS/JS \u2014 web-app/lib/todoist-migration.ts:113", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/lib/todoist-migration.ts:113"}, "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-9ff93b3d77000aab", "name": "Stray `console.log` in TS/JS \u2014 web-app/lib/init-sync.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/lib/init-sync.ts:16"}, "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-6988615433e3d311", "name": "Stray `console.log` in TS/JS \u2014 web-app/lib/feature-flags.tsx:157", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/lib/feature-flags.tsx:157"}, "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-318db227eb29b155", "name": "Stray `console.log` in TS/JS \u2014 web-app/lib/supabase/server.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/lib/supabase/server.ts:16"}, "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-06eab37bbbc1ddc2", "name": "Stray `console.log` in TS/JS \u2014 web-app/lib/services/sync-scheduler.ts:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/lib/services/sync-scheduler.ts:42"}, "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-0c2e81e48882bb8d", "name": "Stray `console.log` in TS/JS \u2014 web-app/lib/db/supabase-adapter.ts:99", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 web-app/lib/db/supabase-adapter.ts:99"}, "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-564b45d270cf0238", "name": "Runtime dotenv file present in repo: .env.production", "shortDescription": {"text": "Runtime dotenv file present in repo: .env.production"}, "fullDescription": {"text": "`.env.production` looks like a runtime dotenv file. No high-confidence secret value was matched, but runtime dotenv files often drift into live credentials. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-110f16f3187b7b57", "name": "Runtime dotenv file present in repo: .env.mobile", "shortDescription": {"text": "Runtime dotenv file present in repo: .env.mobile"}, "fullDescription": {"text": "`.env.mobile` looks like a runtime dotenv file. No high-confidence secret value was matched, but runtime dotenv files often drift into live credentials. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bf8ab4a6288256d3", "name": "Possible secret in web-app/test-auth.js", "shortDescription": {"text": "Possible secret in web-app/test-auth.js"}, "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-b92c02757d5157e8", "name": "Insecure pattern 'cors_wildcard' in web-app/docs/todoist-sync-api.html:1780", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in web-app/docs/todoist-sync-api.html:1780"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-17ebc5ada091a470", "name": "Possible secret in web-app/scripts/create-api-user.mjs", "shortDescription": {"text": "Possible secret in web-app/scripts/create-api-user.mjs"}, "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-65921674c6e94475", "name": "Possible secret in web-app/scripts/test-auth-refresh.mjs", "shortDescription": {"text": "Possible secret in web-app/scripts/test-auth-refresh.mjs"}, "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-6dc7418aa40d37ac", "name": "Insecure pattern 'node_child_process' in web-app/scripts/start.js:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in web-app/scripts/start.js:3"}, "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-4538f49478849a0a", "name": "Possible secret in web-app/scripts/set-user-password.mjs", "shortDescription": {"text": "Possible secret in web-app/scripts/set-user-password.mjs"}, "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-0834c986199743f7", "name": "Insecure pattern 'dangerous_innerhtml' in web-app/components/task-list.tsx:470", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in web-app/components/task-list.tsx:470"}, "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-08295b4ab6e10cf7", "name": "Insecure pattern 'dangerous_innerhtml' in web-app/components/ui/rich-text-content.tsx:19", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in web-app/components/ui/rich-text-content.tsx:19"}, "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-2fb5134538d6b652", "name": "Insecure pattern 'private_key_in_repo' in web-app/lib/__tests__/push-notifications.test.ts:20", "shortDescription": {"text": "Insecure pattern 'private_key_in_repo' in web-app/lib/__tests__/push-notifications.test.ts:20"}, "fullDescription": {"text": "Found a known-risky pattern (private_key_in_repo). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-209e4d7fe2258068", "name": "Insecure pattern 'private_key_in_repo' in web-app/lib/push/apns.ts:54", "shortDescription": {"text": "Insecure pattern 'private_key_in_repo' in web-app/lib/push/apns.ts:54"}, "fullDescription": {"text": "Found a known-risky pattern (private_key_in_repo). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-16c44154b22fa654", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1c082a0b7a253b37", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-782c386e203cebb9", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-042fe96b125b4ecb", "name": "Very large file: web-app/components/email-thread-modal.tsx (2141 lines)", "shortDescription": {"text": "Very large file: web-app/components/email-thread-modal.tsx (2141 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-f7e19df64825bfa0", "name": "Very large file: web-app/components/sidebar.tsx (3226 lines)", "shortDescription": {"text": "Very large file: web-app/components/sidebar.tsx (3226 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-541345129b7b9037", "name": "Very large file: web-app/components/organization-settings-modal.tsx (1244 lines)", "shortDescription": {"text": "Very large file: web-app/components/organization-settings-modal.tsx (1244 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-3af63bbaa9fe3904", "name": "Very large file: web-app/components/task-modal.tsx (3376 lines)", "shortDescription": {"text": "Very large file: web-app/components/task-modal.tsx (3376 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-3d2ba35535a3a929", "name": "Very large file: web-app/components/email-inbox-view.tsx (6122 lines)", "shortDescription": {"text": "Very large file: web-app/components/email-inbox-view.tsx (6122 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-34f5f78772574263", "name": "Very large file: web-app/components/task-list.tsx (1292 lines)", "shortDescription": {"text": "Very large file: web-app/components/task-list.tsx (1292 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-16602e98c5a90c49", "name": "Very large file: web-app/components/email-work-list.tsx (1653 lines)", "shortDescription": {"text": "Very large file: web-app/components/email-work-list.tsx (1653 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-5d18de6f3135f234", "name": "Very large file: web-app/app/settings/page.tsx (2391 lines)", "shortDescription": {"text": "Very large file: web-app/app/settings/page.tsx (2391 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-83a140177701278f", "name": "Very large file: web-app/app/[view]/view-client.tsx (6408 lines)", "shortDescription": {"text": "Very large file: web-app/app/[view]/view-client.tsx (6408 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-1b5d1a618e1ef0c7", "name": "Very large file: web-app/lib/supabase/database.types.ts (1644 lines)", "shortDescription": {"text": "Very large file: web-app/lib/supabase/database.types.ts (1644 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-06d62568ab9d1eaf", "name": "Very large file: web-app/lib/email-inbox/server.ts (5317 lines)", "shortDescription": {"text": "Very large file: web-app/lib/email-inbox/server.ts (5317 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-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "84 tests / 444 src (ratio 0.19)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 655 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 199 placeholder/mock markers across 44 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-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-39bb163e6dc84dd2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/src/routes/proxy.ts:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/src/routes/proxy.ts:45"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-de37d7412366ac92", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/test-auth.js:51", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/test-auth.js:51"}, "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-c831c76351e8bc59", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-api-with-auth.mjs:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-api-with-auth.mjs:33"}, "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-2c79c74c63ce032e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-api.mjs:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-api.mjs:38"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e6fda54b372aca32", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-api-direct.mjs:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-api-direct.mjs:9"}, "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-3feda9264f2d9391", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/verify-complete-flow.mjs:105", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/verify-complete-flow.mjs:105"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-738a140a6978b1aa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-full-flow.mjs:6", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-full-flow.mjs:6"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3ca5065ef7a425d7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/check-api.js:12", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/check-api.js:12"}, "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-62f35dc64631302b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-login-api.mjs:4", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-login-api.mjs:4"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1c83016d06c2cc69", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-api-authenticated.mjs:41", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-api-authenticated.mjs:41"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c16ab463721de11a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-dependencies.js:10", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-dependencies.js:10"}, "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-b63f35d96db83758", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/simple-dependency-test.js:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/simple-dependency-test.js:21"}, "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-33019f04a3982871", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-dependencies-basic.js:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-dependencies-basic.js:24"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fb14bd899515ac92", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-basic-api.js:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-basic-api.js:36"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e257ad0545561621", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-auth-refresh.mjs:65", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-auth-refresh.mjs:65"}, "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-761c4c8344b04509", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-subtask-completion.js:8", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-subtask-completion.js:8"}, "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-57520d4f027c4dcb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/debug-adapter.mjs:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/debug-adapter.mjs:63"}, "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-08eeaaac26b4ec14", "name": "Commented-code block (5 lines) in web-app/components/email-thread-modal.tsx:436", "shortDescription": {"text": "Commented-code block (5 lines) in web-app/components/email-thread-modal.tsx:436"}, "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-6ed5a571c3520751", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/email-thread-modal.tsx:192", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/email-thread-modal.tsx:192"}, "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-1af68bc26d595a6c", "name": "Commented-code block (5 lines) in web-app/components/ai-planner-floating-chat.tsx:225", "shortDescription": {"text": "Commented-code block (5 lines) in web-app/components/ai-planner-floating-chat.tsx: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-086e05729991930f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/ai-planner-floating-chat.tsx:158", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/ai-planner-floating-chat.tsx:158"}, "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-2800635b95e813e7", "name": "Commented-code block (5 lines) in web-app/components/sidebar.tsx:146", "shortDescription": {"text": "Commented-code block (5 lines) in web-app/components/sidebar.tsx:146"}, "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-a1b66066a47f2a96", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/sidebar.tsx:818", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/sidebar.tsx:818"}, "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-1838733613d84c58", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/email-outbound-composer-modal.tsx:281", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/email-outbound-composer-modal.tsx:281"}, "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-f0f3f4a450d9312d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/ai-memory-tab.tsx:129", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/ai-memory-tab.tsx:129"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-14f1e4ecdf80f518", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/project-notes-modal.tsx:79", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/project-notes-modal.tsx:79"}, "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-4e48c8dd18cd4352", "name": "Commented-code block (6 lines) in web-app/components/estimate-review-modal.tsx:301", "shortDescription": {"text": "Commented-code block (6 lines) in web-app/components/estimate-review-modal.tsx:301"}, "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-52eeffcbf9083c53", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/estimate-review-modal.tsx:173", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/estimate-review-modal.tsx:173"}, "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-af9d1a21b15536d9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/task-modal.tsx:613", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/task-modal.tsx:613"}, "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-2a2178cc41ccdb9c", "name": "Commented-code block (6 lines) in web-app/components/email-inbox-view.tsx:1680", "shortDescription": {"text": "Commented-code block (6 lines) in web-app/components/email-inbox-view.tsx:1680"}, "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-4ae88ee4f79f24f3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/email-inbox-view.tsx:2119", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/email-inbox-view.tsx:2119"}, "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-c5a0b3bbf0ae5caa", "name": "Commented-code block (5 lines) in web-app/components/dock-badge-sync.tsx:72", "shortDescription": {"text": "Commented-code block (5 lines) in web-app/components/dock-badge-sync.tsx: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-329aa4bfd7b665cf", "name": "Commented-code block (6 lines) in web-app/components/user-avatar.tsx:107", "shortDescription": {"text": "Commented-code block (6 lines) in web-app/components/user-avatar.tsx:107"}, "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-050feb0bc885c664", "name": "Commented-code block (6 lines) in web-app/components/skeleton-loader.tsx:8", "shortDescription": {"text": "Commented-code block (6 lines) in web-app/components/skeleton-loader.tsx: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-35c66ea697e3191f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/focus-time-organization-panel.tsx:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/focus-time-organization-panel.tsx:37"}, "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-35184ed7bfb7529f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/time-tracking-view.tsx:169", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/time-tracking-view.tsx:169"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d451f96d9a25a77f", "name": "Commented-code block (5 lines) in web-app/components/email-work-list.tsx:543", "shortDescription": {"text": "Commented-code block (5 lines) in web-app/components/email-work-list.tsx:543"}, "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-27c2f2e9f802fa20", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/todoist-integration.tsx:289", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/todoist-integration.tsx:289"}, "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-8d93d6e5c4bae316", "name": "Commented-code block (5 lines) in web-app/components/tooltip.tsx:177", "shortDescription": {"text": "Commented-code block (5 lines) in web-app/components/tooltip.tsx:177"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-397f7ad4a90e5cc0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/estimates-view.tsx:86", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/estimates-view.tsx:86"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e3306c86eda4ce74", "name": "Commented-code block (5 lines) in web-app/components/ui/dialog.tsx:41", "shortDescription": {"text": "Commented-code block (5 lines) in web-app/components/ui/dialog.tsx:41"}, "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-470420219e7efdcb", "name": "Commented-code block (5 lines) in web-app/app/manifest.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in web-app/app/manifest.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-881cda82b79de3ea", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/app/settings/page.tsx:2202", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/app/settings/page.tsx:2202"}, "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-a82bfeb18346b2f9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/app/auth/accept-invite/page.tsx:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/app/auth/accept-invite/page.tsx:78"}, "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-418829e8c907e924", "name": "Legacy-named symbol `todoist_import_backup` in web-app/app/api/todoist/connect/route.ts:141", "shortDescription": {"text": "Legacy-named symbol `todoist_import_backup` in web-app/app/api/todoist/connect/route.ts:141"}, "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-677ecd12ce39060d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/app/api/time-blocks/chat/route.ts:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/app/api/time-blocks/chat/route.ts:26"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5453f25d7a183fc5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/app/api/tasks/unestimated/route.ts:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/app/api/tasks/unestimated/route.ts:44"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-07fa31be522b556a", "name": "Commented-code block (6 lines) in web-app/app/api/mobile/email/spam-exceptions/route.ts:9", "shortDescription": {"text": "Commented-code block (6 lines) in web-app/app/api/mobile/email/spam-exceptions/route.ts:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6a0fa5c8f7dba99e", "name": "Commented-code block (6 lines) in web-app/app/api/mobile/email/spam-exceptions/[ruleId]/revert/route.ts:9", "shortDescription": {"text": "Commented-code block (6 lines) in web-app/app/api/mobile/email/spam-exceptions/[ruleId]/revert/route.ts:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-243058e151a4c9ad", "name": "Commented-code block (7 lines) in web-app/app/api/mobile/email/sync/route.ts:12", "shortDescription": {"text": "Commented-code block (7 lines) in web-app/app/api/mobile/email/sync/route.ts:12"}, "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-5fd198c73261737a", "name": "Commented-code block (7 lines) in web-app/app/api/mobile/email/threads/[id]/actions/route.ts:28", "shortDescription": {"text": "Commented-code block (7 lines) in web-app/app/api/mobile/email/threads/[id]/actions/route.ts:28"}, "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-9eee61e746244d25", "name": "Commented-code block (5 lines) in web-app/app/api/mobile/email/rules/assistant/route.ts:10", "shortDescription": {"text": "Commented-code block (5 lines) in web-app/app/api/mobile/email/rules/assistant/route.ts:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dbb7a414bf25f8fa", "name": "Commented-code block (5 lines) in web-app/app/api/mobile/email/trash/empty/route.ts:9", "shortDescription": {"text": "Commented-code block (5 lines) in web-app/app/api/mobile/email/trash/empty/route.ts:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-14fe5c8622fcc971", "name": "Commented-code block (9 lines) in web-app/app/api/mobile/email/mailboxes/route.ts:35", "shortDescription": {"text": "Commented-code block (9 lines) in web-app/app/api/mobile/email/mailboxes/route.ts:35"}, "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-a5ad6e53406dc5db", "name": "Commented-code block (6 lines) in web-app/app/api/mobile/email/mailboxes/[id]/route.ts:9", "shortDescription": {"text": "Commented-code block (6 lines) in web-app/app/api/mobile/email/mailboxes/[id]/route.ts:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5ecb2e92256579ca", "name": "Commented-code block (5 lines) in web-app/app/[view]/view-client.tsx:106", "shortDescription": {"text": "Commented-code block (5 lines) in web-app/app/[view]/view-client.tsx:106"}, "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-53895ca7455d3923", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/app/[view]/view-client.tsx:942", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/app/[view]/view-client.tsx:942"}, "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-b7b5a9e83e20b163", "name": "Commented-code block (5 lines) in web-app/lib/email-thread-ui.ts:76", "shortDescription": {"text": "Commented-code block (5 lines) in web-app/lib/email-thread-ui.ts: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-74bce9ba3c9a5cc7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-agent/providers.ts:90", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-agent/providers.ts:90"}, "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-8fba14400364ac57", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-memory/write.ts:155", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-memory/write.ts:155"}, "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-2738fb8312c9aa36", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-memory/playbook.ts:133", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-memory/playbook.ts:133"}, "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-fd034b50b49e3223", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/api/client.ts:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/api/client.ts:22"}, "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-ee91db81bc653055", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-planner/auto-section.ts:193", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-planner/auto-section.ts:193"}, "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-50fe0924da9be631", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-planner/server.ts:210", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-planner/server.ts:210"}, "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-b75caea3ab4f111d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/daily-plan/server.ts:162", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/daily-plan/server.ts:162"}, "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-3420c62a9f286292", "name": "Legacy-named symbol `todoist_import_backup` in web-app/lib/supabase/database.types.ts:1007", "shortDescription": {"text": "Legacy-named symbol `todoist_import_backup` in web-app/lib/supabase/database.types.ts:1007"}, "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-1fc57da40f45f093", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/services/todoist-client.ts:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/services/todoist-client.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-ef8dd5a46f8cfdc9", "name": "Legacy-named symbol `todoist_import_backup` in web-app/lib/services/todoist-sync.ts:724", "shortDescription": {"text": "Legacy-named symbol `todoist_import_backup` in web-app/lib/services/todoist-sync.ts:724"}, "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-26e4d09db945e893", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-core/embeddings.ts:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-core/embeddings.ts:9"}, "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-08ee2e6f55d41001", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-estimator/server.ts:135", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-estimator/server.ts:135"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f8c088b73d6c7042", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/email-inbox/ai.ts:883", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/email-inbox/ai.ts:883"}, "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-bc4b202bc5f113fd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/email-inbox/provider.ts:294", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/email-inbox/provider.ts:294"}, "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-38edf9da83c55200", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/email-inbox/rule-assistant.ts:285", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/email-inbox/rule-assistant.ts:285"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-792ef02a8147f89b", "name": "Commented-code block (8 lines) in web-app/lib/email-inbox/server.ts:1904", "shortDescription": {"text": "Commented-code block (8 lines) in web-app/lib/email-inbox/server.ts:1904"}, "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-264346b0c0abff0d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/email-inbox/spam-exception.ts:228", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/email-inbox/spam-exception.ts:228"}, "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-2d6ffa20a9f1093b", "name": "24 env vars used in code but missing from .env.example", "shortDescription": {"text": "24 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANTHROPIC_API_KEY`, `APPLE_PUSH_KEY_ID`, `APPLE_PUSH_PRIVATE_KEY`, `APPLE_PUSH_TEAM_ID`, `EMAIL_INBOX_LIVE_SYNC_SECRET`, `EMAIL_INBOX_SECRET_KEY`, `GIT_COMMIT_SHA`, `GROQ_API_KEY` + 16 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-016151b08ec8eaaf", "name": "Dangling fetch: GET http://127.0.0.1:3244/api/database (web-app/scripts/test-api-endpoint.mjs:9)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:3244/api/database (web-app/scripts/test-api-endpoint.mjs:9)"}, "fullDescription": {"text": "`web-app/scripts/test-api-endpoint.mjs:9` calls `GET http://127.0.0.1:3244/api/database` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:3244/api/database`\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-759e180193c1c3d9", "name": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-api-with-auth.mjs:33)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-api-with-auth.mjs:33)"}, "fullDescription": {"text": "`web-app/scripts/test-api-with-auth.mjs:33` calls `GET http://localhost:3244/api/database` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/database`\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-92cc154fc3300f66", "name": "Dangling fetch: POST http://127.0.0.1:3244/api/auth/login (web-app/scripts/test-api-direct.mjs:9)", "shortDescription": {"text": "Dangling fetch: POST http://127.0.0.1:3244/api/auth/login (web-app/scripts/test-api-direct.mjs:9)"}, "fullDescription": {"text": "`web-app/scripts/test-api-direct.mjs:9` calls `POST http://127.0.0.1:3244/api/auth/login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:3244/api/auth/login`\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-eba1a436bf096025", "name": "Dangling fetch: GET http://127.0.0.1:3244/api/database (web-app/scripts/test-api-direct.mjs:33)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:3244/api/database (web-app/scripts/test-api-direct.mjs:33)"}, "fullDescription": {"text": "`web-app/scripts/test-api-direct.mjs:33` calls `GET http://127.0.0.1:3244/api/database` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:3244/api/database`\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-a8271175ac39e849", "name": "Dangling fetch: POST http://localhost:3244/api/auth/login (web-app/scripts/verify-complete-flow.mjs:105)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3244/api/auth/login (web-app/scripts/verify-complete-flow.mjs:105)"}, "fullDescription": {"text": "`web-app/scripts/verify-complete-flow.mjs:105` calls `POST http://localhost:3244/api/auth/login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/auth/login`\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-f8e6e7050236ef49", "name": "Dangling fetch: POST http://localhost:3244/api/auth/login (web-app/scripts/test-full-flow.mjs:6)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3244/api/auth/login (web-app/scripts/test-full-flow.mjs:6)"}, "fullDescription": {"text": "`web-app/scripts/test-full-flow.mjs:6` calls `POST http://localhost:3244/api/auth/login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/auth/login`\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-0e7c5f5a2636b49f", "name": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-full-flow.mjs:33)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-full-flow.mjs:33)"}, "fullDescription": {"text": "`web-app/scripts/test-full-flow.mjs:33` calls `GET http://localhost:3244/api/database` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/database`\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-bdda2cca7d55d77a", "name": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/check-api.js:8)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/check-api.js:8)"}, "fullDescription": {"text": "`web-app/scripts/check-api.js:8` calls `GET http://localhost:3244/api/database` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/database`\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-f6cd6b3662b65a79", "name": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/check-api.js:12)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/check-api.js:12)"}, "fullDescription": {"text": "`web-app/scripts/check-api.js:12` calls `POST http://localhost:3244/api/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks`\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-a87ffe9167e44a9c", "name": "Dangling fetch: GET http://localhost:3244/api/tasks/${task.id} (web-app/scripts/check-api.js:28)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3244/api/tasks/${task.id} (web-app/scripts/check-api.js:28)"}, "fullDescription": {"text": "`web-app/scripts/check-api.js:28` calls `GET http://localhost:3244/api/tasks/${task.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-b74ba2d7610d6025", "name": "Dangling fetch: PUT http://localhost:3244/api/tasks/${task.id} (web-app/scripts/check-api.js:32)", "shortDescription": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${task.id} (web-app/scripts/check-api.js:32)"}, "fullDescription": {"text": "`web-app/scripts/check-api.js:32` calls `PUT http://localhost:3244/api/tasks/${task.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-999e2d6afecf23c0", "name": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${task.id} (web-app/scripts/check-api.js:45)", "shortDescription": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${task.id} (web-app/scripts/check-api.js:45)"}, "fullDescription": {"text": "`web-app/scripts/check-api.js:45` calls `DELETE http://localhost:3244/api/tasks/${task.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-51d785e4cbef96e2", "name": "Dangling fetch: POST http://localhost:3244/api/auth/login (web-app/scripts/test-login-api.mjs:4)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3244/api/auth/login (web-app/scripts/test-login-api.mjs:4)"}, "fullDescription": {"text": "`web-app/scripts/test-login-api.mjs:4` calls `POST http://localhost:3244/api/auth/login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/auth/login`\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-fb5507ed5730608d", "name": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-api-authenticated.mjs:41)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-api-authenticated.mjs:41)"}, "fullDescription": {"text": "`web-app/scripts/test-api-authenticated.mjs:41` calls `GET http://localhost:3244/api/database` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/database`\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-f45764acb72ec947", "name": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-dependencies.js:10)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-dependencies.js:10)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies.js:10` calls `POST http://localhost:3244/api/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks`\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-6c9f316fd17fd608", "name": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-dependencies.js:26)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-dependencies.js:26)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies.js:26` calls `POST http://localhost:3244/api/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks`\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-4297037dd049f8e0", "name": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-dependencies.js:43)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-dependencies.js:43)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies.js:43` calls `POST http://localhost:3244/api/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks`\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-ecd912aae9d14a0b", "name": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-dependencies.js:63)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-dependencies.js:63)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies.js:63` calls `GET http://localhost:3244/api/database` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/database`\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-30ac234fffaa42a9", "name": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies.js:81)", "shortDescription": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies.js:81)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies.js:81` calls `PUT http://localhost:3244/api/tasks/${taskB.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-4f3589ebd7ed7303", "name": "Dangling fetch: GET http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies.js:94)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies.js:94)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies.js:94` calls `GET http://localhost:3244/api/tasks/${taskB.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-a94166c8bc2c3ea9", "name": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskA.id} (web-app/scripts/test-dependencies.js:104)", "shortDescription": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskA.id} (web-app/scripts/test-dependencies.js:104)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies.js:104` calls `PUT http://localhost:3244/api/tasks/${taskA.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-29960b5b7a0a1ffa", "name": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies.js:112)", "shortDescription": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies.js:112)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies.js:112` calls `PUT http://localhost:3244/api/tasks/${taskB.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-b7430b0abbdb3a1f", "name": "Dangling fetch: GET http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies.js:119)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies.js:119)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies.js:119` calls `GET http://localhost:3244/api/tasks/${taskB.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-bd9476edfd43eced", "name": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-dependencies.js:129)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-dependencies.js:129)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies.js:129` calls `POST http://localhost:3244/api/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks`\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-ba54ac6007127859", "name": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-dependencies.js:145)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-dependencies.js:145)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies.js:145` calls `GET http://localhost:3244/api/database` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/database`\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-e8b04ccd7db1af3e", "name": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskA.id} (web-app/scripts/test-dependencies.js:155)", "shortDescription": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskA.id} (web-app/scripts/test-dependencies.js:155)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies.js:155` calls `DELETE http://localhost:3244/api/tasks/${taskA.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-5711b1e09f8d0bb6", "name": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies.js:156)", "shortDescription": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies.js:156)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies.js:156` calls `DELETE http://localhost:3244/api/tasks/${taskB.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-095062d2b0e5cbc3", "name": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskC.id} (web-app/scripts/test-dependencies.js:157)", "shortDescription": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskC.id} (web-app/scripts/test-dependencies.js:157)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies.js:157` calls `DELETE http://localhost:3244/api/tasks/${taskC.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-8da967ff5f909794", "name": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskD.id} (web-app/scripts/test-dependencies.js:158)", "shortDescription": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskD.id} (web-app/scripts/test-dependencies.js:158)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies.js:158` calls `DELETE http://localhost:3244/api/tasks/${taskD.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-3c5a098f0c9ac2c3", "name": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/simple-dependency-test.js:9)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/simple-dependency-test.js:9)"}, "fullDescription": {"text": "`web-app/scripts/simple-dependency-test.js:9` calls `GET http://localhost:3244/api/database` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/database`\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-97ac56413c1b2ca2", "name": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/simple-dependency-test.js:21)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/simple-dependency-test.js:21)"}, "fullDescription": {"text": "`web-app/scripts/simple-dependency-test.js:21` calls `POST http://localhost:3244/api/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks`\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-250109c1e7545ec8", "name": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/simple-dependency-test.js:35)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/simple-dependency-test.js:35)"}, "fullDescription": {"text": "`web-app/scripts/simple-dependency-test.js:35` calls `POST http://localhost:3244/api/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks`\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-fd133244ee60fc71", "name": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/simple-dependency-test.js:52)", "shortDescription": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/simple-dependency-test.js:52)"}, "fullDescription": {"text": "`web-app/scripts/simple-dependency-test.js:52` calls `PUT http://localhost:3244/api/tasks/${taskB.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-41e750ba48294093", "name": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskA.id} (web-app/scripts/simple-dependency-test.js:68)", "shortDescription": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskA.id} (web-app/scripts/simple-dependency-test.js:68)"}, "fullDescription": {"text": "`web-app/scripts/simple-dependency-test.js:68` calls `PUT http://localhost:3244/api/tasks/${taskA.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-26fa3f145d4b34b2", "name": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/simple-dependency-test.js:77)", "shortDescription": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/simple-dependency-test.js:77)"}, "fullDescription": {"text": "`web-app/scripts/simple-dependency-test.js:77` calls `PUT http://localhost:3244/api/tasks/${taskB.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-d46fbd45b64883cb", "name": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskA.id} (web-app/scripts/simple-dependency-test.js:93)", "shortDescription": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskA.id} (web-app/scripts/simple-dependency-test.js:93)"}, "fullDescription": {"text": "`web-app/scripts/simple-dependency-test.js:93` calls `DELETE http://localhost:3244/api/tasks/${taskA.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-edb9d27d7c58394b", "name": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/simple-dependency-test.js:94)", "shortDescription": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/simple-dependency-test.js:94)"}, "fullDescription": {"text": "`web-app/scripts/simple-dependency-test.js:94` calls `DELETE http://localhost:3244/api/tasks/${taskB.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-155f5904fe34e8e7", "name": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-dependencies-basic.js:11)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-dependencies-basic.js:11)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies-basic.js:11` calls `POST http://localhost:3244/api/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks`\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-db2eab5217390e12", "name": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-dependencies-basic.js:24)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-dependencies-basic.js:24)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies-basic.js:24` calls `POST http://localhost:3244/api/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks`\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-870753ded90425c3", "name": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-dependencies-basic.js:39)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-dependencies-basic.js:39)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies-basic.js:39` calls `GET http://localhost:3244/api/database` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/database`\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-7e486dd5c4483fcd", "name": "Dangling fetch: GET http://localhost:3244/today (web-app/scripts/test-dependencies-basic.js:50)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3244/today (web-app/scripts/test-dependencies-basic.js:50)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies-basic.js:50` calls `GET http://localhost:3244/today` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/today`\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-c5f233ac10621bfb", "name": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskA.id} (web-app/scripts/test-dependencies-basic.js:57)", "shortDescription": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskA.id} (web-app/scripts/test-dependencies-basic.js:57)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies-basic.js:57` calls `PUT http://localhost:3244/api/tasks/${taskA.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-e69d7b0f7da9630f", "name": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies-basic.js:69)", "shortDescription": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies-basic.js:69)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies-basic.js:69` calls `PUT http://localhost:3244/api/tasks/${taskB.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-0faba7c4daef24fa", "name": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-dependencies-basic.js:85)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-dependencies-basic.js:85)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies-basic.js:85` calls `GET http://localhost:3244/api/database` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/database`\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-d95c5bc702c223a7", "name": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskA.id} (web-app/scripts/test-dependencies-basic.js:96)", "shortDescription": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskA.id} (web-app/scripts/test-dependencies-basic.js:96)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies-basic.js:96` calls `DELETE http://localhost:3244/api/tasks/${taskA.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-cfd4fd798fc4cdf7", "name": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies-basic.js:97)", "shortDescription": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies-basic.js:97)"}, "fullDescription": {"text": "`web-app/scripts/test-dependencies-basic.js:97` calls `DELETE http://localhost:3244/api/tasks/${taskB.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-a52e68039c70628c", "name": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-basic-api.js:9)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-basic-api.js:9)"}, "fullDescription": {"text": "`web-app/scripts/test-basic-api.js:9` calls `POST http://localhost:3244/api/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks`\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-a11a53640720a24c", "name": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-basic-api.js:55)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-basic-api.js:55)"}, "fullDescription": {"text": "`web-app/scripts/test-basic-api.js:55` calls `GET http://localhost:3244/api/database` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/database`\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-848250fb577be3d7", "name": "Dangling fetch: GET http://localhost:3244/api/auth-debug (web-app/scripts/test-auth-refresh.mjs:65)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3244/api/auth-debug (web-app/scripts/test-auth-refresh.mjs:65)"}, "fullDescription": {"text": "`web-app/scripts/test-auth-refresh.mjs:65` calls `GET http://localhost:3244/api/auth-debug` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/auth-debug`\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-93ca0ad17c5e2aa0", "name": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-subtask-completion.js:8)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-subtask-completion.js:8)"}, "fullDescription": {"text": "`web-app/scripts/test-subtask-completion.js:8` calls `POST http://localhost:3244/api/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks`\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-02f940292d75e376", "name": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-subtask-completion.js:29)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-subtask-completion.js:29)"}, "fullDescription": {"text": "`web-app/scripts/test-subtask-completion.js:29` calls `POST http://localhost:3244/api/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks`\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-3df58f6cdaf5aeb7", "name": "Dangling fetch: PUT http://localhost:3244/api/tasks/${subtasks[0].id} (web-app/scripts/test-subtask-completion.js:49)", "shortDescription": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${subtasks[0].id} (web-app/scripts/test-subtask-completion.js:49)"}, "fullDescription": {"text": "`web-app/scripts/test-subtask-completion.js:49` calls `PUT http://localhost:3244/api/tasks/${subtasks[0].id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-24405516465384a8", "name": "Dangling fetch: PUT http://localhost:3244/api/tasks/${parentTask.id} (web-app/scripts/test-subtask-completion.js:59)", "shortDescription": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${parentTask.id} (web-app/scripts/test-subtask-completion.js:59)"}, "fullDescription": {"text": "`web-app/scripts/test-subtask-completion.js:59` calls `PUT http://localhost:3244/api/tasks/${parentTask.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-ed78db652ca06db9", "name": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-subtask-completion.js:72)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-subtask-completion.js:72)"}, "fullDescription": {"text": "`web-app/scripts/test-subtask-completion.js:72` calls `GET http://localhost:3244/api/database` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/database`\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-9db98b4b372e00b7", "name": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${subtask.id} (web-app/scripts/test-subtask-completion.js:85)", "shortDescription": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${subtask.id} (web-app/scripts/test-subtask-completion.js:85)"}, "fullDescription": {"text": "`web-app/scripts/test-subtask-completion.js:85` calls `DELETE http://localhost:3244/api/tasks/${subtask.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-fd242ab3da650fda", "name": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${parentTask.id} (web-app/scripts/test-subtask-completion.js:87)", "shortDescription": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${parentTask.id} (web-app/scripts/test-subtask-completion.js:87)"}, "fullDescription": {"text": "`web-app/scripts/test-subtask-completion.js:87` calls `DELETE http://localhost:3244/api/tasks/${parentTask.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3244/api/tasks/<p>`\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-b34a50e14a19a951", "name": "Dangling fetch: POST http://127.0.0.1:3244/api/auth/login (web-app/scripts/debug-adapter.mjs:63)", "shortDescription": {"text": "Dangling fetch: POST http://127.0.0.1:3244/api/auth/login (web-app/scripts/debug-adapter.mjs:63)"}, "fullDescription": {"text": "`web-app/scripts/debug-adapter.mjs:63` calls `POST http://127.0.0.1:3244/api/auth/login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:3244/api/auth/login`\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-d4dad2eab2220363", "name": "Dangling fetch: GET http://127.0.0.1:3244/api/database (web-app/scripts/debug-adapter.mjs:75)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:3244/api/database (web-app/scripts/debug-adapter.mjs:75)"}, "fullDescription": {"text": "`web-app/scripts/debug-adapter.mjs:75` calls `GET http://127.0.0.1:3244/api/database` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:3244/api/database`\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-3061453e692858d7", "name": "Dangling fetch: GET /api/email/threads/${threadId} (web-app/components/email-thread-modal.tsx:192)", "shortDescription": {"text": "Dangling fetch: GET /api/email/threads/${threadId} (web-app/components/email-thread-modal.tsx:192)"}, "fullDescription": {"text": "`web-app/components/email-thread-modal.tsx:192` calls `GET /api/email/threads/${threadId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>`\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-f91fc6a5c865c6fb", "name": "Dangling fetch: POST /api/email/threads/${threadId}/projects (web-app/components/email-thread-modal.tsx:704)", "shortDescription": {"text": "Dangling fetch: POST /api/email/threads/${threadId}/projects (web-app/components/email-thread-modal.tsx:704)"}, "fullDescription": {"text": "`web-app/components/email-thread-modal.tsx:704` calls `POST /api/email/threads/${threadId}/projects` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>/projects`\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-170efadf80bd04db", "name": "Dangling fetch: DELETE /api/email/threads/${threadId}/projects (web-app/components/email-thread-modal.tsx:730)", "shortDescription": {"text": "Dangling fetch: DELETE /api/email/threads/${threadId}/projects (web-app/components/email-thread-modal.tsx:730)"}, "fullDescription": {"text": "`web-app/components/email-thread-modal.tsx:730` calls `DELETE /api/email/threads/${threadId}/projects` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>/projects`\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-9a18385cab00ae83", "name": "Dangling fetch: POST /api/email/threads/${threadId}/tasks (web-app/components/email-thread-modal.tsx:756)", "shortDescription": {"text": "Dangling fetch: POST /api/email/threads/${threadId}/tasks (web-app/components/email-thread-modal.tsx:756)"}, "fullDescription": {"text": "`web-app/components/email-thread-modal.tsx:756` calls `POST /api/email/threads/${threadId}/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>/tasks`\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-9103c01dd84da806", "name": "Dangling fetch: DELETE /api/tasks/${taskId} (web-app/components/email-thread-modal.tsx:793)", "shortDescription": {"text": "Dangling fetch: DELETE /api/tasks/${taskId} (web-app/components/email-thread-modal.tsx:793)"}, "fullDescription": {"text": "`web-app/components/email-thread-modal.tsx:793` calls `DELETE /api/tasks/${taskId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-5167aa607c580f99", "name": "Dangling fetch: PATCH /api/email/reply-drafts/${selectedReplyDraftId} (web-app/components/email-thread-modal.tsx:828)", "shortDescription": {"text": "Dangling fetch: PATCH /api/email/reply-drafts/${selectedReplyDraftId} (web-app/components/email-thread-modal.tsx:828)"}, "fullDescription": {"text": "`web-app/components/email-thread-modal.tsx:828` calls `PATCH /api/email/reply-drafts/${selectedReplyDraftId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/reply-drafts/<p>`\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-948c94b88646c98c", "name": "Dangling fetch: POST /api/email/reply-drafts/${draft.id}/schedule (web-app/components/email-thread-modal.tsx:897)", "shortDescription": {"text": "Dangling fetch: POST /api/email/reply-drafts/${draft.id}/schedule (web-app/components/email-thread-modal.tsx:897)"}, "fullDescription": {"text": "`web-app/components/email-thread-modal.tsx:897` calls `POST /api/email/reply-drafts/${draft.id}/schedule` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/reply-drafts/<p>/schedule`\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-aa07d716b729d456", "name": "Dangling fetch: POST /api/email/threads/${threadId}/reply/generate (web-app/components/email-thread-modal.tsx:933)", "shortDescription": {"text": "Dangling fetch: POST /api/email/threads/${threadId}/reply/generate (web-app/components/email-thread-modal.tsx:933)"}, "fullDescription": {"text": "`web-app/components/email-thread-modal.tsx:933` calls `POST /api/email/threads/${threadId}/reply/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>/reply/generate`\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-7eadddf7094642da", "name": "Dangling fetch: POST /api/email/threads/${threadId}/actions (web-app/components/email-thread-modal.tsx:975)", "shortDescription": {"text": "Dangling fetch: POST /api/email/threads/${threadId}/actions (web-app/components/email-thread-modal.tsx:975)"}, "fullDescription": {"text": "`web-app/components/email-thread-modal.tsx:975` calls `POST /api/email/threads/${threadId}/actions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>/actions`\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-d88fb639cd50552e", "name": "Dangling fetch: GET /api/email/reply-drafts (web-app/components/email-drafts-view.tsx:43)", "shortDescription": {"text": "Dangling fetch: GET /api/email/reply-drafts (web-app/components/email-drafts-view.tsx:43)"}, "fullDescription": {"text": "`web-app/components/email-drafts-view.tsx:43` calls `GET /api/email/reply-drafts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/reply-drafts`\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-9b0dd50c2dc1acee", "name": "Dangling fetch: GET /api/ai-planner/session/${existing} (web-app/components/ai-planner-floating-chat.tsx:158)", "shortDescription": {"text": "Dangling fetch: GET /api/ai-planner/session/${existing} (web-app/components/ai-planner-floating-chat.tsx:158)"}, "fullDescription": {"text": "`web-app/components/ai-planner-floating-chat.tsx:158` calls `GET /api/ai-planner/session/${existing}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai-planner/session/<p>`\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-6343522bef3b73a4", "name": "Dangling fetch: POST /api/ai-agent/chat (web-app/components/ai-planner-floating-chat.tsx:189)", "shortDescription": {"text": "Dangling fetch: POST /api/ai-agent/chat (web-app/components/ai-planner-floating-chat.tsx:189)"}, "fullDescription": {"text": "`web-app/components/ai-planner-floating-chat.tsx:189` calls `POST /api/ai-agent/chat` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai-agent/chat`\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-8aa6010f0e19a683", "name": "Dangling fetch: POST /api/voice/transcribe (web-app/components/ai-planner-floating-chat.tsx:280)", "shortDescription": {"text": "Dangling fetch: POST /api/voice/transcribe (web-app/components/ai-planner-floating-chat.tsx:280)"}, "fullDescription": {"text": "`web-app/components/ai-planner-floating-chat.tsx:280` calls `POST /api/voice/transcribe` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/voice/transcribe`\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-ac615e1b5d21abe7", "name": "Dangling fetch: POST /api/user-section-preferences (web-app/components/section-view.tsx:134)", "shortDescription": {"text": "Dangling fetch: POST /api/user-section-preferences (web-app/components/section-view.tsx:134)"}, "fullDescription": {"text": "`web-app/components/section-view.tsx:134` calls `POST /api/user-section-preferences` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/user-section-preferences`\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-c342294862043107", "name": "Dangling fetch: GET /api/email/senders/history?email=${encodeURIComponent(senderEmail)} (web-app/components/sender-histo", "shortDescription": {"text": "Dangling fetch: GET /api/email/senders/history?email=${encodeURIComponent(senderEmail)} (web-app/components/sender-history-modal.tsx:52)"}, "fullDescription": {"text": "`web-app/components/sender-history-modal.tsx:52` calls `GET /api/email/senders/history?email=${encodeURIComponent(senderEmail)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/senders/history`\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-3c17c436e248ad28", "name": "Dangling fetch: GET /api/email/storage (web-app/components/sidebar.tsx:435)", "shortDescription": {"text": "Dangling fetch: GET /api/email/storage (web-app/components/sidebar.tsx:435)"}, "fullDescription": {"text": "`web-app/components/sidebar.tsx:435` calls `GET /api/email/storage` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/storage`\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-5ee2e3aa4f423675", "name": "Dangling fetch: GET /api/tasks/unestimated?total=1 (web-app/components/sidebar.tsx:479)", "shortDescription": {"text": "Dangling fetch: GET /api/tasks/unestimated?total=1 (web-app/components/sidebar.tsx:479)"}, "fullDescription": {"text": "`web-app/components/sidebar.tsx:479` calls `GET /api/tasks/unestimated?total=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/unestimated`\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-5d5098d0a0301dd7", "name": "Dangling fetch: GET /api/calendar/token (web-app/components/sidebar.tsx:704)", "shortDescription": {"text": "Dangling fetch: GET /api/calendar/token (web-app/components/sidebar.tsx:704)"}, "fullDescription": {"text": "`web-app/components/sidebar.tsx:704` calls `GET /api/calendar/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/calendar/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-656a12ceebe360ed", "name": "Dangling fetch: GET /api/v1/time/current (web-app/components/sidebar.tsx:718)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/time/current (web-app/components/sidebar.tsx:718)"}, "fullDescription": {"text": "`web-app/components/sidebar.tsx:718` calls `GET /api/v1/time/current` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/time/current`\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-7a6bd4dad8df0b84", "name": "Dangling fetch: POST /api/v1/time/entries (web-app/components/sidebar.tsx:797)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/time/entries (web-app/components/sidebar.tsx:797)"}, "fullDescription": {"text": "`web-app/components/sidebar.tsx:797` calls `POST /api/v1/time/entries` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/time/entries`\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-78984b2fb5cc68c7", "name": "Dangling fetch: PATCH /api/v1/time/entries/${currentTimerEntryId} (web-app/components/sidebar.tsx:818)", "shortDescription": {"text": "Dangling fetch: PATCH /api/v1/time/entries/${currentTimerEntryId} (web-app/components/sidebar.tsx:818)"}, "fullDescription": {"text": "`web-app/components/sidebar.tsx:818` calls `PATCH /api/v1/time/entries/${currentTimerEntryId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/time/entries/<p>`\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-144f40379bcc834a", "name": "Dangling fetch: GET /api/email/folders (web-app/components/sidebar.tsx:938)", "shortDescription": {"text": "Dangling fetch: GET /api/email/folders (web-app/components/sidebar.tsx:938)"}, "fullDescription": {"text": "`web-app/components/sidebar.tsx:938` calls `GET /api/email/folders` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/folders`\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-db16699b5bb619f8", "name": "Dangling fetch: POST /api/auth/logout (web-app/components/sidebar.tsx:1001)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/logout (web-app/components/sidebar.tsx:1001)"}, "fullDescription": {"text": "`web-app/components/sidebar.tsx:1001` calls `POST /api/auth/logout` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/logout`\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-6cc68097e6be7a54", "name": "Dangling fetch: POST /api/resend-invite (web-app/components/sidebar.tsx:1012)", "shortDescription": {"text": "Dangling fetch: POST /api/resend-invite (web-app/components/sidebar.tsx:1012)"}, "fullDescription": {"text": "`web-app/components/sidebar.tsx:1012` calls `POST /api/resend-invite` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/resend-invite`\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-ceee26759ab3f925", "name": "Dangling fetch: POST /api/cancel-invite (web-app/components/sidebar.tsx:1048)", "shortDescription": {"text": "Dangling fetch: POST /api/cancel-invite (web-app/components/sidebar.tsx:1048)"}, "fullDescription": {"text": "`web-app/components/sidebar.tsx:1048` calls `POST /api/cancel-invite` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cancel-invite`\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-95038f2f316e74c5", "name": "Dangling fetch: GET /api/tasks/unestimated?total=1 (web-app/components/estimate-review-nudge.tsx:39)", "shortDescription": {"text": "Dangling fetch: GET /api/tasks/unestimated?total=1 (web-app/components/estimate-review-nudge.tsx:39)"}, "fullDescription": {"text": "`web-app/components/estimate-review-nudge.tsx:39` calls `GET /api/tasks/unestimated?total=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/unestimated`\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-008a3dbf5f4117d8", "name": "Dangling fetch: POST /api/attachments/upload (web-app/components/email-outbound-composer-modal.tsx:307)", "shortDescription": {"text": "Dangling fetch: POST /api/attachments/upload (web-app/components/email-outbound-composer-modal.tsx:307)"}, "fullDescription": {"text": "`web-app/components/email-outbound-composer-modal.tsx:307` calls `POST /api/attachments/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/attachments/upload`\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-dfcce9bb6ff018e2", "name": "Dangling fetch: POST /api/email/outbound-drafts/${draft.id}/send (web-app/components/email-outbound-composer-modal.tsx:3", "shortDescription": {"text": "Dangling fetch: POST /api/email/outbound-drafts/${draft.id}/send (web-app/components/email-outbound-composer-modal.tsx:397)"}, "fullDescription": {"text": "`web-app/components/email-outbound-composer-modal.tsx:397` calls `POST /api/email/outbound-drafts/${draft.id}/send` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/outbound-drafts/<p>/send`\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-2e7531174e295db3", "name": "Dangling fetch: POST /api/email/outbound-drafts/${draft.id}/schedule (web-app/components/email-outbound-composer-modal.t", "shortDescription": {"text": "Dangling fetch: POST /api/email/outbound-drafts/${draft.id}/schedule (web-app/components/email-outbound-composer-modal.tsx:434)"}, "fullDescription": {"text": "`web-app/components/email-outbound-composer-modal.tsx:434` calls `POST /api/email/outbound-drafts/${draft.id}/schedule` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/outbound-drafts/<p>/schedule`\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-4d4e4b8ec20d3d5c", "name": "Dangling fetch: GET /api/organizations/${organization.id}/api-keys (web-app/components/organization-settings-modal.tsx:2", "shortDescription": {"text": "Dangling fetch: GET /api/organizations/${organization.id}/api-keys (web-app/components/organization-settings-modal.tsx:212)"}, "fullDescription": {"text": "`web-app/components/organization-settings-modal.tsx:212` calls `GET /api/organizations/${organization.id}/api-keys` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/organizations/<p>/api-keys`\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-8e70ce0ca715d180", "name": "Dangling fetch: POST /api/organizations/${organization.id}/api-keys (web-app/components/organization-settings-modal.tsx:", "shortDescription": {"text": "Dangling fetch: POST /api/organizations/${organization.id}/api-keys (web-app/components/organization-settings-modal.tsx:245)"}, "fullDescription": {"text": "`web-app/components/organization-settings-modal.tsx:245` calls `POST /api/organizations/${organization.id}/api-keys` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/organizations/<p>/api-keys`\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-7dfef06541fef7dd", "name": "Dangling fetch: DELETE /api/organizations/${organization.id}/api-keys/${id} (web-app/components/organization-settings-mo", "shortDescription": {"text": "Dangling fetch: DELETE /api/organizations/${organization.id}/api-keys/${id} (web-app/components/organization-settings-modal.tsx:279)"}, "fullDescription": {"text": "`web-app/components/organization-settings-modal.tsx:279` calls `DELETE /api/organizations/${organization.id}/api-keys/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/organizations/<p>/api-keys/<p>`\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-30116c7abaa22170", "name": "Dangling fetch: GET /api/ai-memory/memories (web-app/components/ai-memory-tab.tsx:78)", "shortDescription": {"text": "Dangling fetch: GET /api/ai-memory/memories (web-app/components/ai-memory-tab.tsx:78)"}, "fullDescription": {"text": "`web-app/components/ai-memory-tab.tsx:78` calls `GET /api/ai-memory/memories` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai-memory/memories`\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-4831731ecf968047", "name": "Dangling fetch: PUT /api/ai-memory/memories/${m.id} (web-app/components/ai-memory-tab.tsx:151)", "shortDescription": {"text": "Dangling fetch: PUT /api/ai-memory/memories/${m.id} (web-app/components/ai-memory-tab.tsx:151)"}, "fullDescription": {"text": "`web-app/components/ai-memory-tab.tsx:151` calls `PUT /api/ai-memory/memories/${m.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai-memory/memories/<p>`\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-e6206a50544f9e79", "name": "Dangling fetch: DELETE /api/ai-memory/memories/${m.id} (web-app/components/ai-memory-tab.tsx:165)", "shortDescription": {"text": "Dangling fetch: DELETE /api/ai-memory/memories/${m.id} (web-app/components/ai-memory-tab.tsx:165)"}, "fullDescription": {"text": "`web-app/components/ai-memory-tab.tsx:165` calls `DELETE /api/ai-memory/memories/${m.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai-memory/memories/<p>`\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-fb3c959c3d40800a", "name": "Dangling fetch: GET /api/sync/comments?projectId=${projectId} (web-app/components/project-notes-modal.tsx:79)", "shortDescription": {"text": "Dangling fetch: GET /api/sync/comments?projectId=${projectId} (web-app/components/project-notes-modal.tsx:79)"}, "fullDescription": {"text": "`web-app/components/project-notes-modal.tsx:79` calls `GET /api/sync/comments?projectId=${projectId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sync/comments`\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-bfb9caff76b05bec", "name": "Dangling fetch: POST /api/sync/comments (web-app/components/project-notes-modal.tsx:137)", "shortDescription": {"text": "Dangling fetch: POST /api/sync/comments (web-app/components/project-notes-modal.tsx:137)"}, "fullDescription": {"text": "`web-app/components/project-notes-modal.tsx:137` calls `POST /api/sync/comments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sync/comments`\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-242122901b5a4c77", "name": "Dangling fetch: POST /api/email/rules/assistant (web-app/components/email-rules-panel.tsx:202)", "shortDescription": {"text": "Dangling fetch: POST /api/email/rules/assistant (web-app/components/email-rules-panel.tsx:202)"}, "fullDescription": {"text": "`web-app/components/email-rules-panel.tsx:202` calls `POST /api/email/rules/assistant` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/rules/assistant`\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-9ff1bd9e95e6f959", "name": "Dangling fetch: GET /api/tasks/unestimated?${params.toString()} (web-app/components/estimate-review-modal.tsx:159)", "shortDescription": {"text": "Dangling fetch: GET /api/tasks/unestimated?${params.toString()} (web-app/components/estimate-review-modal.tsx:159)"}, "fullDescription": {"text": "`web-app/components/estimate-review-modal.tsx:159` calls `GET /api/tasks/unestimated?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/unestimated`\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-028763b045e20188", "name": "Dangling fetch: POST /api/tasks/estimate/bulk (web-app/components/estimate-review-modal.tsx:173)", "shortDescription": {"text": "Dangling fetch: POST /api/tasks/estimate/bulk (web-app/components/estimate-review-modal.tsx:173)"}, "fullDescription": {"text": "`web-app/components/estimate-review-modal.tsx:173` calls `POST /api/tasks/estimate/bulk` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/estimate/bulk`\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-dcfe792a817ceee2", "name": "Dangling fetch: POST /api/tasks/estimate/accept (web-app/components/estimate-review-modal.tsx:226)", "shortDescription": {"text": "Dangling fetch: POST /api/tasks/estimate/accept (web-app/components/estimate-review-modal.tsx:226)"}, "fullDescription": {"text": "`web-app/components/estimate-review-modal.tsx:226` calls `POST /api/tasks/estimate/accept` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/estimate/accept`\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-cb21389eba0037de", "name": "Dangling fetch: DELETE /api/tasks/${current.id} (web-app/components/estimate-review-modal.tsx:284)", "shortDescription": {"text": "Dangling fetch: DELETE /api/tasks/${current.id} (web-app/components/estimate-review-modal.tsx:284)"}, "fullDescription": {"text": "`web-app/components/estimate-review-modal.tsx:284` calls `DELETE /api/tasks/${current.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-0997fa48e7ea8a12", "name": "Dangling fetch: DELETE /api/tasks/${current.id} (web-app/components/estimate-review-modal.tsx:316)", "shortDescription": {"text": "Dangling fetch: DELETE /api/tasks/${current.id} (web-app/components/estimate-review-modal.tsx:316)"}, "fullDescription": {"text": "`web-app/components/estimate-review-modal.tsx:316` calls `DELETE /api/tasks/${current.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-1dca8ccb773c5bee", "name": "Dangling fetch: PUT /api/tasks/${current.id} (web-app/components/estimate-review-modal.tsx:326)", "shortDescription": {"text": "Dangling fetch: PUT /api/tasks/${current.id} (web-app/components/estimate-review-modal.tsx:326)"}, "fullDescription": {"text": "`web-app/components/estimate-review-modal.tsx:326` calls `PUT /api/tasks/${current.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-3966daf9fb5db162", "name": "Dangling fetch: DELETE /api/projects/${projectId} (web-app/components/estimate-review-modal.tsx:372)", "shortDescription": {"text": "Dangling fetch: DELETE /api/projects/${projectId} (web-app/components/estimate-review-modal.tsx:372)"}, "fullDescription": {"text": "`web-app/components/estimate-review-modal.tsx:372` calls `DELETE /api/projects/${projectId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/projects/<p>`\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-1771beae0f704f17", "name": "Dangling fetch: POST /api/attachments/upload (web-app/components/task-modal.tsx:613)", "shortDescription": {"text": "Dangling fetch: POST /api/attachments/upload (web-app/components/task-modal.tsx:613)"}, "fullDescription": {"text": "`web-app/components/task-modal.tsx:613` calls `POST /api/attachments/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/attachments/upload`\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-cd7862dbdf120f7b", "name": "Dangling fetch: DELETE /api/attachments/${attachmentId} (web-app/components/task-modal.tsx:652)", "shortDescription": {"text": "Dangling fetch: DELETE /api/attachments/${attachmentId} (web-app/components/task-modal.tsx:652)"}, "fullDescription": {"text": "`web-app/components/task-modal.tsx:652` calls `DELETE /api/attachments/${attachmentId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/attachments/<p>`\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-14084b7950def351", "name": "Dangling fetch: POST /api/projects (web-app/components/task-modal.tsx:729)", "shortDescription": {"text": "Dangling fetch: POST /api/projects (web-app/components/task-modal.tsx:729)"}, "fullDescription": {"text": "`web-app/components/task-modal.tsx:729` calls `POST /api/projects` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/projects`\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-f8059e8f2a666d48", "name": "Dangling fetch: POST /api/tags (web-app/components/task-modal.tsx:790)", "shortDescription": {"text": "Dangling fetch: POST /api/tags (web-app/components/task-modal.tsx:790)"}, "fullDescription": {"text": "`web-app/components/task-modal.tsx:790` calls `POST /api/tags` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tags`\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-3ed65358da6407e6", "name": "Dangling fetch: POST /api/tasks (web-app/components/task-modal.tsx:1260)", "shortDescription": {"text": "Dangling fetch: POST /api/tasks (web-app/components/task-modal.tsx:1260)"}, "fullDescription": {"text": "`web-app/components/task-modal.tsx:1260` calls `POST /api/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks`\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-30c15f3119a1adb0", "name": "Dangling fetch: PUT /api/tasks/${subtask.id} (web-app/components/task-modal.tsx:1330)", "shortDescription": {"text": "Dangling fetch: PUT /api/tasks/${subtask.id} (web-app/components/task-modal.tsx:1330)"}, "fullDescription": {"text": "`web-app/components/task-modal.tsx:1330` calls `PUT /api/tasks/${subtask.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-193eb7b8c4a11340", "name": "Dangling fetch: PUT /api/tasks/${subtask.id} (web-app/components/task-modal.tsx:1345)", "shortDescription": {"text": "Dangling fetch: PUT /api/tasks/${subtask.id} (web-app/components/task-modal.tsx:1345)"}, "fullDescription": {"text": "`web-app/components/task-modal.tsx:1345` calls `PUT /api/tasks/${subtask.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-6c64e45e59492e9b", "name": "Dangling fetch: DELETE /api/tasks/${subtaskToDelete.id} (web-app/components/task-modal.tsx:1369)", "shortDescription": {"text": "Dangling fetch: DELETE /api/tasks/${subtaskToDelete.id} (web-app/components/task-modal.tsx:1369)"}, "fullDescription": {"text": "`web-app/components/task-modal.tsx:1369` calls `DELETE /api/tasks/${subtaskToDelete.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-aaaca16500538908", "name": "Dangling fetch: POST /api/tasks/estimate (web-app/components/task-modal.tsx:2163)", "shortDescription": {"text": "Dangling fetch: POST /api/tasks/estimate (web-app/components/task-modal.tsx:2163)"}, "fullDescription": {"text": "`web-app/components/task-modal.tsx:2163` calls `POST /api/tasks/estimate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/estimate`\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-e1a936a26096b3ed", "name": "Dangling fetch: POST /api/email/threads/${item.id}/actions (web-app/components/email-inbox-view.tsx:1935)", "shortDescription": {"text": "Dangling fetch: POST /api/email/threads/${item.id}/actions (web-app/components/email-inbox-view.tsx:1935)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:1935` calls `POST /api/email/threads/${item.id}/actions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>/actions`\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-bdcbd10dd93eb6f9", "name": "Dangling fetch: GET /api/email/threads/${selectedThreadId} (web-app/components/email-inbox-view.tsx:2119)", "shortDescription": {"text": "Dangling fetch: GET /api/email/threads/${selectedThreadId} (web-app/components/email-inbox-view.tsx:2119)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:2119` calls `GET /api/email/threads/${selectedThreadId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>`\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-cf7dcf6ccbfac6d6", "name": "Dangling fetch: GET /api/email/mailboxes (web-app/components/email-inbox-view.tsx:2228)", "shortDescription": {"text": "Dangling fetch: GET /api/email/mailboxes (web-app/components/email-inbox-view.tsx:2228)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:2228` calls `GET /api/email/mailboxes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/mailboxes`\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-39cc8dbab6dd018f", "name": "Dangling fetch: GET /api/email/inbox (web-app/components/email-inbox-view.tsx:2231)", "shortDescription": {"text": "Dangling fetch: GET /api/email/inbox (web-app/components/email-inbox-view.tsx:2231)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:2231` calls `GET /api/email/inbox` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/inbox`\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-fa1c3285b4d1f5e5", "name": "Dangling fetch: GET /api/email/reply-drafts (web-app/components/email-inbox-view.tsx:2254)", "shortDescription": {"text": "Dangling fetch: GET /api/email/reply-drafts (web-app/components/email-inbox-view.tsx:2254)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:2254` calls `GET /api/email/reply-drafts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/reply-drafts`\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-8c77d1fe34165cb6", "name": "Dangling fetch: POST /api/email/mailboxes/sync-due (web-app/components/email-inbox-view.tsx:2331)", "shortDescription": {"text": "Dangling fetch: POST /api/email/mailboxes/sync-due (web-app/components/email-inbox-view.tsx:2331)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:2331` calls `POST /api/email/mailboxes/sync-due` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/mailboxes/sync-due`\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-98081c91a7eec979", "name": "Dangling fetch: POST /api/email/mailboxes/${mailbox.id}/sync (web-app/components/email-inbox-view.tsx:2450)", "shortDescription": {"text": "Dangling fetch: POST /api/email/mailboxes/${mailbox.id}/sync (web-app/components/email-inbox-view.tsx:2450)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:2450` calls `POST /api/email/mailboxes/${mailbox.id}/sync` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/mailboxes/<p>/sync`\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-8123994ac9448999", "name": "Dangling fetch: POST /api/email/mailboxes/${mailboxId}/sync (web-app/components/email-inbox-view.tsx:2497)", "shortDescription": {"text": "Dangling fetch: POST /api/email/mailboxes/${mailboxId}/sync (web-app/components/email-inbox-view.tsx:2497)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:2497` calls `POST /api/email/mailboxes/${mailboxId}/sync` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/mailboxes/<p>/sync`\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-7bc1eaf826c7745d", "name": "Dangling fetch: POST /api/email/mailboxes (web-app/components/email-inbox-view.tsx:2522)", "shortDescription": {"text": "Dangling fetch: POST /api/email/mailboxes (web-app/components/email-inbox-view.tsx:2522)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:2522` calls `POST /api/email/mailboxes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/mailboxes`\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-0acbe22b7f503a59", "name": "Dangling fetch: POST /api/email/trash/empty (web-app/components/email-inbox-view.tsx:2591)", "shortDescription": {"text": "Dangling fetch: POST /api/email/trash/empty (web-app/components/email-inbox-view.tsx:2591)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:2591` calls `POST /api/email/trash/empty` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/trash/empty`\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-1f7ab3fc51387056", "name": "Dangling fetch: POST /api/email/threads/${threadId}/actions (web-app/components/email-inbox-view.tsx:2696)", "shortDescription": {"text": "Dangling fetch: POST /api/email/threads/${threadId}/actions (web-app/components/email-inbox-view.tsx:2696)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:2696` calls `POST /api/email/threads/${threadId}/actions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>/actions`\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-8f8a99d3e3a47af0", "name": "Dangling fetch: GET /api/email/threads/${threadId} (web-app/components/email-inbox-view.tsx:2707)", "shortDescription": {"text": "Dangling fetch: GET /api/email/threads/${threadId} (web-app/components/email-inbox-view.tsx:2707)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:2707` calls `GET /api/email/threads/${threadId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>`\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-a1b22761d7779e9c", "name": "Dangling fetch: POST /api/email/threads/${item.id}/actions (web-app/components/email-inbox-view.tsx:2792)", "shortDescription": {"text": "Dangling fetch: POST /api/email/threads/${item.id}/actions (web-app/components/email-inbox-view.tsx:2792)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:2792` calls `POST /api/email/threads/${item.id}/actions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>/actions`\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-450055aafd92c249", "name": "Dangling fetch: POST /api/email/spam-exceptions (web-app/components/email-inbox-view.tsx:2863)", "shortDescription": {"text": "Dangling fetch: POST /api/email/spam-exceptions (web-app/components/email-inbox-view.tsx:2863)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:2863` calls `POST /api/email/spam-exceptions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/spam-exceptions`\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-6e14321315cbdbf7", "name": "Dangling fetch: PUT /api/email/threads/${threadId}/project (web-app/components/email-inbox-view.tsx:3026)", "shortDescription": {"text": "Dangling fetch: PUT /api/email/threads/${threadId}/project (web-app/components/email-inbox-view.tsx:3026)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:3026` calls `PUT /api/email/threads/${threadId}/project` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>/project`\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-6ad53e218988e9e5", "name": "Dangling fetch: POST /api/projects (web-app/components/email-inbox-view.tsx:3119)", "shortDescription": {"text": "Dangling fetch: POST /api/projects (web-app/components/email-inbox-view.tsx:3119)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:3119` calls `POST /api/projects` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/projects`\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-33ec858d8d34dae7", "name": "Dangling fetch: POST /api/email/threads/${selectedThreadId}/tasks (web-app/components/email-inbox-view.tsx:3160)", "shortDescription": {"text": "Dangling fetch: POST /api/email/threads/${selectedThreadId}/tasks (web-app/components/email-inbox-view.tsx:3160)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:3160` calls `POST /api/email/threads/${selectedThreadId}/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>/tasks`\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-56fc3817383e6b4e", "name": "Dangling fetch: POST /api/attachments/upload (web-app/components/email-inbox-view.tsx:3203)", "shortDescription": {"text": "Dangling fetch: POST /api/attachments/upload (web-app/components/email-inbox-view.tsx:3203)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:3203` calls `POST /api/attachments/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/attachments/upload`\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-81646ab477297767", "name": "Dangling fetch: GET /api/email/threads/${threadId} (web-app/components/email-inbox-view.tsx:3300)", "shortDescription": {"text": "Dangling fetch: GET /api/email/threads/${threadId} (web-app/components/email-inbox-view.tsx:3300)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:3300` calls `GET /api/email/threads/${threadId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>`\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-d5186eb3af15fe1b", "name": "Dangling fetch: PATCH /api/email/reply-drafts/${selectedReplyDraftId} (web-app/components/email-inbox-view.tsx:3334)", "shortDescription": {"text": "Dangling fetch: PATCH /api/email/reply-drafts/${selectedReplyDraftId} (web-app/components/email-inbox-view.tsx:3334)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:3334` calls `PATCH /api/email/reply-drafts/${selectedReplyDraftId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/reply-drafts/<p>`\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-271d47b538234c3f", "name": "Dangling fetch: POST /api/email/reply-drafts/${draft.id}/send (web-app/components/email-inbox-view.tsx:3392)", "shortDescription": {"text": "Dangling fetch: POST /api/email/reply-drafts/${draft.id}/send (web-app/components/email-inbox-view.tsx:3392)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:3392` calls `POST /api/email/reply-drafts/${draft.id}/send` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/reply-drafts/<p>/send`\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-7628fad0a160da9d", "name": "Dangling fetch: POST /api/email/reply-drafts/${draft.id}/schedule (web-app/components/email-inbox-view.tsx:3430)", "shortDescription": {"text": "Dangling fetch: POST /api/email/reply-drafts/${draft.id}/schedule (web-app/components/email-inbox-view.tsx:3430)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:3430` calls `POST /api/email/reply-drafts/${draft.id}/schedule` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/reply-drafts/<p>/schedule`\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-c55543ce31056174", "name": "Dangling fetch: POST /api/email/threads/${selectedThreadId}/reply/generate (web-app/components/email-inbox-view.tsx:3466", "shortDescription": {"text": "Dangling fetch: POST /api/email/threads/${selectedThreadId}/reply/generate (web-app/components/email-inbox-view.tsx:3466)"}, "fullDescription": {"text": "`web-app/components/email-inbox-view.tsx:3466` calls `POST /api/email/threads/${selectedThreadId}/reply/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>/reply/generate`\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-e5236d098b4c2f4b", "name": "Dangling fetch: GET /api/email/unread-count (web-app/components/dock-badge-sync.tsx:12)", "shortDescription": {"text": "Dangling fetch: GET /api/email/unread-count (web-app/components/dock-badge-sync.tsx:12)"}, "fullDescription": {"text": "`web-app/components/dock-badge-sync.tsx:12` calls `GET /api/email/unread-count` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/unread-count`\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-2d951ace5dbd697b", "name": "Dangling fetch: POST /api/email/threads/${item.id}/star (web-app/components/email-starred-view.tsx:48)", "shortDescription": {"text": "Dangling fetch: POST /api/email/threads/${item.id}/star (web-app/components/email-starred-view.tsx:48)"}, "fullDescription": {"text": "`web-app/components/email-starred-view.tsx:48` calls `POST /api/email/threads/${item.id}/star` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>/star`\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-3015d3881660035f", "name": "Dangling fetch: GET /api/todoist/preview?userId=${userId} (web-app/components/todoist-sync-preview-modal.tsx:79)", "shortDescription": {"text": "Dangling fetch: GET /api/todoist/preview?userId=${userId} (web-app/components/todoist-sync-preview-modal.tsx:79)"}, "fullDescription": {"text": "`web-app/components/todoist-sync-preview-modal.tsx:79` calls `GET /api/todoist/preview?userId=${userId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/todoist/preview`\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-4d5935fa93cc57c3", "name": "Dangling fetch: GET /api/v1/time/organizations/${organizationId}/tokens (web-app/components/focus-time-organization-pane", "shortDescription": {"text": "Dangling fetch: GET /api/v1/time/organizations/${organizationId}/tokens (web-app/components/focus-time-organization-panel.tsx:37)"}, "fullDescription": {"text": "`web-app/components/focus-time-organization-panel.tsx:37` calls `GET /api/v1/time/organizations/${organizationId}/tokens` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/time/organizations/<p>/tokens`\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-121ed524dc0202ed", "name": "Dangling fetch: GET /api/v1/time/organizations/${organizationId}/groups (web-app/components/focus-time-organization-pane", "shortDescription": {"text": "Dangling fetch: GET /api/v1/time/organizations/${organizationId}/groups (web-app/components/focus-time-organization-panel.tsx:38)"}, "fullDescription": {"text": "`web-app/components/focus-time-organization-panel.tsx:38` calls `GET /api/v1/time/organizations/${organizationId}/groups` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/time/organizations/<p>/groups`\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-ef41841064ef5c35", "name": "Dangling fetch: POST /api/v1/time/organizations/${organizationId}/tokens (web-app/components/focus-time-organization-pan", "shortDescription": {"text": "Dangling fetch: POST /api/v1/time/organizations/${organizationId}/tokens (web-app/components/focus-time-organization-panel.tsx:71)"}, "fullDescription": {"text": "`web-app/components/focus-time-organization-panel.tsx:71` calls `POST /api/v1/time/organizations/${organizationId}/tokens` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/time/organizations/<p>/tokens`\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-6e70e6d090937d1b", "name": "Dangling fetch: DELETE /api/v1/time/organizations/${organizationId}/tokens/${tokenId} (web-app/components/focus-time-org", "shortDescription": {"text": "Dangling fetch: DELETE /api/v1/time/organizations/${organizationId}/tokens/${tokenId} (web-app/components/focus-time-organization-panel.tsx:102)"}, "fullDescription": {"text": "`web-app/components/focus-time-organization-panel.tsx:102` calls `DELETE /api/v1/time/organizations/${organizationId}/tokens/${tokenId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/time/organizations/<p>/tokens/<p>`\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-a103d84b9f647c5e", "name": "Dangling fetch: GET /api/v1/time/bootstrap (web-app/components/time-tracking-view.tsx:169)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/time/bootstrap (web-app/components/time-tracking-view.tsx:169)"}, "fullDescription": {"text": "`web-app/components/time-tracking-view.tsx:169` calls `GET /api/v1/time/bootstrap` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/time/bootstrap`\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-42930e59cc3fc6be", "name": "Dangling fetch: GET /api/v1/time/entries?${searchParams.toString()} (web-app/components/time-tracking-view.tsx:201)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/time/entries?${searchParams.toString()} (web-app/components/time-tracking-view.tsx:201)"}, "fullDescription": {"text": "`web-app/components/time-tracking-view.tsx:201` calls `GET /api/v1/time/entries?${searchParams.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/time/entries`\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-509e1b7b18077253", "name": "Dangling fetch: GET /api/v1/time/current (web-app/components/time-tracking-view.tsx:212)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/time/current (web-app/components/time-tracking-view.tsx:212)"}, "fullDescription": {"text": "`web-app/components/time-tracking-view.tsx:212` calls `GET /api/v1/time/current` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/time/current`\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-a131eee3872dc883", "name": "Dangling fetch: PATCH /api/v1/time/entries/${currentEntry.id} (web-app/components/time-tracking-view.tsx:296)", "shortDescription": {"text": "Dangling fetch: PATCH /api/v1/time/entries/${currentEntry.id} (web-app/components/time-tracking-view.tsx:296)"}, "fullDescription": {"text": "`web-app/components/time-tracking-view.tsx:296` calls `PATCH /api/v1/time/entries/${currentEntry.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/time/entries/<p>`\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-fda262b419eb58e1", "name": "Dangling fetch: POST /api/v1/time/entries (web-app/components/time-tracking-view.tsx:344)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/time/entries (web-app/components/time-tracking-view.tsx:344)"}, "fullDescription": {"text": "`web-app/components/time-tracking-view.tsx:344` calls `POST /api/v1/time/entries` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/time/entries`\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-017344c3f261d392", "name": "Dangling fetch: PATCH /api/v1/time/entries/${currentEntry.id} (web-app/components/time-tracking-view.tsx:378)", "shortDescription": {"text": "Dangling fetch: PATCH /api/v1/time/entries/${currentEntry.id} (web-app/components/time-tracking-view.tsx:378)"}, "fullDescription": {"text": "`web-app/components/time-tracking-view.tsx:378` calls `PATCH /api/v1/time/entries/${currentEntry.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/time/entries/<p>`\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-fda302f031e31c6c", "name": "Dangling fetch: DELETE /api/v1/time/entries/${id} (web-app/components/time-tracking-view.tsx:400)", "shortDescription": {"text": "Dangling fetch: DELETE /api/v1/time/entries/${id} (web-app/components/time-tracking-view.tsx:400)"}, "fullDescription": {"text": "`web-app/components/time-tracking-view.tsx:400` calls `DELETE /api/v1/time/entries/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/time/entries/<p>`\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-bf8fd57bc8395067", "name": "Dangling fetch: GET /api/todoist/sync?userId=${userId} (web-app/components/todoist-settings.tsx:69)", "shortDescription": {"text": "Dangling fetch: GET /api/todoist/sync?userId=${userId} (web-app/components/todoist-settings.tsx:69)"}, "fullDescription": {"text": "`web-app/components/todoist-settings.tsx:69` calls `GET /api/todoist/sync?userId=${userId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/todoist/sync`\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-6f33eb48a2718e58", "name": "Dangling fetch: POST /api/todoist/connect (web-app/components/todoist-settings.tsx:91)", "shortDescription": {"text": "Dangling fetch: POST /api/todoist/connect (web-app/components/todoist-settings.tsx:91)"}, "fullDescription": {"text": "`web-app/components/todoist-settings.tsx:91` calls `POST /api/todoist/connect` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/todoist/connect`\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-26e3bbb7e1f0a2dc", "name": "Dangling fetch: POST /api/todoist/sync (web-app/components/todoist-settings.tsx:121)", "shortDescription": {"text": "Dangling fetch: POST /api/todoist/sync (web-app/components/todoist-settings.tsx:121)"}, "fullDescription": {"text": "`web-app/components/todoist-settings.tsx:121` calls `POST /api/todoist/sync` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/todoist/sync`\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-0686e5392a6d22cd", "name": "Dangling fetch: DELETE /api/todoist/connect (web-app/components/todoist-settings.tsx:150)", "shortDescription": {"text": "Dangling fetch: DELETE /api/todoist/connect (web-app/components/todoist-settings.tsx:150)"}, "fullDescription": {"text": "`web-app/components/todoist-settings.tsx:150` calls `DELETE /api/todoist/connect` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/todoist/connect`\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-0d93da3de3fe10bd", "name": "Dangling fetch: GET /api/history?${query} (web-app/components/history-timeline-scrubber.tsx:94)", "shortDescription": {"text": "Dangling fetch: GET /api/history?${query} (web-app/components/history-timeline-scrubber.tsx:94)"}, "fullDescription": {"text": "`web-app/components/history-timeline-scrubber.tsx:94` calls `GET /api/history?${query}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/history`\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-2485c748a43a4ba8", "name": "Dangling fetch: POST /api/daily-plan (web-app/components/daily-plan-card.tsx:88)", "shortDescription": {"text": "Dangling fetch: POST /api/daily-plan (web-app/components/daily-plan-card.tsx:88)"}, "fullDescription": {"text": "`web-app/components/daily-plan-card.tsx:88` calls `POST /api/daily-plan` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/daily-plan`\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-738c95dc18efe3d0", "name": "Dangling fetch: GET /api/email/threads/${threadId} (web-app/components/email-work-list.tsx:675)", "shortDescription": {"text": "Dangling fetch: GET /api/email/threads/${threadId} (web-app/components/email-work-list.tsx:675)"}, "fullDescription": {"text": "`web-app/components/email-work-list.tsx:675` calls `GET /api/email/threads/${threadId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>`\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-8d9654a9d8e47a1a", "name": "Dangling fetch: GET /api/email/threads/${threadId} (web-app/components/email-work-list.tsx:721)", "shortDescription": {"text": "Dangling fetch: GET /api/email/threads/${threadId} (web-app/components/email-work-list.tsx:721)"}, "fullDescription": {"text": "`web-app/components/email-work-list.tsx:721` calls `GET /api/email/threads/${threadId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>`\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-76c812905e4f72d3", "name": "Dangling fetch: GET /api/email/threads/${item.id}/tasks (web-app/components/email-work-list.tsx:759)", "shortDescription": {"text": "Dangling fetch: GET /api/email/threads/${item.id}/tasks (web-app/components/email-work-list.tsx:759)"}, "fullDescription": {"text": "`web-app/components/email-work-list.tsx:759` calls `GET /api/email/threads/${item.id}/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>/tasks`\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-e51f3bdb069465e2", "name": "Dangling fetch: POST /api/email/threads/${item.id}/tasks (web-app/components/email-work-list.tsx:776)", "shortDescription": {"text": "Dangling fetch: POST /api/email/threads/${item.id}/tasks (web-app/components/email-work-list.tsx:776)"}, "fullDescription": {"text": "`web-app/components/email-work-list.tsx:776` calls `POST /api/email/threads/${item.id}/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>/tasks`\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-a261a77169266cd6", "name": "Dangling fetch: GET /api/email/threads/${item.id}/tasks (web-app/components/email-work-list.tsx:808)", "shortDescription": {"text": "Dangling fetch: GET /api/email/threads/${item.id}/tasks (web-app/components/email-work-list.tsx:808)"}, "fullDescription": {"text": "`web-app/components/email-work-list.tsx:808` calls `GET /api/email/threads/${item.id}/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>/tasks`\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-f6bfde86d958a853", "name": "Dangling fetch: POST /api/email/spam-exceptions (web-app/components/email-spam-review-modal.tsx:255)", "shortDescription": {"text": "Dangling fetch: POST /api/email/spam-exceptions (web-app/components/email-spam-review-modal.tsx:255)"}, "fullDescription": {"text": "`web-app/components/email-spam-review-modal.tsx:255` calls `POST /api/email/spam-exceptions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/spam-exceptions`\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-d6ba1ba37f97ec69", "name": "Dangling fetch: POST /api/email/spam-exceptions/${ruleId}/revert (web-app/components/email-spam-review-modal.tsx:292)", "shortDescription": {"text": "Dangling fetch: POST /api/email/spam-exceptions/${ruleId}/revert (web-app/components/email-spam-review-modal.tsx:292)"}, "fullDescription": {"text": "`web-app/components/email-spam-review-modal.tsx:292` calls `POST /api/email/spam-exceptions/${ruleId}/revert` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/spam-exceptions/<p>/revert`\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-6d73e482870f3107", "name": "Dangling fetch: POST /api/email/threads/${thread.id}/actions (web-app/components/email-spam-review-modal.tsx:360)", "shortDescription": {"text": "Dangling fetch: POST /api/email/threads/${thread.id}/actions (web-app/components/email-spam-review-modal.tsx:360)"}, "fullDescription": {"text": "`web-app/components/email-spam-review-modal.tsx:360` calls `POST /api/email/threads/${thread.id}/actions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>/actions`\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-3729664304e08eff", "name": "Dangling fetch: POST /api/time-blocks/chat (web-app/components/calendar-chat.tsx:55)", "shortDescription": {"text": "Dangling fetch: POST /api/time-blocks/chat (web-app/components/calendar-chat.tsx:55)"}, "fullDescription": {"text": "`web-app/components/calendar-chat.tsx:55` calls `POST /api/time-blocks/chat` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/time-blocks/chat`\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-719d083b98089e6f", "name": "Dangling fetch: POST /api/todoist/quick-sync (web-app/components/todoist-quick-sync-modal.tsx:66)", "shortDescription": {"text": "Dangling fetch: POST /api/todoist/quick-sync (web-app/components/todoist-quick-sync-modal.tsx:66)"}, "fullDescription": {"text": "`web-app/components/todoist-quick-sync-modal.tsx:66` calls `POST /api/todoist/quick-sync` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/todoist/quick-sync`\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-302b6dc8bdcc7e17", "name": "Dangling fetch: GET /api/ai-memory/playbooks (web-app/components/ai-playbook-tab.tsx:34)", "shortDescription": {"text": "Dangling fetch: GET /api/ai-memory/playbooks (web-app/components/ai-playbook-tab.tsx:34)"}, "fullDescription": {"text": "`web-app/components/ai-playbook-tab.tsx:34` calls `GET /api/ai-memory/playbooks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai-memory/playbooks`\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-8f5d52b03b040af4", "name": "Dangling fetch: PUT /api/ai-memory/playbooks/${selected.id} (web-app/components/ai-playbook-tab.tsx:61)", "shortDescription": {"text": "Dangling fetch: PUT /api/ai-memory/playbooks/${selected.id} (web-app/components/ai-playbook-tab.tsx:61)"}, "fullDescription": {"text": "`web-app/components/ai-playbook-tab.tsx:61` calls `PUT /api/ai-memory/playbooks/${selected.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai-memory/playbooks/<p>`\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-f01b4203d9b81ba6", "name": "Dangling fetch: POST /api/ai-memory/playbooks (web-app/components/ai-playbook-tab.tsx:80)", "shortDescription": {"text": "Dangling fetch: POST /api/ai-memory/playbooks (web-app/components/ai-playbook-tab.tsx:80)"}, "fullDescription": {"text": "`web-app/components/ai-playbook-tab.tsx:80` calls `POST /api/ai-memory/playbooks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai-memory/playbooks`\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-449ba06216341f51", "name": "Dangling fetch: POST /api/todoist/connect (web-app/components/todoist-integration.tsx:225)", "shortDescription": {"text": "Dangling fetch: POST /api/todoist/connect (web-app/components/todoist-integration.tsx:225)"}, "fullDescription": {"text": "`web-app/components/todoist-integration.tsx:225` calls `POST /api/todoist/connect` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/todoist/connect`\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-66d9600537ade0d4", "name": "Dangling fetch: POST /api/todoist/sync (web-app/components/todoist-integration.tsx:289)", "shortDescription": {"text": "Dangling fetch: POST /api/todoist/sync (web-app/components/todoist-integration.tsx:289)"}, "fullDescription": {"text": "`web-app/components/todoist-integration.tsx:289` calls `POST /api/todoist/sync` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/todoist/sync`\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-5e3b8534ff2fba56", "name": "Dangling fetch: GET /api/ai-memory/traces (web-app/components/ai-decision-history-tab.tsx:71)", "shortDescription": {"text": "Dangling fetch: GET /api/ai-memory/traces (web-app/components/ai-decision-history-tab.tsx:71)"}, "fullDescription": {"text": "`web-app/components/ai-decision-history-tab.tsx:71` calls `GET /api/ai-memory/traces` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai-memory/traces`\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-1687f908c0dc21a3", "name": "Dangling fetch: GET /api/ai-memory/traces/${id} (web-app/components/ai-decision-history-tab.tsx:92)", "shortDescription": {"text": "Dangling fetch: GET /api/ai-memory/traces/${id} (web-app/components/ai-decision-history-tab.tsx:92)"}, "fullDescription": {"text": "`web-app/components/ai-decision-history-tab.tsx:92` calls `GET /api/ai-memory/traces/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai-memory/traces/<p>`\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-7d892af89abdb8ca", "name": "Dangling fetch: GET /api/tasks/unestimated?limit=50 (web-app/components/estimates-view.tsx:48)", "shortDescription": {"text": "Dangling fetch: GET /api/tasks/unestimated?limit=50 (web-app/components/estimates-view.tsx:48)"}, "fullDescription": {"text": "`web-app/components/estimates-view.tsx:48` calls `GET /api/tasks/unestimated?limit=50` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/unestimated`\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-8f794a7179a12342", "name": "Dangling fetch: GET /api/tasks/estimate/examples?limit=100 (web-app/components/estimates-view.tsx:64)", "shortDescription": {"text": "Dangling fetch: GET /api/tasks/estimate/examples?limit=100 (web-app/components/estimates-view.tsx:64)"}, "fullDescription": {"text": "`web-app/components/estimates-view.tsx:64` calls `GET /api/tasks/estimate/examples?limit=100` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/estimate/examples`\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-b97a1f5f3b2bd82c", "name": "Dangling fetch: DELETE /api/tasks/estimate/examples?id=${id} (web-app/components/estimates-view.tsx:86)", "shortDescription": {"text": "Dangling fetch: DELETE /api/tasks/estimate/examples?id=${id} (web-app/components/estimates-view.tsx:86)"}, "fullDescription": {"text": "`web-app/components/estimates-view.tsx:86` calls `DELETE /api/tasks/estimate/examples?id=${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/estimate/examples`\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-3114786ca436e395", "name": "Dangling fetch: GET /api/calendar/token (web-app/app/settings/page.tsx:339)", "shortDescription": {"text": "Dangling fetch: GET /api/calendar/token (web-app/app/settings/page.tsx:339)"}, "fullDescription": {"text": "`web-app/app/settings/page.tsx:339` calls `GET /api/calendar/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/calendar/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0d71968987bfcac9", "name": "Dangling fetch: POST /api/calendar/token (web-app/app/settings/page.tsx:354)", "shortDescription": {"text": "Dangling fetch: POST /api/calendar/token (web-app/app/settings/page.tsx:354)"}, "fullDescription": {"text": "`web-app/app/settings/page.tsx:354` calls `POST /api/calendar/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/calendar/token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6870409c5f6112f5", "name": "Dangling fetch: GET /api/database (web-app/app/settings/page.tsx:396)", "shortDescription": {"text": "Dangling fetch: GET /api/database (web-app/app/settings/page.tsx:396)"}, "fullDescription": {"text": "`web-app/app/settings/page.tsx:396` calls `GET /api/database` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/database`\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-d46451e2b3e0be9f", "name": "Dangling fetch: GET /api/keys/personal-access-tokens (web-app/app/settings/page.tsx:410)", "shortDescription": {"text": "Dangling fetch: GET /api/keys/personal-access-tokens (web-app/app/settings/page.tsx:410)"}, "fullDescription": {"text": "`web-app/app/settings/page.tsx:410` calls `GET /api/keys/personal-access-tokens` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/keys/personal-access-tokens`\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-010edbd8ba32528e", "name": "Dangling fetch: POST /api/keys/personal-access-tokens (web-app/app/settings/page.tsx:445)", "shortDescription": {"text": "Dangling fetch: POST /api/keys/personal-access-tokens (web-app/app/settings/page.tsx:445)"}, "fullDescription": {"text": "`web-app/app/settings/page.tsx:445` calls `POST /api/keys/personal-access-tokens` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/keys/personal-access-tokens`\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-33a258528cc5a6c2", "name": "Dangling fetch: DELETE /api/keys/personal-access-tokens/${id} (web-app/app/settings/page.tsx:484)", "shortDescription": {"text": "Dangling fetch: DELETE /api/keys/personal-access-tokens/${id} (web-app/app/settings/page.tsx:484)"}, "fullDescription": {"text": "`web-app/app/settings/page.tsx:484` calls `DELETE /api/keys/personal-access-tokens/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/keys/personal-access-tokens/<p>`\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-4c8f2298495fd488", "name": "Dangling fetch: PUT /api/organizations/${selectedOrganization.id} (web-app/app/settings/page.tsx:2159)", "shortDescription": {"text": "Dangling fetch: PUT /api/organizations/${selectedOrganization.id} (web-app/app/settings/page.tsx:2159)"}, "fullDescription": {"text": "`web-app/app/settings/page.tsx:2159` calls `PUT /api/organizations/${selectedOrganization.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/organizations/<p>`\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-084f98dc2485a698", "name": "Dangling fetch: POST /api/invite-user (web-app/app/settings/page.tsx:2202)", "shortDescription": {"text": "Dangling fetch: POST /api/invite-user (web-app/app/settings/page.tsx:2202)"}, "fullDescription": {"text": "`web-app/app/settings/page.tsx:2202` calls `POST /api/invite-user` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/invite-user`\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-ade86428f5e76748", "name": "Dangling fetch: PUT /api/organizations/${organizationId} (web-app/app/settings/page.tsx:2258)", "shortDescription": {"text": "Dangling fetch: PUT /api/organizations/${organizationId} (web-app/app/settings/page.tsx:2258)"}, "fullDescription": {"text": "`web-app/app/settings/page.tsx:2258` calls `PUT /api/organizations/${organizationId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/organizations/<p>`\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-b3e94e6d4988492d", "name": "Dangling fetch: PUT /api/organizations/${organizationId} (web-app/app/settings/page.tsx:2293)", "shortDescription": {"text": "Dangling fetch: PUT /api/organizations/${organizationId} (web-app/app/settings/page.tsx:2293)"}, "fullDescription": {"text": "`web-app/app/settings/page.tsx:2293` calls `PUT /api/organizations/${organizationId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/organizations/<p>`\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-ec19b1d573b96a09", "name": "Dangling fetch: PUT /api/users/${userId} (web-app/app/settings/page.tsx:2317)", "shortDescription": {"text": "Dangling fetch: PUT /api/users/${userId} (web-app/app/settings/page.tsx:2317)"}, "fullDescription": {"text": "`web-app/app/settings/page.tsx:2317` calls `PUT /api/users/${userId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/users/<p>`\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-33700b0f87ffefe1", "name": "Dangling fetch: POST /api/resend-invite (web-app/app/settings/page.tsx:2345)", "shortDescription": {"text": "Dangling fetch: POST /api/resend-invite (web-app/app/settings/page.tsx:2345)"}, "fullDescription": {"text": "`web-app/app/settings/page.tsx:2345` calls `POST /api/resend-invite` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/resend-invite`\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-2b9d056074a57ad6", "name": "Dangling fetch: POST /api/cancel-invite (web-app/app/settings/page.tsx:2369)", "shortDescription": {"text": "Dangling fetch: POST /api/cancel-invite (web-app/app/settings/page.tsx:2369)"}, "fullDescription": {"text": "`web-app/app/settings/page.tsx:2369` calls `POST /api/cancel-invite` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cancel-invite`\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-68024ed8f056a7b1", "name": "Dangling fetch: POST /api/auth/login (web-app/app/auth/login/page.tsx:38)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/login (web-app/app/auth/login/page.tsx:38)"}, "fullDescription": {"text": "`web-app/app/auth/login/page.tsx:38` calls `POST /api/auth/login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/login`\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-10b5958e494f9a2b", "name": "Dangling fetch: POST /api/auth/forgot-password (web-app/app/auth/forgot-password/page.tsx:21)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/forgot-password (web-app/app/auth/forgot-password/page.tsx:21)"}, "fullDescription": {"text": "`web-app/app/auth/forgot-password/page.tsx:21` calls `POST /api/auth/forgot-password` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/forgot-password`\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-7f30d5fb883803cf", "name": "Dangling fetch: POST /api/auth/register (web-app/app/auth/register/page.tsx:39)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/register (web-app/app/auth/register/page.tsx:39)"}, "fullDescription": {"text": "`web-app/app/auth/register/page.tsx:39` calls `POST /api/auth/register` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/register`\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-6a04afb279ed5093", "name": "Dangling fetch: POST /api/accept-invite (web-app/app/auth/accept-invite/page.tsx:61)", "shortDescription": {"text": "Dangling fetch: POST /api/accept-invite (web-app/app/auth/accept-invite/page.tsx:61)"}, "fullDescription": {"text": "`web-app/app/auth/accept-invite/page.tsx:61` calls `POST /api/accept-invite` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/accept-invite`\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-0111191e781ecad4", "name": "Dangling fetch: POST /api/auth/login (web-app/app/auth/accept-invite/page.tsx:78)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/login (web-app/app/auth/accept-invite/page.tsx:78)"}, "fullDescription": {"text": "`web-app/app/auth/accept-invite/page.tsx:78` calls `POST /api/auth/login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/login`\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-c9f3755fc7696f8c", "name": "Dangling fetch: POST /api/accept-invite (web-app/app/auth/accept-invite/page.tsx:114)", "shortDescription": {"text": "Dangling fetch: POST /api/accept-invite (web-app/app/auth/accept-invite/page.tsx:114)"}, "fullDescription": {"text": "`web-app/app/auth/accept-invite/page.tsx:114` calls `POST /api/accept-invite` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/accept-invite`\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-c1224aa10cb73093", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (web-app/app/api/time-blocks/chat/route.ts:26)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (web-app/app/api/time-blocks/chat/route.ts:26)"}, "fullDescription": {"text": "`web-app/app/api/time-blocks/chat/route.ts:26` calls `POST https://api.anthropic.com/v1/messages` 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.anthropic.com/v1/messages`\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-18670bc97e9931ad", "name": "Dangling fetch: GET /api/trash (web-app/app/trash/page.tsx:129)", "shortDescription": {"text": "Dangling fetch: GET /api/trash (web-app/app/trash/page.tsx:129)"}, "fullDescription": {"text": "`web-app/app/trash/page.tsx:129` calls `GET /api/trash` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trash`\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-34a34da69ba54b82", "name": "Dangling fetch: POST /api/trash/restore (web-app/app/trash/page.tsx:157)", "shortDescription": {"text": "Dangling fetch: POST /api/trash/restore (web-app/app/trash/page.tsx:157)"}, "fullDescription": {"text": "`web-app/app/trash/page.tsx:157` calls `POST /api/trash/restore` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trash/restore`\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-2e5f8e8f5ff2ed8b", "name": "Dangling fetch: POST /api/trash/purge (web-app/app/trash/page.tsx:182)", "shortDescription": {"text": "Dangling fetch: POST /api/trash/purge (web-app/app/trash/page.tsx:182)"}, "fullDescription": {"text": "`web-app/app/trash/page.tsx:182` calls `POST /api/trash/purge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trash/purge`\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-00fef3463fc08714", "name": "Dangling fetch: GET /api/email/inbox?projectId=${encodeURIComponent(projectId)} (web-app/app/[view]/view-client.tsx:1104", "shortDescription": {"text": "Dangling fetch: GET /api/email/inbox?projectId=${encodeURIComponent(projectId)} (web-app/app/[view]/view-client.tsx:1104)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:1104` calls `GET /api/email/inbox?projectId=${encodeURIComponent(projectId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/inbox`\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-6db00e34bad8848c", "name": "Dangling fetch: POST /api/email/mailboxes/sync-due (web-app/app/[view]/view-client.tsx:1154)", "shortDescription": {"text": "Dangling fetch: POST /api/email/mailboxes/sync-due (web-app/app/[view]/view-client.tsx:1154)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:1154` calls `POST /api/email/mailboxes/sync-due` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/mailboxes/sync-due`\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-1f47424d9c946fd5", "name": "Dangling fetch: GET /api/email/task-links (web-app/app/[view]/view-client.tsx:1216)", "shortDescription": {"text": "Dangling fetch: GET /api/email/task-links (web-app/app/[view]/view-client.tsx:1216)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:1216` calls `GET /api/email/task-links` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/task-links`\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-285ca7e779dcfb6f", "name": "Dangling fetch: PUT /api/tasks/${id} (web-app/app/[view]/view-client.tsx:1262)", "shortDescription": {"text": "Dangling fetch: PUT /api/tasks/${id} (web-app/app/[view]/view-client.tsx:1262)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:1262` calls `PUT /api/tasks/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-6fed293155956fd1", "name": "Dangling fetch: POST /api/todoist/quick-sync (web-app/app/[view]/view-client.tsx:1288)", "shortDescription": {"text": "Dangling fetch: POST /api/todoist/quick-sync (web-app/app/[view]/view-client.tsx:1288)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:1288` calls `POST /api/todoist/quick-sync` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/todoist/quick-sync`\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-cb299d23bbd13738", "name": "Dangling fetch: POST /api/tasks (web-app/app/[view]/view-client.tsx:1379)", "shortDescription": {"text": "Dangling fetch: POST /api/tasks (web-app/app/[view]/view-client.tsx:1379)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:1379` calls `POST /api/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks`\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-007350b60e02725c", "name": "Dangling fetch: POST /api/task-sections (web-app/app/[view]/view-client.tsx:1390)", "shortDescription": {"text": "Dangling fetch: POST /api/task-sections (web-app/app/[view]/view-client.tsx:1390)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:1390` calls `POST /api/task-sections` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/task-sections`\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-04d8733b46db66ea", "name": "Dangling fetch: POST /api/tasks (web-app/app/[view]/view-client.tsx:1421)", "shortDescription": {"text": "Dangling fetch: POST /api/tasks (web-app/app/[view]/view-client.tsx:1421)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:1421` calls `POST /api/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks`\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-2055468b24c29cbf", "name": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:1501)", "shortDescription": {"text": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:1501)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:1501` calls `PUT /api/tasks/${taskId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-5520bef855fb89f7", "name": "Dangling fetch: PUT /api/tasks/${subtask.id} (web-app/app/[view]/view-client.tsx:1516)", "shortDescription": {"text": "Dangling fetch: PUT /api/tasks/${subtask.id} (web-app/app/[view]/view-client.tsx:1516)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:1516` calls `PUT /api/tasks/${subtask.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-d51867bb7b6aa87f", "name": "Dangling fetch: POST /api/tasks (web-app/app/[view]/view-client.tsx:1542)", "shortDescription": {"text": "Dangling fetch: POST /api/tasks (web-app/app/[view]/view-client.tsx:1542)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:1542` calls `POST /api/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks`\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-5ee978ffed695ed2", "name": "Dangling fetch: PUT /api/tasks/${savedTaskId} (web-app/app/[view]/view-client.tsx:1711)", "shortDescription": {"text": "Dangling fetch: PUT /api/tasks/${savedTaskId} (web-app/app/[view]/view-client.tsx:1711)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:1711` calls `PUT /api/tasks/${savedTaskId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-65829ea49133aa3d", "name": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:1769)", "shortDescription": {"text": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:1769)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:1769` calls `PUT /api/tasks/${taskId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-bc8f91ea579b2ddf", "name": "Dangling fetch: DELETE /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:1820)", "shortDescription": {"text": "Dangling fetch: DELETE /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:1820)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:1820` calls `DELETE /api/tasks/${taskId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-ba2632a0c632ec0c", "name": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:1864)", "shortDescription": {"text": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:1864)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:1864` calls `PUT /api/tasks/${taskId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-564e4b3603aca188", "name": "Dangling fetch: POST /api/tasks (web-app/app/[view]/view-client.tsx:1913)", "shortDescription": {"text": "Dangling fetch: POST /api/tasks (web-app/app/[view]/view-client.tsx:1913)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:1913` calls `POST /api/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks`\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-3c1760b2b1f1a860", "name": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:1940)", "shortDescription": {"text": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:1940)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:1940` calls `PUT /api/tasks/${taskId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-8631696f6ba2943f", "name": "Dangling fetch: POST /api/invite-user (web-app/app/[view]/view-client.tsx:2019)", "shortDescription": {"text": "Dangling fetch: POST /api/invite-user (web-app/app/[view]/view-client.tsx:2019)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2019` calls `POST /api/invite-user` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/invite-user`\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-eee0044a527aee83", "name": "Dangling fetch: POST /api/invite-user (web-app/app/[view]/view-client.tsx:2084)", "shortDescription": {"text": "Dangling fetch: POST /api/invite-user (web-app/app/[view]/view-client.tsx:2084)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2084` calls `POST /api/invite-user` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/invite-user`\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-7b14b6024506352a", "name": "Dangling fetch: POST /api/resend-invite (web-app/app/[view]/view-client.tsx:2116)", "shortDescription": {"text": "Dangling fetch: POST /api/resend-invite (web-app/app/[view]/view-client.tsx:2116)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2116` calls `POST /api/resend-invite` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/resend-invite`\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-6487e17d088389e8", "name": "Dangling fetch: POST /api/cancel-invite (web-app/app/[view]/view-client.tsx:2144)", "shortDescription": {"text": "Dangling fetch: POST /api/cancel-invite (web-app/app/[view]/view-client.tsx:2144)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2144` calls `POST /api/cancel-invite` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cancel-invite`\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-8a8952cd5213db0f", "name": "Dangling fetch: DELETE /api/tasks/${taskDeleteConfirm.taskId} (web-app/app/[view]/view-client.tsx:2179)", "shortDescription": {"text": "Dangling fetch: DELETE /api/tasks/${taskDeleteConfirm.taskId} (web-app/app/[view]/view-client.tsx:2179)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2179` calls `DELETE /api/tasks/${taskDeleteConfirm.taskId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-19039aa2086af74f", "name": "Dangling fetch: POST /api/trash/restore (web-app/app/[view]/view-client.tsx:2212)", "shortDescription": {"text": "Dangling fetch: POST /api/trash/restore (web-app/app/[view]/view-client.tsx:2212)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2212` calls `POST /api/trash/restore` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trash/restore`\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-a96857e77b86fe38", "name": "Dangling fetch: PUT /api/projects/${projectId} (web-app/app/[view]/view-client.tsx:2235)", "shortDescription": {"text": "Dangling fetch: PUT /api/projects/${projectId} (web-app/app/[view]/view-client.tsx:2235)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2235` calls `PUT /api/projects/${projectId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/projects/<p>`\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-41630b8e52d7f55b", "name": "Dangling fetch: DELETE /api/projects/${projectId} (web-app/app/[view]/view-client.tsx:2252)", "shortDescription": {"text": "Dangling fetch: DELETE /api/projects/${projectId} (web-app/app/[view]/view-client.tsx:2252)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2252` calls `DELETE /api/projects/${projectId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/projects/<p>`\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-f8bea800973417c9", "name": "Dangling fetch: POST /api/projects (web-app/app/[view]/view-client.tsx:2273)", "shortDescription": {"text": "Dangling fetch: POST /api/projects (web-app/app/[view]/view-client.tsx:2273)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2273` calls `POST /api/projects` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/projects`\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-f5d35868e7801841", "name": "Dangling fetch: POST /api/organizations (web-app/app/[view]/view-client.tsx:2313)", "shortDescription": {"text": "Dangling fetch: POST /api/organizations (web-app/app/[view]/view-client.tsx:2313)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2313` calls `POST /api/organizations` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/organizations`\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-281984f1eedd6ca4", "name": "Dangling fetch: DELETE /api/organizations/${orgId} (web-app/app/[view]/view-client.tsx:2333)", "shortDescription": {"text": "Dangling fetch: DELETE /api/organizations/${orgId} (web-app/app/[view]/view-client.tsx:2333)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2333` calls `DELETE /api/organizations/${orgId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/organizations/<p>`\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-d7afd34a398b9737", "name": "Dangling fetch: PUT /api/organizations/${orgId} (web-app/app/[view]/view-client.tsx:2376)", "shortDescription": {"text": "Dangling fetch: PUT /api/organizations/${orgId} (web-app/app/[view]/view-client.tsx:2376)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2376` calls `PUT /api/organizations/${orgId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/organizations/<p>`\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-9857c66996690ad4", "name": "Dangling fetch: PUT /api/projects/${project.id} (web-app/app/[view]/view-client.tsx:2405)", "shortDescription": {"text": "Dangling fetch: PUT /api/projects/${project.id} (web-app/app/[view]/view-client.tsx:2405)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2405` calls `PUT /api/projects/${project.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/projects/<p>`\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-ca07c13d3f62f5bb", "name": "Dangling fetch: POST /api/projects/reorder (web-app/app/[view]/view-client.tsx:2441)", "shortDescription": {"text": "Dangling fetch: POST /api/projects/reorder (web-app/app/[view]/view-client.tsx:2441)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2441` calls `POST /api/projects/reorder` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/projects/reorder`\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-d1b420dc1b4a3c21", "name": "Dangling fetch: POST /api/organizations/reorder (web-app/app/[view]/view-client.tsx:2458)", "shortDescription": {"text": "Dangling fetch: POST /api/organizations/reorder (web-app/app/[view]/view-client.tsx:2458)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2458` calls `POST /api/organizations/reorder` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/organizations/reorder`\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-3edf28a2f891cda0", "name": "Dangling fetch: POST /api/sections (web-app/app/[view]/view-client.tsx:2477)", "shortDescription": {"text": "Dangling fetch: POST /api/sections (web-app/app/[view]/view-client.tsx:2477)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2477` calls `POST /api/sections` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sections`\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-6a6f6f79bf0066ea", "name": "Dangling fetch: DELETE /api/sections/${sectionId} (web-app/app/[view]/view-client.tsx:2525)", "shortDescription": {"text": "Dangling fetch: DELETE /api/sections/${sectionId} (web-app/app/[view]/view-client.tsx:2525)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2525` calls `DELETE /api/sections/${sectionId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sections/<p>`\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-46ed2344626d9e67", "name": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:2577)", "shortDescription": {"text": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:2577)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2577` calls `PUT /api/tasks/${taskId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-3b9b07c67dadfa9f", "name": "Dangling fetch: POST /api/task-sections (web-app/app/[view]/view-client.tsx:2589)", "shortDescription": {"text": "Dangling fetch: POST /api/task-sections (web-app/app/[view]/view-client.tsx:2589)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2589` calls `POST /api/task-sections` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/task-sections`\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-f7c3fbf71e920527", "name": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:2649)", "shortDescription": {"text": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:2649)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2649` calls `PUT /api/tasks/${taskId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-507eebd542b0ec53", "name": "Dangling fetch: DELETE /api/task-sections?taskId=${encodeURIComponent(taskId)}&sectionId=${encodeURIComponent(sectionId)", "shortDescription": {"text": "Dangling fetch: DELETE /api/task-sections?taskId=${encodeURIComponent(taskId)}&sectionId=${encodeURIComponent(sectionId)} (web-app/app/[view]/view-client.tsx:2663)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2663` calls `DELETE /api/task-sections?taskId=${encodeURIComponent(taskId)}&sectionId=${encodeURIComponent(sectionId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/task-sections`\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-bde389c70b821a77", "name": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:2816)", "shortDescription": {"text": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:2816)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:2816` calls `PUT /api/tasks/${taskId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-b8df9da22131af6e", "name": "Dangling fetch: POST /api/ai-planner/auto-section (web-app/app/[view]/view-client.tsx:3149)", "shortDescription": {"text": "Dangling fetch: POST /api/ai-planner/auto-section (web-app/app/[view]/view-client.tsx:3149)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:3149` calls `POST /api/ai-planner/auto-section` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai-planner/auto-section`\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-b5ffdb7f7a19d109", "name": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:3703)", "shortDescription": {"text": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:3703)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:3703` calls `PUT /api/tasks/${taskId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-17503d34e5d0bf34", "name": "Dangling fetch: POST /api/email/threads/${inboxItemId}/actions (web-app/app/[view]/view-client.tsx:4222)", "shortDescription": {"text": "Dangling fetch: POST /api/email/threads/${inboxItemId}/actions (web-app/app/[view]/view-client.tsx:4222)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:4222` calls `POST /api/email/threads/${inboxItemId}/actions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>/actions`\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-17c43572c2d8613c", "name": "Dangling fetch: POST /api/email/threads/${inboxItemId}/actions (web-app/app/[view]/view-client.tsx:4237)", "shortDescription": {"text": "Dangling fetch: POST /api/email/threads/${inboxItemId}/actions (web-app/app/[view]/view-client.tsx:4237)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:4237` calls `POST /api/email/threads/${inboxItemId}/actions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/threads/<p>/actions`\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-5077d8d28f2312e3", "name": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:4400)", "shortDescription": {"text": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:4400)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:4400` calls `PUT /api/tasks/${taskId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-2694b1dd000d1f45", "name": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:5156)", "shortDescription": {"text": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:5156)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:5156` calls `PUT /api/tasks/${taskId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-bd787b1bf120626e", "name": "Dangling fetch: POST /api/email/mailboxes/sync-due (web-app/app/[view]/view-client.tsx:5973)", "shortDescription": {"text": "Dangling fetch: POST /api/email/mailboxes/sync-due (web-app/app/[view]/view-client.tsx:5973)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:5973` calls `POST /api/email/mailboxes/sync-due` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/mailboxes/sync-due`\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-9b1495444e1a8962", "name": "Dangling fetch: PUT /api/organizations/${organizationId} (web-app/app/[view]/view-client.tsx:6172)", "shortDescription": {"text": "Dangling fetch: PUT /api/organizations/${organizationId} (web-app/app/[view]/view-client.tsx:6172)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:6172` calls `PUT /api/organizations/${organizationId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/organizations/<p>`\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-883af88b0b31aafe", "name": "Dangling fetch: PUT /api/organizations/${organizationId} (web-app/app/[view]/view-client.tsx:6200)", "shortDescription": {"text": "Dangling fetch: PUT /api/organizations/${organizationId} (web-app/app/[view]/view-client.tsx:6200)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:6200` calls `PUT /api/organizations/${organizationId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/organizations/<p>`\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-31a639c028611a92", "name": "Dangling fetch: PUT /api/tasks/${task.id} (web-app/app/[view]/view-client.tsx:6367)", "shortDescription": {"text": "Dangling fetch: PUT /api/tasks/${task.id} (web-app/app/[view]/view-client.tsx:6367)"}, "fullDescription": {"text": "`web-app/app/[view]/view-client.tsx:6367` calls `PUT /api/tasks/${task.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks/<p>`\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-68bd2fcf376966c0", "name": "Dangling fetch: GET /api/time-blocks (web-app/app/calendar/page.tsx:45)", "shortDescription": {"text": "Dangling fetch: GET /api/time-blocks (web-app/app/calendar/page.tsx:45)"}, "fullDescription": {"text": "`web-app/app/calendar/page.tsx:45` calls `GET /api/time-blocks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/time-blocks`\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-e240c73497e5c80e", "name": "Dangling fetch: GET /api/tasks (web-app/app/calendar/page.tsx:60)", "shortDescription": {"text": "Dangling fetch: GET /api/tasks (web-app/app/calendar/page.tsx:60)"}, "fullDescription": {"text": "`web-app/app/calendar/page.tsx:60` calls `GET /api/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tasks`\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-d3371f5c10ee3beb", "name": "Dangling fetch: PATCH /api/time-blocks/${blockId} (web-app/app/calendar/page.tsx:72)", "shortDescription": {"text": "Dangling fetch: PATCH /api/time-blocks/${blockId} (web-app/app/calendar/page.tsx:72)"}, "fullDescription": {"text": "`web-app/app/calendar/page.tsx:72` calls `PATCH /api/time-blocks/${blockId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/time-blocks/<p>`\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-af45df2e3bb000a7", "name": "Dangling fetch: POST /api/time-blocks (web-app/app/calendar/page.tsx:95)", "shortDescription": {"text": "Dangling fetch: POST /api/time-blocks (web-app/app/calendar/page.tsx:95)"}, "fullDescription": {"text": "`web-app/app/calendar/page.tsx:95` calls `POST /api/time-blocks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/time-blocks`\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-4f54449cd25bedd8", "name": "Dangling fetch: DELETE /api/time-blocks/${blockId} (web-app/app/calendar/page.tsx:119)", "shortDescription": {"text": "Dangling fetch: DELETE /api/time-blocks/${blockId} (web-app/app/calendar/page.tsx:119)"}, "fullDescription": {"text": "`web-app/app/calendar/page.tsx:119` calls `DELETE /api/time-blocks/${blockId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/time-blocks/<p>`\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-b3c3c84929bec191", "name": "Dangling fetch: POST /api/time-blocks/${blockId}/tasks (web-app/app/calendar/page.tsx:135)", "shortDescription": {"text": "Dangling fetch: POST /api/time-blocks/${blockId}/tasks (web-app/app/calendar/page.tsx:135)"}, "fullDescription": {"text": "`web-app/app/calendar/page.tsx:135` calls `POST /api/time-blocks/${blockId}/tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/time-blocks/<p>/tasks`\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-0a0021eff3dead86", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (web-app/lib/ai-agent/providers.ts:171)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (web-app/lib/ai-agent/providers.ts:171)"}, "fullDescription": {"text": "`web-app/lib/ai-agent/providers.ts:171` calls `POST https://api.anthropic.com/v1/messages` 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.anthropic.com/v1/messages`\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-097d8280054d5975", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/ai-memory/write.ts:155)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/ai-memory/write.ts:155)"}, "fullDescription": {"text": "`web-app/lib/ai-memory/write.ts:155` calls `POST https://api.openai.com/v1/chat/completions` 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.openai.com/v1/chat/completions`\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-029c162b38f514e3", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/ai-memory/playbook.ts:133)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/ai-memory/playbook.ts:133)"}, "fullDescription": {"text": "`web-app/lib/ai-memory/playbook.ts:133` calls `POST https://api.openai.com/v1/chat/completions` 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.openai.com/v1/chat/completions`\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-a06f32173fd68c85", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/ai-planner/auto-section.ts:193)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/ai-planner/auto-section.ts:193)"}, "fullDescription": {"text": "`web-app/lib/ai-planner/auto-section.ts:193` calls `POST https://api.openai.com/v1/chat/completions` 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.openai.com/v1/chat/completions`\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-563c717573d09aad", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/ai-planner/server.ts:210)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/ai-planner/server.ts:210)"}, "fullDescription": {"text": "`web-app/lib/ai-planner/server.ts:210` calls `POST https://api.openai.com/v1/chat/completions` 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.openai.com/v1/chat/completions`\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-4e70c37e8ec0c19e", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/daily-plan/server.ts:162)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/daily-plan/server.ts:162)"}, "fullDescription": {"text": "`web-app/lib/daily-plan/server.ts:162` calls `POST https://api.openai.com/v1/chat/completions` 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.openai.com/v1/chat/completions`\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-c18c1a6b0f4b1da0", "name": "Dangling fetch: POST https://api.openai.com/v1/embeddings (web-app/lib/ai-core/embeddings.ts:9)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/embeddings (web-app/lib/ai-core/embeddings.ts:9)"}, "fullDescription": {"text": "`web-app/lib/ai-core/embeddings.ts:9` calls `POST https://api.openai.com/v1/embeddings` 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.openai.com/v1/embeddings`\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-1632c7cb5c89df7c", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/ai-estimator/server.ts:135)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/ai-estimator/server.ts:135)"}, "fullDescription": {"text": "`web-app/lib/ai-estimator/server.ts:135` calls `POST https://api.openai.com/v1/chat/completions` 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.openai.com/v1/chat/completions`\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-20c475d1c13fd85b", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/email-inbox/ai.ts:883)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/email-inbox/ai.ts:883)"}, "fullDescription": {"text": "`web-app/lib/email-inbox/ai.ts:883` calls `POST https://api.openai.com/v1/chat/completions` 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.openai.com/v1/chat/completions`\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-c381860f03a865e7", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/email-inbox/ai.ts:1032)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/email-inbox/ai.ts:1032)"}, "fullDescription": {"text": "`web-app/lib/email-inbox/ai.ts:1032` calls `POST https://api.openai.com/v1/chat/completions` 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.openai.com/v1/chat/completions`\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-7fd1632cc648a29e", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/email-inbox/rule-assistant.ts:285)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/email-inbox/rule-assistant.ts:285)"}, "fullDescription": {"text": "`web-app/lib/email-inbox/rule-assistant.ts:285` calls `POST https://api.openai.com/v1/chat/completions` 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.openai.com/v1/chat/completions`\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-11396ffd6aa2ae54", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/email-inbox/spam-exception.ts:228)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/email-inbox/spam-exception.ts:228)"}, "fullDescription": {"text": "`web-app/lib/email-inbox/spam-exception.ts:228` calls `POST https://api.openai.com/v1/chat/completions` 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.openai.com/v1/chat/completions`\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-f2b93272c0cdd105", "name": "Unused endpoint: GET /v1/health", "shortDescription": {"text": "Unused endpoint: GET /v1/health"}, "fullDescription": {"text": "`api/src/routes/health.ts` declares `GET /v1/health` 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-e1c8dc9bea021e14", "name": "Unused endpoint: ALL /v1/*", "shortDescription": {"text": "Unused endpoint: ALL /v1/*"}, "fullDescription": {"text": "`api/src/routes/proxy.ts` declares `ALL /v1/*` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/18687"}, "properties": {"repository": "s3w47m88/focus-forge", "repoUrl": "https://github.com/s3w47m88/focus-forge", "branch": "main"}, "results": [{"ruleId": "scanner-b6279a373e3b0304", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/test-auth.js:9"}, "properties": {"repobilityId": "46cd3426d4e16487", "scanner": "scanner-primary", "fingerprint": "b6279a373e3b0304", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9dbd55d8d0a6ab67", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/email-live-sync-worker.js:180"}, "properties": {"repobilityId": "7f7c0021bbc3711a", "scanner": "scanner-primary", "fingerprint": "9dbd55d8d0a6ab67", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-489e2bd440a56a8e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/start.js:10"}, "properties": {"repobilityId": "ecc11b05c427a05b", "scanner": "scanner-primary", "fingerprint": "489e2bd440a56a8e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-83b78a25a269675e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/check-api.js:5"}, "properties": {"repobilityId": "0d80662d1e6e74af", "scanner": "scanner-primary", "fingerprint": "83b78a25a269675e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d1bc66bba27941e9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/check-api-docs-coverage.ts:32"}, "properties": {"repobilityId": "8a6384b3d3537bb7", "scanner": "scanner-primary", "fingerprint": "d1bc66bba27941e9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c93661d9a35b43d8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/add-pending-user.js:41"}, "properties": {"repobilityId": "883dc110f4e62fac", "scanner": "scanner-primary", "fingerprint": "c93661d9a35b43d8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8df15a1ff7bc4bdd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/migrate-todoist.ts:4"}, "properties": {"repobilityId": "b88570911a6f4c26", "scanner": "scanner-primary", "fingerprint": "8df15a1ff7bc4bdd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5e7c7803eb93dff1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/add-member-to-org.js:22"}, "properties": {"repobilityId": "a220721a633dc125", "scanner": "scanner-primary", "fingerprint": "5e7c7803eb93dff1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-27e997b8c7cd5df5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/update-spencer-email.ts:5"}, "properties": {"repobilityId": "3f0298c41a1eeb85", "scanner": "scanner-primary", "fingerprint": "27e997b8c7cd5df5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-572a6b39176d293b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/update-user-status.js:22"}, "properties": {"repobilityId": "0833d798c95dda4b", "scanner": "scanner-primary", "fingerprint": "572a6b39176d293b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7474a422887a1048", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/test-dependencies.js:4"}, "properties": {"repobilityId": "4f80b91b294e7b53", "scanner": "scanner-primary", "fingerprint": "7474a422887a1048", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3a86dec0344ee4c6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/simple-dependency-test.js:4"}, "properties": {"repobilityId": "23d0886a13937eea", "scanner": "scanner-primary", "fingerprint": "3a86dec0344ee4c6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a9c15090732d2812", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/update-overdue-tasks.ts:40"}, "properties": {"repobilityId": "7172561e9efaad6d", "scanner": "scanner-primary", "fingerprint": "a9c15090732d2812", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7b039b6f7ce5fcad", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/test-dependencies-basic.js:4"}, "properties": {"repobilityId": "4c373b129e3816f1", "scanner": "scanner-primary", "fingerprint": "7b039b6f7ce5fcad", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6d36e6c81bc26670", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/fix-subtasks.ts:5"}, "properties": {"repobilityId": "357bd31b1b43d658", "scanner": "scanner-primary", "fingerprint": "6d36e6c81bc26670", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5d9dca3de8db8347", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/test-basic-api.js:4"}, "properties": {"repobilityId": "705384903f23fbd3", "scanner": "scanner-primary", "fingerprint": "5d9dca3de8db8347", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-962150a559d5a764", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/update-users.js:31"}, "properties": {"repobilityId": "5a4dd3fb86679665", "scanner": "scanner-primary", "fingerprint": "962150a559d5a764", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3919cc5662a7f052", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/test-subtask-completion.js:4"}, "properties": {"repobilityId": "28e5cceefd1a8e22", "scanner": "scanner-primary", "fingerprint": "3919cc5662a7f052", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-169e66e27d466d0f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/test-database.ts:5"}, "properties": {"repobilityId": "30e60f782b64c93f", "scanner": "scanner-primary", "fingerprint": "169e66e27d466d0f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e255d3115d541770", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/start.js:8"}, "properties": {"repobilityId": "01fdfdcec921b12d", "scanner": "scanner-primary", "fingerprint": "e255d3115d541770", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-631998b210288832", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/scripts/ai-memory-evaluate.ts:155"}, "properties": {"repobilityId": "e7b55e122404fe17", "scanner": "scanner-primary", "fingerprint": "631998b210288832", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3f818d4f374dee98", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-thread-attachments.tsx:128"}, "properties": {"repobilityId": "9f270eee4350a189", "scanner": "scanner-primary", "fingerprint": "3f818d4f374dee98", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f1334b6903e5d399", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-thread-modal.tsx:1205"}, "properties": {"repobilityId": "02a7a5746636a474", "scanner": "scanner-primary", "fingerprint": "f1334b6903e5d399", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c57ed64afe5e24a4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-drafts-view.tsx:109"}, "properties": {"repobilityId": "5e350a60bb6d97a9", "scanner": "scanner-primary", "fingerprint": "c57ed64afe5e24a4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b3e0e590ffdb7ff7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/bulk-edit-modal.tsx:650"}, "properties": {"repobilityId": "92eb09dabaac02a6", "scanner": "scanner-primary", "fingerprint": "b3e0e590ffdb7ff7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3a5947c84bc50059", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/sender-history-modal.tsx:143"}, "properties": {"repobilityId": "4a13e0ca5139c7fd", "scanner": "scanner-primary", "fingerprint": "3a5947c84bc50059", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7b4aaf51a237e090", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/sidebar.tsx:289"}, "properties": {"repobilityId": "df6a86ac0e593800", "scanner": "scanner-primary", "fingerprint": "7b4aaf51a237e090", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4ddfa22b0e9eab64", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-outbound-composer-modal.tsx:668"}, "properties": {"repobilityId": "28d475d8bb2fc30b", "scanner": "scanner-primary", "fingerprint": "4ddfa22b0e9eab64", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1656d9cbc9178e39", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/ai-memory-tab.tsx:254"}, "properties": {"repobilityId": "e0fef987ca7e9299", "scanner": "scanner-primary", "fingerprint": "1656d9cbc9178e39", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-07c4184984640507", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/task-modal.tsx:956"}, "properties": {"repobilityId": "9304521e308ac0a1", "scanner": "scanner-primary", "fingerprint": "07c4184984640507", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6b0b258d4bd0dcf4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/edit-project-modal.tsx:699"}, "properties": {"repobilityId": "e756dbece91140bf", "scanner": "scanner-primary", "fingerprint": "6b0b258d4bd0dcf4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-75299b725e39a76f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/project-section-board.tsx:366"}, "properties": {"repobilityId": "6d6ecd86257bc44a", "scanner": "scanner-primary", "fingerprint": "75299b725e39a76f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-21e4f5ec1bdce077", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-inbox-view.tsx:4736"}, "properties": {"repobilityId": "f63835490cc24fd5", "scanner": "scanner-primary", "fingerprint": "21e4f5ec1bdce077", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-79dc5d1df65dfe41", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-starred-view.tsx:107"}, "properties": {"repobilityId": "1c26f709eed73d3a", "scanner": "scanner-primary", "fingerprint": "79dc5d1df65dfe41", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1e934c091a040c7a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/existing-member-picker.tsx:91"}, "properties": {"repobilityId": "a0a7b7141b2aecbb", "scanner": "scanner-primary", "fingerprint": "1e934c091a040c7a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f3ebf1462f121b30", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/todoist-sync-preview-modal.tsx:290"}, "properties": {"repobilityId": "196cea8fa2f709a1", "scanner": "scanner-primary", "fingerprint": "f3ebf1462f121b30", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-78898f1c57520420", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/focus-time-organization-panel.tsx:260"}, "properties": {"repobilityId": "e8e65d116f7e33e4", "scanner": "scanner-primary", "fingerprint": "78898f1c57520420", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9b3b7577707fe823", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/history-timeline-scrubber.tsx:268"}, "properties": {"repobilityId": "c19005af3b2c4a25", "scanner": "scanner-primary", "fingerprint": "9b3b7577707fe823", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bbeb4b00ee0818b9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/task-list.tsx:512"}, "properties": {"repobilityId": "f538592cedb10301", "scanner": "scanner-primary", "fingerprint": "bbeb4b00ee0818b9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-60773c0f70e4ff05", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 web-app/components/task-list.tsx:470"}, "properties": {"repobilityId": "6ae3ab4acd3e296a", "scanner": "scanner-primary", "fingerprint": "60773c0f70e4ff05", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-41d6a2cc1e940aa1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/nav-tasks-modal.tsx:159"}, "properties": {"repobilityId": "e837afe8e5fc4c71", "scanner": "scanner-primary", "fingerprint": "41d6a2cc1e940aa1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e5dd61a95266af07", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/delete-project-modal.tsx:176"}, "properties": {"repobilityId": "65e5a0dd14455baf", "scanner": "scanner-primary", "fingerprint": "e5dd61a95266af07", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ca1a6744b0a65e0b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-work-list.tsx:1167"}, "properties": {"repobilityId": "1befa1253d289562", "scanner": "scanner-primary", "fingerprint": "ca1a6744b0a65e0b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d739844c774229e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/kanban-view.tsx:315"}, "properties": {"repobilityId": "f66b67f21b0d12b4", "scanner": "scanner-primary", "fingerprint": "d739844c774229e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-09dff7490aeafdde", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-spam-review-modal.tsx:514"}, "properties": {"repobilityId": "b94e322834e46fff", "scanner": "scanner-primary", "fingerprint": "09dff7490aeafdde", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-112484243445bdd3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/todoist-quick-sync-modal.tsx:264"}, "properties": {"repobilityId": "f171611ad21f4e16", "scanner": "scanner-primary", "fingerprint": "112484243445bdd3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5ee1e0594d174d72", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/ai-decision-history-tab.tsx:143"}, "properties": {"repobilityId": "fc5b950bb9a049a4", "scanner": "scanner-primary", "fingerprint": "5ee1e0594d174d72", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0d8629471609e706", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/components/email-attachment-lightbox.tsx:219"}, "properties": {"repobilityId": "78424794cb66a55f", "scanner": "scanner-primary", "fingerprint": "0d8629471609e706", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-41dc915a5eae326c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 web-app/components/ui/rich-text-content.tsx:19"}, "properties": {"repobilityId": "6596d0dc4c57821d", "scanner": "scanner-primary", "fingerprint": "41dc915a5eae326c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-62831e5386aaa1f5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/contexts/AuthContext.tsx:69"}, "properties": {"repobilityId": "118230a257f2cc90", "scanner": "scanner-primary", "fingerprint": "62831e5386aaa1f5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f228b5c8a66b06d3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/app/settings/page.tsx:1089"}, "properties": {"repobilityId": "39692fbbc770a403", "scanner": "scanner-primary", "fingerprint": "f228b5c8a66b06d3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-27692b4d49af677d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/app/api/sync/database/route.ts:107"}, "properties": {"repobilityId": "ca583bdd0275b0c0", "scanner": "scanner-primary", "fingerprint": "27692b4d49af677d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2f6cdd8931dacca0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/app/api/auth/login/route.ts:8"}, "properties": {"repobilityId": "fb38afd08edbfb7d", "scanner": "scanner-primary", "fingerprint": "2f6cdd8931dacca0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-edd5f595bdbee817", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/app/api/mobile/auth/apple/route.ts:32"}, "properties": {"repobilityId": "d505ccb759c7cef0", "scanner": "scanner-primary", "fingerprint": "edd5f595bdbee817", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4d01818930054fc4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/app/trash/page.tsx:284"}, "properties": {"repobilityId": "8cec6565ec030f9d", "scanner": "scanner-primary", "fingerprint": "4d01818930054fc4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-934e01359e55ab28", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/app/desktop/page.tsx:189"}, "properties": {"repobilityId": "6af11b65f14f354a", "scanner": "scanner-primary", "fingerprint": "934e01359e55ab28", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-59b81b12c1139155", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web-app/app/[view]/view-client.tsx:344"}, "properties": {"repobilityId": "6f6a6bdc5822c71a", "scanner": "scanner-primary", "fingerprint": "59b81b12c1139155", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a4a9b45619b815ac", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 web-app/app/[view]/view-client.tsx:2499"}, "properties": {"repobilityId": "80fceb1b0cd33d31", "scanner": "scanner-primary", "fingerprint": "a4a9b45619b815ac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-0997b6aa50bc8f99", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/lib/todoist-migration.ts:113"}, "properties": {"repobilityId": "89309a0b694deaa1", "scanner": "scanner-primary", "fingerprint": "0997b6aa50bc8f99", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9ff93b3d77000aab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/lib/init-sync.ts:16"}, "properties": {"repobilityId": "ecf005ce20303de1", "scanner": "scanner-primary", "fingerprint": "9ff93b3d77000aab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6988615433e3d311", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/lib/feature-flags.tsx:157"}, "properties": {"repobilityId": "543c941236e1f9fd", "scanner": "scanner-primary", "fingerprint": "6988615433e3d311", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-318db227eb29b155", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/lib/supabase/server.ts:16"}, "properties": {"repobilityId": "6c9d805ef120e99b", "scanner": "scanner-primary", "fingerprint": "318db227eb29b155", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-06eab37bbbc1ddc2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/lib/services/sync-scheduler.ts:42"}, "properties": {"repobilityId": "b10c72708d5b62d8", "scanner": "scanner-primary", "fingerprint": "06eab37bbbc1ddc2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0c2e81e48882bb8d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 web-app/lib/db/supabase-adapter.ts:99"}, "properties": {"repobilityId": "de7a6fac442646b7", "scanner": "scanner-primary", "fingerprint": "0c2e81e48882bb8d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-564b45d270cf0238", "level": "error", "message": {"text": "Runtime dotenv file present in repo: .env.production"}, "properties": {"repobilityId": "da3016501941bee3", "scanner": "scanner-primary", "fingerprint": "564b45d270cf0238", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".env.production"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-110f16f3187b7b57", "level": "error", "message": {"text": "Runtime dotenv file present in repo: .env.mobile"}, "properties": {"repobilityId": "77738e6b4adeb4a2", "scanner": "scanner-primary", "fingerprint": "110f16f3187b7b57", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".env.mobile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bf8ab4a6288256d3", "level": "error", "message": {"text": "Possible secret in web-app/test-auth.js"}, "properties": {"repobilityId": "15663ce04959a816", "scanner": "scanner-primary", "fingerprint": "bf8ab4a6288256d3", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web-app/test-auth.js"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-b92c02757d5157e8", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in web-app/docs/todoist-sync-api.html:1780"}, "properties": {"repobilityId": "e659dc0eb06d98d9", "scanner": "scanner-primary", "fingerprint": "b92c02757d5157e8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web-app/docs/todoist-sync-api.html"}, "region": {"startLine": 1780}}}]}, {"ruleId": "scanner-17ebc5ada091a470", "level": "error", "message": {"text": "Possible secret in web-app/scripts/create-api-user.mjs"}, "properties": {"repobilityId": "96e2e36e695c78f3", "scanner": "scanner-primary", "fingerprint": "17ebc5ada091a470", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web-app/scripts/create-api-user.mjs"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-65921674c6e94475", "level": "error", "message": {"text": "Possible secret in web-app/scripts/test-auth-refresh.mjs"}, "properties": {"repobilityId": "397ca3398b876701", "scanner": "scanner-primary", "fingerprint": "65921674c6e94475", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web-app/scripts/test-auth-refresh.mjs"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-6dc7418aa40d37ac", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in web-app/scripts/start.js:3"}, "properties": {"repobilityId": "4909b459f654259a", "scanner": "scanner-primary", "fingerprint": "6dc7418aa40d37ac", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web-app/scripts/start.js"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-4538f49478849a0a", "level": "error", "message": {"text": "Possible secret in web-app/scripts/set-user-password.mjs"}, "properties": {"repobilityId": "e4cf37ce423f248d", "scanner": "scanner-primary", "fingerprint": "4538f49478849a0a", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web-app/scripts/set-user-password.mjs"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-0834c986199743f7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in web-app/components/task-list.tsx:470"}, "properties": {"repobilityId": "d1844bdf17a40308", "scanner": "scanner-primary", "fingerprint": "0834c986199743f7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web-app/components/task-list.tsx"}, "region": {"startLine": 470}}}]}, {"ruleId": "scanner-08295b4ab6e10cf7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in web-app/components/ui/rich-text-content.tsx:19"}, "properties": {"repobilityId": "e984a1cae125bfb2", "scanner": "scanner-primary", "fingerprint": "08295b4ab6e10cf7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web-app/components/ui/rich-text-content.tsx"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-2fb5134538d6b652", "level": "error", "message": {"text": "Insecure pattern 'private_key_in_repo' in web-app/lib/__tests__/push-notifications.test.ts:20"}, "properties": {"repobilityId": "8dc6f4838ad122e9", "scanner": "scanner-primary", "fingerprint": "2fb5134538d6b652", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["owasp", "private_key_in_repo"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web-app/lib/__tests__/push-notifications.test.ts"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-209e4d7fe2258068", "level": "error", "message": {"text": "Insecure pattern 'private_key_in_repo' in web-app/lib/push/apns.ts:54"}, "properties": {"repobilityId": "b5ded65dcd21043c", "scanner": "scanner-primary", "fingerprint": "209e4d7fe2258068", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["owasp", "private_key_in_repo"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web-app/lib/push/apns.ts"}, "region": {"startLine": 54}}}]}, {"ruleId": "scanner-16c44154b22fa654", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "66f6e3101be86216", "scanner": "scanner-primary", "fingerprint": "16c44154b22fa654", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/api-deploy.yml"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-16c44154b22fa654", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4f7b0fa6db7b6529", "scanner": "scanner-primary", "fingerprint": "16c44154b22fa654", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/api-deploy.yml"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-1c082a0b7a253b37", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1bdafc7da9804a44", "scanner": "scanner-primary", "fingerprint": "1c082a0b7a253b37", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/railway-deploy.yml"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-1c082a0b7a253b37", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4d23d419cdda92ed", "scanner": "scanner-primary", "fingerprint": "1c082a0b7a253b37", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/railway-deploy.yml"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-1c082a0b7a253b37", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9c138b5288a91330", "scanner": "scanner-primary", "fingerprint": "1c082a0b7a253b37", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/railway-deploy.yml"}, "region": {"startLine": 86}}}]}, {"ruleId": "scanner-782c386e203cebb9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "039daafaf2f8b5f1", "scanner": "scanner-primary", "fingerprint": "782c386e203cebb9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ios-build.yml"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-782c386e203cebb9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "5cebcb2bd53f3efe", "scanner": "scanner-primary", "fingerprint": "782c386e203cebb9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ios-build.yml"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-782c386e203cebb9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "039daafaf2f8b5f1", "scanner": "scanner-primary", "fingerprint": "782c386e203cebb9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ios-build.yml"}, "region": {"startLine": 68}}}]}, {"ruleId": "scanner-782c386e203cebb9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "5cebcb2bd53f3efe", "scanner": "scanner-primary", "fingerprint": "782c386e203cebb9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ios-build.yml"}, "region": {"startLine": 71}}}]}, {"ruleId": "scanner-042fe96b125b4ecb", "level": "note", "message": {"text": "Very large file: web-app/components/email-thread-modal.tsx (2141 lines)"}, "properties": {"repobilityId": "6467b7b8b88e83b7", "scanner": "scanner-primary", "fingerprint": "042fe96b125b4ecb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f7e19df64825bfa0", "level": "note", "message": {"text": "Very large file: web-app/components/sidebar.tsx (3226 lines)"}, "properties": {"repobilityId": "a5b5a7e1e66d8cfa", "scanner": "scanner-primary", "fingerprint": "f7e19df64825bfa0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-541345129b7b9037", "level": "note", "message": {"text": "Very large file: web-app/components/organization-settings-modal.tsx (1244 lines)"}, "properties": {"repobilityId": "f3e09e00af761920", "scanner": "scanner-primary", "fingerprint": "541345129b7b9037", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3af63bbaa9fe3904", "level": "note", "message": {"text": "Very large file: web-app/components/task-modal.tsx (3376 lines)"}, "properties": {"repobilityId": "e96eea16230df014", "scanner": "scanner-primary", "fingerprint": "3af63bbaa9fe3904", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3d2ba35535a3a929", "level": "note", "message": {"text": "Very large file: web-app/components/email-inbox-view.tsx (6122 lines)"}, "properties": {"repobilityId": "2c361b7b57f08951", "scanner": "scanner-primary", "fingerprint": "3d2ba35535a3a929", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-34f5f78772574263", "level": "note", "message": {"text": "Very large file: web-app/components/task-list.tsx (1292 lines)"}, "properties": {"repobilityId": "4bf698ec7db2148c", "scanner": "scanner-primary", "fingerprint": "34f5f78772574263", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-16602e98c5a90c49", "level": "note", "message": {"text": "Very large file: web-app/components/email-work-list.tsx (1653 lines)"}, "properties": {"repobilityId": "78233c42efe73545", "scanner": "scanner-primary", "fingerprint": "16602e98c5a90c49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5d18de6f3135f234", "level": "note", "message": {"text": "Very large file: web-app/app/settings/page.tsx (2391 lines)"}, "properties": {"repobilityId": "03be627889fafb3b", "scanner": "scanner-primary", "fingerprint": "5d18de6f3135f234", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-83a140177701278f", "level": "note", "message": {"text": "Very large file: web-app/app/[view]/view-client.tsx (6408 lines)"}, "properties": {"repobilityId": "6aba1b63378bf9c2", "scanner": "scanner-primary", "fingerprint": "83a140177701278f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1b5d1a618e1ef0c7", "level": "note", "message": {"text": "Very large file: web-app/lib/supabase/database.types.ts (1644 lines)"}, "properties": {"repobilityId": "6ee0aa2adc314921", "scanner": "scanner-primary", "fingerprint": "1b5d1a618e1ef0c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-06d62568ab9d1eaf", "level": "note", "message": {"text": "Very large file: web-app/lib/email-inbox/server.ts (5317 lines)"}, "properties": {"repobilityId": "bac3c441a8c6f3bd", "scanner": "scanner-primary", "fingerprint": "06d62568ab9d1eaf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "5f3badebc2dc4ecb", "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": "61a82618fc4d7e17", "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": "69e2336d809bf807", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "fcef7da97dfca8a6", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "a518c1d72ba495a0", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "14e43e0898f95627", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "d66f3bea1e192333", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "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-39bb163e6dc84dd2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/src/routes/proxy.ts:45"}, "properties": {"repobilityId": "8823f2a883d226b8", "scanner": "scanner-primary", "fingerprint": "39bb163e6dc84dd2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-de37d7412366ac92", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/test-auth.js:51"}, "properties": {"repobilityId": "292adbe7e8b26ed8", "scanner": "scanner-primary", "fingerprint": "de37d7412366ac92", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c831c76351e8bc59", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-api-with-auth.mjs:33"}, "properties": {"repobilityId": "5e0b1e56c1a61d94", "scanner": "scanner-primary", "fingerprint": "c831c76351e8bc59", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2c79c74c63ce032e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-api.mjs:38"}, "properties": {"repobilityId": "7eeb21bd572defa2", "scanner": "scanner-primary", "fingerprint": "2c79c74c63ce032e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e6fda54b372aca32", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-api-direct.mjs:9"}, "properties": {"repobilityId": "a50771381dd992fa", "scanner": "scanner-primary", "fingerprint": "e6fda54b372aca32", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3feda9264f2d9391", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/verify-complete-flow.mjs:105"}, "properties": {"repobilityId": "16bdd243063e97fe", "scanner": "scanner-primary", "fingerprint": "3feda9264f2d9391", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-738a140a6978b1aa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-full-flow.mjs:6"}, "properties": {"repobilityId": "8508b89c7f6612da", "scanner": "scanner-primary", "fingerprint": "738a140a6978b1aa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3ca5065ef7a425d7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/check-api.js:12"}, "properties": {"repobilityId": "5b1b8285cb7a1150", "scanner": "scanner-primary", "fingerprint": "3ca5065ef7a425d7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-62f35dc64631302b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-login-api.mjs:4"}, "properties": {"repobilityId": "469157c343bcc7f5", "scanner": "scanner-primary", "fingerprint": "62f35dc64631302b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1c83016d06c2cc69", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-api-authenticated.mjs:41"}, "properties": {"repobilityId": "b7b86e1135a0bb97", "scanner": "scanner-primary", "fingerprint": "1c83016d06c2cc69", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c16ab463721de11a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-dependencies.js:10"}, "properties": {"repobilityId": "bc75f4ab97689481", "scanner": "scanner-primary", "fingerprint": "c16ab463721de11a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b63f35d96db83758", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/simple-dependency-test.js:21"}, "properties": {"repobilityId": "e7cbf3b9e12cc7b9", "scanner": "scanner-primary", "fingerprint": "b63f35d96db83758", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-33019f04a3982871", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-dependencies-basic.js:24"}, "properties": {"repobilityId": "21e715c294d9ff3d", "scanner": "scanner-primary", "fingerprint": "33019f04a3982871", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fb14bd899515ac92", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-basic-api.js:36"}, "properties": {"repobilityId": "0d68ce72e723ee0e", "scanner": "scanner-primary", "fingerprint": "fb14bd899515ac92", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e257ad0545561621", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-auth-refresh.mjs:65"}, "properties": {"repobilityId": "7d7250c45f235ef6", "scanner": "scanner-primary", "fingerprint": "e257ad0545561621", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-761c4c8344b04509", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/test-subtask-completion.js:8"}, "properties": {"repobilityId": "47b1d8100dcd0f62", "scanner": "scanner-primary", "fingerprint": "761c4c8344b04509", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-57520d4f027c4dcb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/scripts/debug-adapter.mjs:63"}, "properties": {"repobilityId": "8ce2fc31aede2cf1", "scanner": "scanner-primary", "fingerprint": "57520d4f027c4dcb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-08eeaaac26b4ec14", "level": "none", "message": {"text": "Commented-code block (5 lines) in web-app/components/email-thread-modal.tsx:436"}, "properties": {"repobilityId": "8b633e6e9d8d4b65", "scanner": "scanner-primary", "fingerprint": "08eeaaac26b4ec14", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ed5a571c3520751", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/email-thread-modal.tsx:192"}, "properties": {"repobilityId": "661837853e11906a", "scanner": "scanner-primary", "fingerprint": "6ed5a571c3520751", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1af68bc26d595a6c", "level": "none", "message": {"text": "Commented-code block (5 lines) in web-app/components/ai-planner-floating-chat.tsx:225"}, "properties": {"repobilityId": "0385044061baf1ac", "scanner": "scanner-primary", "fingerprint": "1af68bc26d595a6c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-086e05729991930f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/ai-planner-floating-chat.tsx:158"}, "properties": {"repobilityId": "a7095f4752bd9cb2", "scanner": "scanner-primary", "fingerprint": "086e05729991930f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2800635b95e813e7", "level": "none", "message": {"text": "Commented-code block (5 lines) in web-app/components/sidebar.tsx:146"}, "properties": {"repobilityId": "ea1a6e2d58de70c4", "scanner": "scanner-primary", "fingerprint": "2800635b95e813e7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a1b66066a47f2a96", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/sidebar.tsx:818"}, "properties": {"repobilityId": "6e352105e4ea103f", "scanner": "scanner-primary", "fingerprint": "a1b66066a47f2a96", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1838733613d84c58", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/email-outbound-composer-modal.tsx:281"}, "properties": {"repobilityId": "9899567cb22d82e1", "scanner": "scanner-primary", "fingerprint": "1838733613d84c58", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f0f3f4a450d9312d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/ai-memory-tab.tsx:129"}, "properties": {"repobilityId": "b11b24f5194d7bb7", "scanner": "scanner-primary", "fingerprint": "f0f3f4a450d9312d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-14f1e4ecdf80f518", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/project-notes-modal.tsx:79"}, "properties": {"repobilityId": "5456ecb01832eb5f", "scanner": "scanner-primary", "fingerprint": "14f1e4ecdf80f518", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4e48c8dd18cd4352", "level": "none", "message": {"text": "Commented-code block (6 lines) in web-app/components/estimate-review-modal.tsx:301"}, "properties": {"repobilityId": "8d4c15df318882f3", "scanner": "scanner-primary", "fingerprint": "4e48c8dd18cd4352", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-52eeffcbf9083c53", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/estimate-review-modal.tsx:173"}, "properties": {"repobilityId": "91433378750fbcd3", "scanner": "scanner-primary", "fingerprint": "52eeffcbf9083c53", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-af9d1a21b15536d9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/task-modal.tsx:613"}, "properties": {"repobilityId": "308ce57103946bc6", "scanner": "scanner-primary", "fingerprint": "af9d1a21b15536d9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2a2178cc41ccdb9c", "level": "none", "message": {"text": "Commented-code block (6 lines) in web-app/components/email-inbox-view.tsx:1680"}, "properties": {"repobilityId": "9a4cbbaf77302a7c", "scanner": "scanner-primary", "fingerprint": "2a2178cc41ccdb9c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4ae88ee4f79f24f3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/email-inbox-view.tsx:2119"}, "properties": {"repobilityId": "22c3ba7cea6eb326", "scanner": "scanner-primary", "fingerprint": "4ae88ee4f79f24f3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c5a0b3bbf0ae5caa", "level": "none", "message": {"text": "Commented-code block (5 lines) in web-app/components/dock-badge-sync.tsx:72"}, "properties": {"repobilityId": "9fde14342c12d010", "scanner": "scanner-primary", "fingerprint": "c5a0b3bbf0ae5caa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-329aa4bfd7b665cf", "level": "none", "message": {"text": "Commented-code block (6 lines) in web-app/components/user-avatar.tsx:107"}, "properties": {"repobilityId": "149b3e59e9f36e78", "scanner": "scanner-primary", "fingerprint": "329aa4bfd7b665cf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-050feb0bc885c664", "level": "none", "message": {"text": "Commented-code block (6 lines) in web-app/components/skeleton-loader.tsx:8"}, "properties": {"repobilityId": "c2b1a555eb2fe0e6", "scanner": "scanner-primary", "fingerprint": "050feb0bc885c664", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-35c66ea697e3191f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/focus-time-organization-panel.tsx:37"}, "properties": {"repobilityId": "39598aabad387c11", "scanner": "scanner-primary", "fingerprint": "35c66ea697e3191f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-35184ed7bfb7529f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/time-tracking-view.tsx:169"}, "properties": {"repobilityId": "9dafb4c2d87a8d72", "scanner": "scanner-primary", "fingerprint": "35184ed7bfb7529f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d451f96d9a25a77f", "level": "none", "message": {"text": "Commented-code block (5 lines) in web-app/components/email-work-list.tsx:543"}, "properties": {"repobilityId": "62f41fef03e8b691", "scanner": "scanner-primary", "fingerprint": "d451f96d9a25a77f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-27c2f2e9f802fa20", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/todoist-integration.tsx:289"}, "properties": {"repobilityId": "b61ffaca7f4c5b0b", "scanner": "scanner-primary", "fingerprint": "27c2f2e9f802fa20", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8d93d6e5c4bae316", "level": "none", "message": {"text": "Commented-code block (5 lines) in web-app/components/tooltip.tsx:177"}, "properties": {"repobilityId": "820c721397dc7416", "scanner": "scanner-primary", "fingerprint": "8d93d6e5c4bae316", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-397f7ad4a90e5cc0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/components/estimates-view.tsx:86"}, "properties": {"repobilityId": "579b3a4b343fc8ab", "scanner": "scanner-primary", "fingerprint": "397f7ad4a90e5cc0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e3306c86eda4ce74", "level": "none", "message": {"text": "Commented-code block (5 lines) in web-app/components/ui/dialog.tsx:41"}, "properties": {"repobilityId": "e88f537ac783fd1a", "scanner": "scanner-primary", "fingerprint": "e3306c86eda4ce74", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-470420219e7efdcb", "level": "none", "message": {"text": "Commented-code block (5 lines) in web-app/app/manifest.ts:3"}, "properties": {"repobilityId": "bf476c30e6a9d490", "scanner": "scanner-primary", "fingerprint": "470420219e7efdcb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-881cda82b79de3ea", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/app/settings/page.tsx:2202"}, "properties": {"repobilityId": "a7f73bba3c47bfe9", "scanner": "scanner-primary", "fingerprint": "881cda82b79de3ea", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a82bfeb18346b2f9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/app/auth/accept-invite/page.tsx:78"}, "properties": {"repobilityId": "f4542c5e7522cbba", "scanner": "scanner-primary", "fingerprint": "a82bfeb18346b2f9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-418829e8c907e924", "level": "note", "message": {"text": "Legacy-named symbol `todoist_import_backup` in web-app/app/api/todoist/connect/route.ts:141"}, "properties": {"repobilityId": "42fc9206c645d145", "scanner": "scanner-primary", "fingerprint": "418829e8c907e924", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-677ecd12ce39060d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/app/api/time-blocks/chat/route.ts:26"}, "properties": {"repobilityId": "90a4bad7d3e03b9c", "scanner": "scanner-primary", "fingerprint": "677ecd12ce39060d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5453f25d7a183fc5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/app/api/tasks/unestimated/route.ts:44"}, "properties": {"repobilityId": "120afd8d394f375a", "scanner": "scanner-primary", "fingerprint": "5453f25d7a183fc5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-07fa31be522b556a", "level": "none", "message": {"text": "Commented-code block (6 lines) in web-app/app/api/mobile/email/spam-exceptions/route.ts:9"}, "properties": {"repobilityId": "555a23cf3ece2fb7", "scanner": "scanner-primary", "fingerprint": "07fa31be522b556a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6a0fa5c8f7dba99e", "level": "none", "message": {"text": "Commented-code block (6 lines) in web-app/app/api/mobile/email/spam-exceptions/[ruleId]/revert/route.ts:9"}, "properties": {"repobilityId": "d0c7000c10834999", "scanner": "scanner-primary", "fingerprint": "6a0fa5c8f7dba99e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-243058e151a4c9ad", "level": "none", "message": {"text": "Commented-code block (7 lines) in web-app/app/api/mobile/email/sync/route.ts:12"}, "properties": {"repobilityId": "e91bad34ed660cae", "scanner": "scanner-primary", "fingerprint": "243058e151a4c9ad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5fd198c73261737a", "level": "none", "message": {"text": "Commented-code block (7 lines) in web-app/app/api/mobile/email/threads/[id]/actions/route.ts:28"}, "properties": {"repobilityId": "56c2284e27878d68", "scanner": "scanner-primary", "fingerprint": "5fd198c73261737a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9eee61e746244d25", "level": "none", "message": {"text": "Commented-code block (5 lines) in web-app/app/api/mobile/email/rules/assistant/route.ts:10"}, "properties": {"repobilityId": "4675bd012c10dba6", "scanner": "scanner-primary", "fingerprint": "9eee61e746244d25", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dbb7a414bf25f8fa", "level": "none", "message": {"text": "Commented-code block (5 lines) in web-app/app/api/mobile/email/trash/empty/route.ts:9"}, "properties": {"repobilityId": "068fc1278d86a867", "scanner": "scanner-primary", "fingerprint": "dbb7a414bf25f8fa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-14fe5c8622fcc971", "level": "none", "message": {"text": "Commented-code block (9 lines) in web-app/app/api/mobile/email/mailboxes/route.ts:35"}, "properties": {"repobilityId": "27091a4b310e8bdb", "scanner": "scanner-primary", "fingerprint": "14fe5c8622fcc971", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a5ad6e53406dc5db", "level": "none", "message": {"text": "Commented-code block (6 lines) in web-app/app/api/mobile/email/mailboxes/[id]/route.ts:9"}, "properties": {"repobilityId": "0f1cba98dad50ee0", "scanner": "scanner-primary", "fingerprint": "a5ad6e53406dc5db", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5ecb2e92256579ca", "level": "none", "message": {"text": "Commented-code block (5 lines) in web-app/app/[view]/view-client.tsx:106"}, "properties": {"repobilityId": "2f33e004cad6774f", "scanner": "scanner-primary", "fingerprint": "5ecb2e92256579ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-53895ca7455d3923", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/app/[view]/view-client.tsx:942"}, "properties": {"repobilityId": "c1966fb29b0dae86", "scanner": "scanner-primary", "fingerprint": "53895ca7455d3923", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b7b5a9e83e20b163", "level": "none", "message": {"text": "Commented-code block (5 lines) in web-app/lib/email-thread-ui.ts:76"}, "properties": {"repobilityId": "4bccf1d0b7af2e26", "scanner": "scanner-primary", "fingerprint": "b7b5a9e83e20b163", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-74bce9ba3c9a5cc7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-agent/providers.ts:90"}, "properties": {"repobilityId": "51607801f4c7f810", "scanner": "scanner-primary", "fingerprint": "74bce9ba3c9a5cc7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8fba14400364ac57", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-memory/write.ts:155"}, "properties": {"repobilityId": "01eded55fa69e108", "scanner": "scanner-primary", "fingerprint": "8fba14400364ac57", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2738fb8312c9aa36", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-memory/playbook.ts:133"}, "properties": {"repobilityId": "2b55707427c2c58e", "scanner": "scanner-primary", "fingerprint": "2738fb8312c9aa36", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fd034b50b49e3223", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/api/client.ts:22"}, "properties": {"repobilityId": "d7d8ab632e12cbf7", "scanner": "scanner-primary", "fingerprint": "fd034b50b49e3223", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ee91db81bc653055", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-planner/auto-section.ts:193"}, "properties": {"repobilityId": "4a3c9228a7ab4c9f", "scanner": "scanner-primary", "fingerprint": "ee91db81bc653055", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-50fe0924da9be631", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-planner/server.ts:210"}, "properties": {"repobilityId": "c9f49f396d06058d", "scanner": "scanner-primary", "fingerprint": "50fe0924da9be631", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b75caea3ab4f111d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/daily-plan/server.ts:162"}, "properties": {"repobilityId": "a3b6554deb585a94", "scanner": "scanner-primary", "fingerprint": "b75caea3ab4f111d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3420c62a9f286292", "level": "note", "message": {"text": "Legacy-named symbol `todoist_import_backup` in web-app/lib/supabase/database.types.ts:1007"}, "properties": {"repobilityId": "30d3c1f4f6c6d538", "scanner": "scanner-primary", "fingerprint": "3420c62a9f286292", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1fc57da40f45f093", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/services/todoist-client.ts:49"}, "properties": {"repobilityId": "9cc1b399adad2aeb", "scanner": "scanner-primary", "fingerprint": "1fc57da40f45f093", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ef8dd5a46f8cfdc9", "level": "note", "message": {"text": "Legacy-named symbol `todoist_import_backup` in web-app/lib/services/todoist-sync.ts:724"}, "properties": {"repobilityId": "ef56bfebc515880a", "scanner": "scanner-primary", "fingerprint": "ef8dd5a46f8cfdc9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-26e4d09db945e893", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-core/embeddings.ts:9"}, "properties": {"repobilityId": "a174ab3327965b89", "scanner": "scanner-primary", "fingerprint": "26e4d09db945e893", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-08ee2e6f55d41001", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/ai-estimator/server.ts:135"}, "properties": {"repobilityId": "bd0615d7ab56cf76", "scanner": "scanner-primary", "fingerprint": "08ee2e6f55d41001", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f8c088b73d6c7042", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/email-inbox/ai.ts:883"}, "properties": {"repobilityId": "85c5ee34274d5c60", "scanner": "scanner-primary", "fingerprint": "f8c088b73d6c7042", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bc4b202bc5f113fd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/email-inbox/provider.ts:294"}, "properties": {"repobilityId": "0ee5f529542ecf9a", "scanner": "scanner-primary", "fingerprint": "bc4b202bc5f113fd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-38edf9da83c55200", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/email-inbox/rule-assistant.ts:285"}, "properties": {"repobilityId": "ee70ebf5e04e7a49", "scanner": "scanner-primary", "fingerprint": "38edf9da83c55200", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-792ef02a8147f89b", "level": "none", "message": {"text": "Commented-code block (8 lines) in web-app/lib/email-inbox/server.ts:1904"}, "properties": {"repobilityId": "e741307f9fc9f942", "scanner": "scanner-primary", "fingerprint": "792ef02a8147f89b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-264346b0c0abff0d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web-app/lib/email-inbox/spam-exception.ts:228"}, "properties": {"repobilityId": "12a82e4483098542", "scanner": "scanner-primary", "fingerprint": "264346b0c0abff0d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2d6ffa20a9f1093b", "level": "note", "message": {"text": "24 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "880bbf29bf1f87e1", "scanner": "scanner-primary", "fingerprint": "2d6ffa20a9f1093b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-016151b08ec8eaaf", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:3244/api/database (web-app/scripts/test-api-endpoint.mjs:9)"}, "properties": {"repobilityId": "e5c5c7a5a203ce97", "scanner": "scanner-primary", "fingerprint": "016151b08ec8eaaf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-759e180193c1c3d9", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-api-with-auth.mjs:33)"}, "properties": {"repobilityId": "90b75d3713ce35da", "scanner": "scanner-primary", "fingerprint": "759e180193c1c3d9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-92cc154fc3300f66", "level": "error", "message": {"text": "Dangling fetch: POST http://127.0.0.1:3244/api/auth/login (web-app/scripts/test-api-direct.mjs:9)"}, "properties": {"repobilityId": "bfe4c513c658aa58", "scanner": "scanner-primary", "fingerprint": "92cc154fc3300f66", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eba1a436bf096025", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:3244/api/database (web-app/scripts/test-api-direct.mjs:33)"}, "properties": {"repobilityId": "eb2a5d815ba06c5a", "scanner": "scanner-primary", "fingerprint": "eba1a436bf096025", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a8271175ac39e849", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3244/api/auth/login (web-app/scripts/verify-complete-flow.mjs:105)"}, "properties": {"repobilityId": "aa0c1e51dd292fc9", "scanner": "scanner-primary", "fingerprint": "a8271175ac39e849", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f8e6e7050236ef49", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3244/api/auth/login (web-app/scripts/test-full-flow.mjs:6)"}, "properties": {"repobilityId": "bef33789931ad5da", "scanner": "scanner-primary", "fingerprint": "f8e6e7050236ef49", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0e7c5f5a2636b49f", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-full-flow.mjs:33)"}, "properties": {"repobilityId": "809fa8a926a20c50", "scanner": "scanner-primary", "fingerprint": "0e7c5f5a2636b49f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bdda2cca7d55d77a", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/check-api.js:8)"}, "properties": {"repobilityId": "94f52cb8c9b204e2", "scanner": "scanner-primary", "fingerprint": "bdda2cca7d55d77a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f6cd6b3662b65a79", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/check-api.js:12)"}, "properties": {"repobilityId": "2e06a17597a10848", "scanner": "scanner-primary", "fingerprint": "f6cd6b3662b65a79", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a87ffe9167e44a9c", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3244/api/tasks/${task.id} (web-app/scripts/check-api.js:28)"}, "properties": {"repobilityId": "2f5facdb0daf01f2", "scanner": "scanner-primary", "fingerprint": "a87ffe9167e44a9c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b74ba2d7610d6025", "level": "error", "message": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${task.id} (web-app/scripts/check-api.js:32)"}, "properties": {"repobilityId": "df6f716b66b0bd6c", "scanner": "scanner-primary", "fingerprint": "b74ba2d7610d6025", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-999e2d6afecf23c0", "level": "error", "message": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${task.id} (web-app/scripts/check-api.js:45)"}, "properties": {"repobilityId": "39f18fddab4612fd", "scanner": "scanner-primary", "fingerprint": "999e2d6afecf23c0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-51d785e4cbef96e2", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3244/api/auth/login (web-app/scripts/test-login-api.mjs:4)"}, "properties": {"repobilityId": "f88283f5ce5be26e", "scanner": "scanner-primary", "fingerprint": "51d785e4cbef96e2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fb5507ed5730608d", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-api-authenticated.mjs:41)"}, "properties": {"repobilityId": "0079251a1f222056", "scanner": "scanner-primary", "fingerprint": "fb5507ed5730608d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f45764acb72ec947", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-dependencies.js:10)"}, "properties": {"repobilityId": "773d177236db8ab1", "scanner": "scanner-primary", "fingerprint": "f45764acb72ec947", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6c9f316fd17fd608", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-dependencies.js:26)"}, "properties": {"repobilityId": "57b48d275504ecde", "scanner": "scanner-primary", "fingerprint": "6c9f316fd17fd608", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4297037dd049f8e0", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-dependencies.js:43)"}, "properties": {"repobilityId": "024c6c9b070b4ba0", "scanner": "scanner-primary", "fingerprint": "4297037dd049f8e0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ecd912aae9d14a0b", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-dependencies.js:63)"}, "properties": {"repobilityId": "4a2afc7210060a4e", "scanner": "scanner-primary", "fingerprint": "ecd912aae9d14a0b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-30ac234fffaa42a9", "level": "error", "message": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies.js:81)"}, "properties": {"repobilityId": "2b5f43c7d3ea7cfe", "scanner": "scanner-primary", "fingerprint": "30ac234fffaa42a9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4f3589ebd7ed7303", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies.js:94)"}, "properties": {"repobilityId": "e656b593603ca855", "scanner": "scanner-primary", "fingerprint": "4f3589ebd7ed7303", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a94166c8bc2c3ea9", "level": "error", "message": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskA.id} (web-app/scripts/test-dependencies.js:104)"}, "properties": {"repobilityId": "cdc8fcd6cfbbbbd4", "scanner": "scanner-primary", "fingerprint": "a94166c8bc2c3ea9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-29960b5b7a0a1ffa", "level": "error", "message": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies.js:112)"}, "properties": {"repobilityId": "72b3e6258b9f156a", "scanner": "scanner-primary", "fingerprint": "29960b5b7a0a1ffa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b7430b0abbdb3a1f", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies.js:119)"}, "properties": {"repobilityId": "c896ae3dc0db9818", "scanner": "scanner-primary", "fingerprint": "b7430b0abbdb3a1f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bd9476edfd43eced", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-dependencies.js:129)"}, "properties": {"repobilityId": "ebeac786b00f2830", "scanner": "scanner-primary", "fingerprint": "bd9476edfd43eced", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ba54ac6007127859", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-dependencies.js:145)"}, "properties": {"repobilityId": "dbc194dcde7e04cc", "scanner": "scanner-primary", "fingerprint": "ba54ac6007127859", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e8b04ccd7db1af3e", "level": "error", "message": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskA.id} (web-app/scripts/test-dependencies.js:155)"}, "properties": {"repobilityId": "0a5c62320f07052c", "scanner": "scanner-primary", "fingerprint": "e8b04ccd7db1af3e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5711b1e09f8d0bb6", "level": "error", "message": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies.js:156)"}, "properties": {"repobilityId": "81ac1d2facb275ad", "scanner": "scanner-primary", "fingerprint": "5711b1e09f8d0bb6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-095062d2b0e5cbc3", "level": "error", "message": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskC.id} (web-app/scripts/test-dependencies.js:157)"}, "properties": {"repobilityId": "ef0fa1ea63422e10", "scanner": "scanner-primary", "fingerprint": "095062d2b0e5cbc3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8da967ff5f909794", "level": "error", "message": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskD.id} (web-app/scripts/test-dependencies.js:158)"}, "properties": {"repobilityId": "0156e99b970f4e4e", "scanner": "scanner-primary", "fingerprint": "8da967ff5f909794", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3c5a098f0c9ac2c3", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/simple-dependency-test.js:9)"}, "properties": {"repobilityId": "2738093d4e9c37f8", "scanner": "scanner-primary", "fingerprint": "3c5a098f0c9ac2c3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-97ac56413c1b2ca2", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/simple-dependency-test.js:21)"}, "properties": {"repobilityId": "9610c2705349ab61", "scanner": "scanner-primary", "fingerprint": "97ac56413c1b2ca2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-250109c1e7545ec8", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/simple-dependency-test.js:35)"}, "properties": {"repobilityId": "56c9c0adaeedabbd", "scanner": "scanner-primary", "fingerprint": "250109c1e7545ec8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fd133244ee60fc71", "level": "error", "message": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/simple-dependency-test.js:52)"}, "properties": {"repobilityId": "1498742d547ac975", "scanner": "scanner-primary", "fingerprint": "fd133244ee60fc71", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-41e750ba48294093", "level": "error", "message": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskA.id} (web-app/scripts/simple-dependency-test.js:68)"}, "properties": {"repobilityId": "d8fe2c0831d2a82a", "scanner": "scanner-primary", "fingerprint": "41e750ba48294093", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-26fa3f145d4b34b2", "level": "error", "message": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/simple-dependency-test.js:77)"}, "properties": {"repobilityId": "6bd967d3f9b33629", "scanner": "scanner-primary", "fingerprint": "26fa3f145d4b34b2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d46fbd45b64883cb", "level": "error", "message": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskA.id} (web-app/scripts/simple-dependency-test.js:93)"}, "properties": {"repobilityId": "262d13a4fc3c1224", "scanner": "scanner-primary", "fingerprint": "d46fbd45b64883cb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-edb9d27d7c58394b", "level": "error", "message": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/simple-dependency-test.js:94)"}, "properties": {"repobilityId": "edad5fc32e9b9576", "scanner": "scanner-primary", "fingerprint": "edb9d27d7c58394b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-155f5904fe34e8e7", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-dependencies-basic.js:11)"}, "properties": {"repobilityId": "d9d99ff21383aac8", "scanner": "scanner-primary", "fingerprint": "155f5904fe34e8e7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-db2eab5217390e12", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-dependencies-basic.js:24)"}, "properties": {"repobilityId": "c9b9601c875780ff", "scanner": "scanner-primary", "fingerprint": "db2eab5217390e12", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-870753ded90425c3", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-dependencies-basic.js:39)"}, "properties": {"repobilityId": "c820c93224c18fc1", "scanner": "scanner-primary", "fingerprint": "870753ded90425c3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7e486dd5c4483fcd", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3244/today (web-app/scripts/test-dependencies-basic.js:50)"}, "properties": {"repobilityId": "7e4cd09a961ca4b9", "scanner": "scanner-primary", "fingerprint": "7e486dd5c4483fcd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c5f233ac10621bfb", "level": "error", "message": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskA.id} (web-app/scripts/test-dependencies-basic.js:57)"}, "properties": {"repobilityId": "069d69aa33cbebb5", "scanner": "scanner-primary", "fingerprint": "c5f233ac10621bfb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e69d7b0f7da9630f", "level": "error", "message": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies-basic.js:69)"}, "properties": {"repobilityId": "b1ccf32187ff5799", "scanner": "scanner-primary", "fingerprint": "e69d7b0f7da9630f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0faba7c4daef24fa", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-dependencies-basic.js:85)"}, "properties": {"repobilityId": "a8009b747d864cf2", "scanner": "scanner-primary", "fingerprint": "0faba7c4daef24fa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d95c5bc702c223a7", "level": "error", "message": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskA.id} (web-app/scripts/test-dependencies-basic.js:96)"}, "properties": {"repobilityId": "dbe275d533aff962", "scanner": "scanner-primary", "fingerprint": "d95c5bc702c223a7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cfd4fd798fc4cdf7", "level": "error", "message": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${taskB.id} (web-app/scripts/test-dependencies-basic.js:97)"}, "properties": {"repobilityId": "83fda1ea06ba9c98", "scanner": "scanner-primary", "fingerprint": "cfd4fd798fc4cdf7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a52e68039c70628c", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-basic-api.js:9)"}, "properties": {"repobilityId": "03dcab068e243737", "scanner": "scanner-primary", "fingerprint": "a52e68039c70628c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a11a53640720a24c", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-basic-api.js:55)"}, "properties": {"repobilityId": "3776e9155a70a2b2", "scanner": "scanner-primary", "fingerprint": "a11a53640720a24c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-848250fb577be3d7", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3244/api/auth-debug (web-app/scripts/test-auth-refresh.mjs:65)"}, "properties": {"repobilityId": "9a966fca2c3d0089", "scanner": "scanner-primary", "fingerprint": "848250fb577be3d7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-93ca0ad17c5e2aa0", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-subtask-completion.js:8)"}, "properties": {"repobilityId": "91a3d95c544fb3f4", "scanner": "scanner-primary", "fingerprint": "93ca0ad17c5e2aa0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-02f940292d75e376", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3244/api/tasks (web-app/scripts/test-subtask-completion.js:29)"}, "properties": {"repobilityId": "7b71abc624cdf52b", "scanner": "scanner-primary", "fingerprint": "02f940292d75e376", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3df58f6cdaf5aeb7", "level": "error", "message": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${subtasks[0].id} (web-app/scripts/test-subtask-completion.js:49)"}, "properties": {"repobilityId": "760a65df8ffd8413", "scanner": "scanner-primary", "fingerprint": "3df58f6cdaf5aeb7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-24405516465384a8", "level": "error", "message": {"text": "Dangling fetch: PUT http://localhost:3244/api/tasks/${parentTask.id} (web-app/scripts/test-subtask-completion.js:59)"}, "properties": {"repobilityId": "25026bd351fc3a94", "scanner": "scanner-primary", "fingerprint": "24405516465384a8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ed78db652ca06db9", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3244/api/database (web-app/scripts/test-subtask-completion.js:72)"}, "properties": {"repobilityId": "3b5eacba853d479b", "scanner": "scanner-primary", "fingerprint": "ed78db652ca06db9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9db98b4b372e00b7", "level": "error", "message": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${subtask.id} (web-app/scripts/test-subtask-completion.js:85)"}, "properties": {"repobilityId": "5400b27a0c6a1d48", "scanner": "scanner-primary", "fingerprint": "9db98b4b372e00b7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fd242ab3da650fda", "level": "error", "message": {"text": "Dangling fetch: DELETE http://localhost:3244/api/tasks/${parentTask.id} (web-app/scripts/test-subtask-completion.js:87)"}, "properties": {"repobilityId": "46d9e2b51c6d99f4", "scanner": "scanner-primary", "fingerprint": "fd242ab3da650fda", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b34a50e14a19a951", "level": "error", "message": {"text": "Dangling fetch: POST http://127.0.0.1:3244/api/auth/login (web-app/scripts/debug-adapter.mjs:63)"}, "properties": {"repobilityId": "24509aaeebaa38be", "scanner": "scanner-primary", "fingerprint": "b34a50e14a19a951", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d4dad2eab2220363", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:3244/api/database (web-app/scripts/debug-adapter.mjs:75)"}, "properties": {"repobilityId": "2304ae18ec1e6193", "scanner": "scanner-primary", "fingerprint": "d4dad2eab2220363", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3061453e692858d7", "level": "error", "message": {"text": "Dangling fetch: GET /api/email/threads/${threadId} (web-app/components/email-thread-modal.tsx:192)"}, "properties": {"repobilityId": "64d2b6b7b1ba064c", "scanner": "scanner-primary", "fingerprint": "3061453e692858d7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f91fc6a5c865c6fb", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/threads/${threadId}/projects (web-app/components/email-thread-modal.tsx:704)"}, "properties": {"repobilityId": "aa732b2067fb13d7", "scanner": "scanner-primary", "fingerprint": "f91fc6a5c865c6fb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-170efadf80bd04db", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/email/threads/${threadId}/projects (web-app/components/email-thread-modal.tsx:730)"}, "properties": {"repobilityId": "584a99cac5f132a6", "scanner": "scanner-primary", "fingerprint": "170efadf80bd04db", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9a18385cab00ae83", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/threads/${threadId}/tasks (web-app/components/email-thread-modal.tsx:756)"}, "properties": {"repobilityId": "081c47f46da0887a", "scanner": "scanner-primary", "fingerprint": "9a18385cab00ae83", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9103c01dd84da806", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/tasks/${taskId} (web-app/components/email-thread-modal.tsx:793)"}, "properties": {"repobilityId": "874d072f7f83b8e2", "scanner": "scanner-primary", "fingerprint": "9103c01dd84da806", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5167aa607c580f99", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/email/reply-drafts/${selectedReplyDraftId} (web-app/components/email-thread-modal.tsx:828)"}, "properties": {"repobilityId": "d6060c2900dd1d21", "scanner": "scanner-primary", "fingerprint": "5167aa607c580f99", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-948c94b88646c98c", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/reply-drafts/${draft.id}/schedule (web-app/components/email-thread-modal.tsx:897)"}, "properties": {"repobilityId": "8dd0deb1f3835d85", "scanner": "scanner-primary", "fingerprint": "948c94b88646c98c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-aa07d716b729d456", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/threads/${threadId}/reply/generate (web-app/components/email-thread-modal.tsx:933)"}, "properties": {"repobilityId": "a4a2e1ac06a55afa", "scanner": "scanner-primary", "fingerprint": "aa07d716b729d456", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7eadddf7094642da", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/threads/${threadId}/actions (web-app/components/email-thread-modal.tsx:975)"}, "properties": {"repobilityId": "398091ae86493d4c", "scanner": "scanner-primary", "fingerprint": "7eadddf7094642da", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d88fb639cd50552e", "level": "error", "message": {"text": "Dangling fetch: GET /api/email/reply-drafts (web-app/components/email-drafts-view.tsx:43)"}, "properties": {"repobilityId": "e52d40355b1a57da", "scanner": "scanner-primary", "fingerprint": "d88fb639cd50552e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9b0dd50c2dc1acee", "level": "error", "message": {"text": "Dangling fetch: GET /api/ai-planner/session/${existing} (web-app/components/ai-planner-floating-chat.tsx:158)"}, "properties": {"repobilityId": "a4f678e5c849deb0", "scanner": "scanner-primary", "fingerprint": "9b0dd50c2dc1acee", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6343522bef3b73a4", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai-agent/chat (web-app/components/ai-planner-floating-chat.tsx:189)"}, "properties": {"repobilityId": "b94db323f8f43076", "scanner": "scanner-primary", "fingerprint": "6343522bef3b73a4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8aa6010f0e19a683", "level": "error", "message": {"text": "Dangling fetch: POST /api/voice/transcribe (web-app/components/ai-planner-floating-chat.tsx:280)"}, "properties": {"repobilityId": "de6282ebb762851c", "scanner": "scanner-primary", "fingerprint": "8aa6010f0e19a683", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ac615e1b5d21abe7", "level": "error", "message": {"text": "Dangling fetch: POST /api/user-section-preferences (web-app/components/section-view.tsx:134)"}, "properties": {"repobilityId": "d3f45dd8f43fbad4", "scanner": "scanner-primary", "fingerprint": "ac615e1b5d21abe7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c342294862043107", "level": "error", "message": {"text": "Dangling fetch: GET /api/email/senders/history?email=${encodeURIComponent(senderEmail)} (web-app/components/sender-history-modal.tsx:52)"}, "properties": {"repobilityId": "9f31d3f17027ecfc", "scanner": "scanner-primary", "fingerprint": "c342294862043107", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3c17c436e248ad28", "level": "error", "message": {"text": "Dangling fetch: GET /api/email/storage (web-app/components/sidebar.tsx:435)"}, "properties": {"repobilityId": "9675e726eadfdb25", "scanner": "scanner-primary", "fingerprint": "3c17c436e248ad28", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5ee2e3aa4f423675", "level": "error", "message": {"text": "Dangling fetch: GET /api/tasks/unestimated?total=1 (web-app/components/sidebar.tsx:479)"}, "properties": {"repobilityId": "f56852128b9e8d7d", "scanner": "scanner-primary", "fingerprint": "5ee2e3aa4f423675", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5d5098d0a0301dd7", "level": "error", "message": {"text": "Dangling fetch: GET /api/calendar/token (web-app/components/sidebar.tsx:704)"}, "properties": {"repobilityId": "46690e45a67f3810", "scanner": "scanner-primary", "fingerprint": "5d5098d0a0301dd7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-656a12ceebe360ed", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/time/current (web-app/components/sidebar.tsx:718)"}, "properties": {"repobilityId": "54728b11d86d321b", "scanner": "scanner-primary", "fingerprint": "656a12ceebe360ed", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7a6bd4dad8df0b84", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/time/entries (web-app/components/sidebar.tsx:797)"}, "properties": {"repobilityId": "68ede28d85b14d7d", "scanner": "scanner-primary", "fingerprint": "7a6bd4dad8df0b84", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-78984b2fb5cc68c7", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/v1/time/entries/${currentTimerEntryId} (web-app/components/sidebar.tsx:818)"}, "properties": {"repobilityId": "3b20bf07974f5dd1", "scanner": "scanner-primary", "fingerprint": "78984b2fb5cc68c7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-144f40379bcc834a", "level": "error", "message": {"text": "Dangling fetch: GET /api/email/folders (web-app/components/sidebar.tsx:938)"}, "properties": {"repobilityId": "d7a19e2527314d32", "scanner": "scanner-primary", "fingerprint": "144f40379bcc834a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-db16699b5bb619f8", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/logout (web-app/components/sidebar.tsx:1001)"}, "properties": {"repobilityId": "8458cfb436294265", "scanner": "scanner-primary", "fingerprint": "db16699b5bb619f8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6cc68097e6be7a54", "level": "error", "message": {"text": "Dangling fetch: POST /api/resend-invite (web-app/components/sidebar.tsx:1012)"}, "properties": {"repobilityId": "d5611ee22f382c5f", "scanner": "scanner-primary", "fingerprint": "6cc68097e6be7a54", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ceee26759ab3f925", "level": "error", "message": {"text": "Dangling fetch: POST /api/cancel-invite (web-app/components/sidebar.tsx:1048)"}, "properties": {"repobilityId": "1a7bf7641bde44f3", "scanner": "scanner-primary", "fingerprint": "ceee26759ab3f925", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-95038f2f316e74c5", "level": "error", "message": {"text": "Dangling fetch: GET /api/tasks/unestimated?total=1 (web-app/components/estimate-review-nudge.tsx:39)"}, "properties": {"repobilityId": "5427285bc048e1be", "scanner": "scanner-primary", "fingerprint": "95038f2f316e74c5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-008a3dbf5f4117d8", "level": "error", "message": {"text": "Dangling fetch: POST /api/attachments/upload (web-app/components/email-outbound-composer-modal.tsx:307)"}, "properties": {"repobilityId": "882a51d4774e2879", "scanner": "scanner-primary", "fingerprint": "008a3dbf5f4117d8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dfcce9bb6ff018e2", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/outbound-drafts/${draft.id}/send (web-app/components/email-outbound-composer-modal.tsx:397)"}, "properties": {"repobilityId": "d43a3d1eeca3f4ca", "scanner": "scanner-primary", "fingerprint": "dfcce9bb6ff018e2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2e7531174e295db3", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/outbound-drafts/${draft.id}/schedule (web-app/components/email-outbound-composer-modal.tsx:434)"}, "properties": {"repobilityId": "2dd5fbfebda5f258", "scanner": "scanner-primary", "fingerprint": "2e7531174e295db3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4d4e4b8ec20d3d5c", "level": "error", "message": {"text": "Dangling fetch: GET /api/organizations/${organization.id}/api-keys (web-app/components/organization-settings-modal.tsx:212)"}, "properties": {"repobilityId": "9449d6520c8f8555", "scanner": "scanner-primary", "fingerprint": "4d4e4b8ec20d3d5c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8e70ce0ca715d180", "level": "error", "message": {"text": "Dangling fetch: POST /api/organizations/${organization.id}/api-keys (web-app/components/organization-settings-modal.tsx:245)"}, "properties": {"repobilityId": "4d0c75a335117a97", "scanner": "scanner-primary", "fingerprint": "8e70ce0ca715d180", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7dfef06541fef7dd", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/organizations/${organization.id}/api-keys/${id} (web-app/components/organization-settings-modal.tsx:279)"}, "properties": {"repobilityId": "4164e3474e2dac16", "scanner": "scanner-primary", "fingerprint": "7dfef06541fef7dd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-30116c7abaa22170", "level": "error", "message": {"text": "Dangling fetch: GET /api/ai-memory/memories (web-app/components/ai-memory-tab.tsx:78)"}, "properties": {"repobilityId": "4876837bc075a41f", "scanner": "scanner-primary", "fingerprint": "30116c7abaa22170", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4831731ecf968047", "level": "error", "message": {"text": "Dangling fetch: PUT /api/ai-memory/memories/${m.id} (web-app/components/ai-memory-tab.tsx:151)"}, "properties": {"repobilityId": "30bef3b7e76616a5", "scanner": "scanner-primary", "fingerprint": "4831731ecf968047", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e6206a50544f9e79", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/ai-memory/memories/${m.id} (web-app/components/ai-memory-tab.tsx:165)"}, "properties": {"repobilityId": "92a21daa64099ee4", "scanner": "scanner-primary", "fingerprint": "e6206a50544f9e79", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fb3c959c3d40800a", "level": "error", "message": {"text": "Dangling fetch: GET /api/sync/comments?projectId=${projectId} (web-app/components/project-notes-modal.tsx:79)"}, "properties": {"repobilityId": "715bc390e73bef4e", "scanner": "scanner-primary", "fingerprint": "fb3c959c3d40800a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bfb9caff76b05bec", "level": "error", "message": {"text": "Dangling fetch: POST /api/sync/comments (web-app/components/project-notes-modal.tsx:137)"}, "properties": {"repobilityId": "41404d75ae0784bd", "scanner": "scanner-primary", "fingerprint": "bfb9caff76b05bec", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-242122901b5a4c77", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/rules/assistant (web-app/components/email-rules-panel.tsx:202)"}, "properties": {"repobilityId": "d1dac1242d848caf", "scanner": "scanner-primary", "fingerprint": "242122901b5a4c77", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9ff1bd9e95e6f959", "level": "error", "message": {"text": "Dangling fetch: GET /api/tasks/unestimated?${params.toString()} (web-app/components/estimate-review-modal.tsx:159)"}, "properties": {"repobilityId": "a2c3def7dd7ab4e9", "scanner": "scanner-primary", "fingerprint": "9ff1bd9e95e6f959", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-028763b045e20188", "level": "error", "message": {"text": "Dangling fetch: POST /api/tasks/estimate/bulk (web-app/components/estimate-review-modal.tsx:173)"}, "properties": {"repobilityId": "8646a5755b235bcd", "scanner": "scanner-primary", "fingerprint": "028763b045e20188", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dcfe792a817ceee2", "level": "error", "message": {"text": "Dangling fetch: POST /api/tasks/estimate/accept (web-app/components/estimate-review-modal.tsx:226)"}, "properties": {"repobilityId": "2aef155f792f5e2c", "scanner": "scanner-primary", "fingerprint": "dcfe792a817ceee2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cb21389eba0037de", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/tasks/${current.id} (web-app/components/estimate-review-modal.tsx:284)"}, "properties": {"repobilityId": "a4f97a412921b42f", "scanner": "scanner-primary", "fingerprint": "cb21389eba0037de", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0997fa48e7ea8a12", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/tasks/${current.id} (web-app/components/estimate-review-modal.tsx:316)"}, "properties": {"repobilityId": "dcef9f8f3accfafa", "scanner": "scanner-primary", "fingerprint": "0997fa48e7ea8a12", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1dca8ccb773c5bee", "level": "error", "message": {"text": "Dangling fetch: PUT /api/tasks/${current.id} (web-app/components/estimate-review-modal.tsx:326)"}, "properties": {"repobilityId": "b9b23f159e9855ac", "scanner": "scanner-primary", "fingerprint": "1dca8ccb773c5bee", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3966daf9fb5db162", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/projects/${projectId} (web-app/components/estimate-review-modal.tsx:372)"}, "properties": {"repobilityId": "7d78db0c406ebe17", "scanner": "scanner-primary", "fingerprint": "3966daf9fb5db162", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1771beae0f704f17", "level": "error", "message": {"text": "Dangling fetch: POST /api/attachments/upload (web-app/components/task-modal.tsx:613)"}, "properties": {"repobilityId": "a1f99926e809a7ae", "scanner": "scanner-primary", "fingerprint": "1771beae0f704f17", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cd7862dbdf120f7b", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/attachments/${attachmentId} (web-app/components/task-modal.tsx:652)"}, "properties": {"repobilityId": "37d8b43d4adea326", "scanner": "scanner-primary", "fingerprint": "cd7862dbdf120f7b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-14084b7950def351", "level": "error", "message": {"text": "Dangling fetch: POST /api/projects (web-app/components/task-modal.tsx:729)"}, "properties": {"repobilityId": "42d9a187b320b5b2", "scanner": "scanner-primary", "fingerprint": "14084b7950def351", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f8059e8f2a666d48", "level": "error", "message": {"text": "Dangling fetch: POST /api/tags (web-app/components/task-modal.tsx:790)"}, "properties": {"repobilityId": "293a7eb311f6004e", "scanner": "scanner-primary", "fingerprint": "f8059e8f2a666d48", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3ed65358da6407e6", "level": "error", "message": {"text": "Dangling fetch: POST /api/tasks (web-app/components/task-modal.tsx:1260)"}, "properties": {"repobilityId": "e087684e8b7fba88", "scanner": "scanner-primary", "fingerprint": "3ed65358da6407e6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-30c15f3119a1adb0", "level": "error", "message": {"text": "Dangling fetch: PUT /api/tasks/${subtask.id} (web-app/components/task-modal.tsx:1330)"}, "properties": {"repobilityId": "4f04d0abdf6a3718", "scanner": "scanner-primary", "fingerprint": "30c15f3119a1adb0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-193eb7b8c4a11340", "level": "error", "message": {"text": "Dangling fetch: PUT /api/tasks/${subtask.id} (web-app/components/task-modal.tsx:1345)"}, "properties": {"repobilityId": "d053be4dcf2b3504", "scanner": "scanner-primary", "fingerprint": "193eb7b8c4a11340", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6c64e45e59492e9b", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/tasks/${subtaskToDelete.id} (web-app/components/task-modal.tsx:1369)"}, "properties": {"repobilityId": "bb7747a917c44255", "scanner": "scanner-primary", "fingerprint": "6c64e45e59492e9b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-aaaca16500538908", "level": "error", "message": {"text": "Dangling fetch: POST /api/tasks/estimate (web-app/components/task-modal.tsx:2163)"}, "properties": {"repobilityId": "3691a8457ad06c6f", "scanner": "scanner-primary", "fingerprint": "aaaca16500538908", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e1a936a26096b3ed", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/threads/${item.id}/actions (web-app/components/email-inbox-view.tsx:1935)"}, "properties": {"repobilityId": "5052eca313237634", "scanner": "scanner-primary", "fingerprint": "e1a936a26096b3ed", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bdcbd10dd93eb6f9", "level": "error", "message": {"text": "Dangling fetch: GET /api/email/threads/${selectedThreadId} (web-app/components/email-inbox-view.tsx:2119)"}, "properties": {"repobilityId": "32e326c3a6d5b194", "scanner": "scanner-primary", "fingerprint": "bdcbd10dd93eb6f9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cf7dcf6ccbfac6d6", "level": "error", "message": {"text": "Dangling fetch: GET /api/email/mailboxes (web-app/components/email-inbox-view.tsx:2228)"}, "properties": {"repobilityId": "f6b37646bc113f52", "scanner": "scanner-primary", "fingerprint": "cf7dcf6ccbfac6d6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-39cc8dbab6dd018f", "level": "error", "message": {"text": "Dangling fetch: GET /api/email/inbox (web-app/components/email-inbox-view.tsx:2231)"}, "properties": {"repobilityId": "0748fea333c86e64", "scanner": "scanner-primary", "fingerprint": "39cc8dbab6dd018f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fa1c3285b4d1f5e5", "level": "error", "message": {"text": "Dangling fetch: GET /api/email/reply-drafts (web-app/components/email-inbox-view.tsx:2254)"}, "properties": {"repobilityId": "ca45b15f7fd92834", "scanner": "scanner-primary", "fingerprint": "fa1c3285b4d1f5e5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8c77d1fe34165cb6", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/mailboxes/sync-due (web-app/components/email-inbox-view.tsx:2331)"}, "properties": {"repobilityId": "0987bc3d12057f94", "scanner": "scanner-primary", "fingerprint": "8c77d1fe34165cb6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-98081c91a7eec979", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/mailboxes/${mailbox.id}/sync (web-app/components/email-inbox-view.tsx:2450)"}, "properties": {"repobilityId": "7657f228b84a6f84", "scanner": "scanner-primary", "fingerprint": "98081c91a7eec979", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8123994ac9448999", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/mailboxes/${mailboxId}/sync (web-app/components/email-inbox-view.tsx:2497)"}, "properties": {"repobilityId": "6b09df61d9312b5a", "scanner": "scanner-primary", "fingerprint": "8123994ac9448999", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7bc1eaf826c7745d", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/mailboxes (web-app/components/email-inbox-view.tsx:2522)"}, "properties": {"repobilityId": "123f884abbb76463", "scanner": "scanner-primary", "fingerprint": "7bc1eaf826c7745d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0acbe22b7f503a59", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/trash/empty (web-app/components/email-inbox-view.tsx:2591)"}, "properties": {"repobilityId": "ee5a666b12da46f9", "scanner": "scanner-primary", "fingerprint": "0acbe22b7f503a59", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1f7ab3fc51387056", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/threads/${threadId}/actions (web-app/components/email-inbox-view.tsx:2696)"}, "properties": {"repobilityId": "ecddfa63fcf81429", "scanner": "scanner-primary", "fingerprint": "1f7ab3fc51387056", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8f8a99d3e3a47af0", "level": "error", "message": {"text": "Dangling fetch: GET /api/email/threads/${threadId} (web-app/components/email-inbox-view.tsx:2707)"}, "properties": {"repobilityId": "02732ed9fbf4874b", "scanner": "scanner-primary", "fingerprint": "8f8a99d3e3a47af0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a1b22761d7779e9c", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/threads/${item.id}/actions (web-app/components/email-inbox-view.tsx:2792)"}, "properties": {"repobilityId": "05926e98ed5a2e92", "scanner": "scanner-primary", "fingerprint": "a1b22761d7779e9c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-450055aafd92c249", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/spam-exceptions (web-app/components/email-inbox-view.tsx:2863)"}, "properties": {"repobilityId": "e520749b6d575a24", "scanner": "scanner-primary", "fingerprint": "450055aafd92c249", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6e14321315cbdbf7", "level": "error", "message": {"text": "Dangling fetch: PUT /api/email/threads/${threadId}/project (web-app/components/email-inbox-view.tsx:3026)"}, "properties": {"repobilityId": "d4859360396e05b1", "scanner": "scanner-primary", "fingerprint": "6e14321315cbdbf7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6ad53e218988e9e5", "level": "error", "message": {"text": "Dangling fetch: POST /api/projects (web-app/components/email-inbox-view.tsx:3119)"}, "properties": {"repobilityId": "d4c58c229b30de04", "scanner": "scanner-primary", "fingerprint": "6ad53e218988e9e5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-33ec858d8d34dae7", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/threads/${selectedThreadId}/tasks (web-app/components/email-inbox-view.tsx:3160)"}, "properties": {"repobilityId": "d5469c523ac7b059", "scanner": "scanner-primary", "fingerprint": "33ec858d8d34dae7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-56fc3817383e6b4e", "level": "error", "message": {"text": "Dangling fetch: POST /api/attachments/upload (web-app/components/email-inbox-view.tsx:3203)"}, "properties": {"repobilityId": "63e6c1375e7d5ea5", "scanner": "scanner-primary", "fingerprint": "56fc3817383e6b4e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-81646ab477297767", "level": "error", "message": {"text": "Dangling fetch: GET /api/email/threads/${threadId} (web-app/components/email-inbox-view.tsx:3300)"}, "properties": {"repobilityId": "49aa02ee6a239321", "scanner": "scanner-primary", "fingerprint": "81646ab477297767", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d5186eb3af15fe1b", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/email/reply-drafts/${selectedReplyDraftId} (web-app/components/email-inbox-view.tsx:3334)"}, "properties": {"repobilityId": "f8a0de73cf28fae1", "scanner": "scanner-primary", "fingerprint": "d5186eb3af15fe1b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-271d47b538234c3f", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/reply-drafts/${draft.id}/send (web-app/components/email-inbox-view.tsx:3392)"}, "properties": {"repobilityId": "08ab77701197d22c", "scanner": "scanner-primary", "fingerprint": "271d47b538234c3f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7628fad0a160da9d", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/reply-drafts/${draft.id}/schedule (web-app/components/email-inbox-view.tsx:3430)"}, "properties": {"repobilityId": "1351fa509f869ad4", "scanner": "scanner-primary", "fingerprint": "7628fad0a160da9d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c55543ce31056174", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/threads/${selectedThreadId}/reply/generate (web-app/components/email-inbox-view.tsx:3466)"}, "properties": {"repobilityId": "6be585f726fd6b4b", "scanner": "scanner-primary", "fingerprint": "c55543ce31056174", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e5236d098b4c2f4b", "level": "error", "message": {"text": "Dangling fetch: GET /api/email/unread-count (web-app/components/dock-badge-sync.tsx:12)"}, "properties": {"repobilityId": "0c30e120689a2e6e", "scanner": "scanner-primary", "fingerprint": "e5236d098b4c2f4b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2d951ace5dbd697b", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/threads/${item.id}/star (web-app/components/email-starred-view.tsx:48)"}, "properties": {"repobilityId": "49439c78efbf9645", "scanner": "scanner-primary", "fingerprint": "2d951ace5dbd697b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3015d3881660035f", "level": "error", "message": {"text": "Dangling fetch: GET /api/todoist/preview?userId=${userId} (web-app/components/todoist-sync-preview-modal.tsx:79)"}, "properties": {"repobilityId": "ca44cced37959509", "scanner": "scanner-primary", "fingerprint": "3015d3881660035f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4d5935fa93cc57c3", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/time/organizations/${organizationId}/tokens (web-app/components/focus-time-organization-panel.tsx:37)"}, "properties": {"repobilityId": "853501014bbc7aec", "scanner": "scanner-primary", "fingerprint": "4d5935fa93cc57c3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-121ed524dc0202ed", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/time/organizations/${organizationId}/groups (web-app/components/focus-time-organization-panel.tsx:38)"}, "properties": {"repobilityId": "4241737ba36c968e", "scanner": "scanner-primary", "fingerprint": "121ed524dc0202ed", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ef41841064ef5c35", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/time/organizations/${organizationId}/tokens (web-app/components/focus-time-organization-panel.tsx:71)"}, "properties": {"repobilityId": "fecef21701a14cd8", "scanner": "scanner-primary", "fingerprint": "ef41841064ef5c35", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6e70e6d090937d1b", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/v1/time/organizations/${organizationId}/tokens/${tokenId} (web-app/components/focus-time-organization-panel.tsx:102)"}, "properties": {"repobilityId": "9657d0cd888542f6", "scanner": "scanner-primary", "fingerprint": "6e70e6d090937d1b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a103d84b9f647c5e", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/time/bootstrap (web-app/components/time-tracking-view.tsx:169)"}, "properties": {"repobilityId": "df23a916adc7e077", "scanner": "scanner-primary", "fingerprint": "a103d84b9f647c5e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-42930e59cc3fc6be", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/time/entries?${searchParams.toString()} (web-app/components/time-tracking-view.tsx:201)"}, "properties": {"repobilityId": "54835c012c54c4ba", "scanner": "scanner-primary", "fingerprint": "42930e59cc3fc6be", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-509e1b7b18077253", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/time/current (web-app/components/time-tracking-view.tsx:212)"}, "properties": {"repobilityId": "13faa5fc62fe00be", "scanner": "scanner-primary", "fingerprint": "509e1b7b18077253", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a131eee3872dc883", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/v1/time/entries/${currentEntry.id} (web-app/components/time-tracking-view.tsx:296)"}, "properties": {"repobilityId": "db4e934d29732177", "scanner": "scanner-primary", "fingerprint": "a131eee3872dc883", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fda262b419eb58e1", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/time/entries (web-app/components/time-tracking-view.tsx:344)"}, "properties": {"repobilityId": "4c7556fc6bb7bd52", "scanner": "scanner-primary", "fingerprint": "fda262b419eb58e1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-017344c3f261d392", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/v1/time/entries/${currentEntry.id} (web-app/components/time-tracking-view.tsx:378)"}, "properties": {"repobilityId": "ba09e92617a565bc", "scanner": "scanner-primary", "fingerprint": "017344c3f261d392", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fda302f031e31c6c", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/v1/time/entries/${id} (web-app/components/time-tracking-view.tsx:400)"}, "properties": {"repobilityId": "881a9b50c54414fc", "scanner": "scanner-primary", "fingerprint": "fda302f031e31c6c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bf8fd57bc8395067", "level": "error", "message": {"text": "Dangling fetch: GET /api/todoist/sync?userId=${userId} (web-app/components/todoist-settings.tsx:69)"}, "properties": {"repobilityId": "014dac7e3d5da2e3", "scanner": "scanner-primary", "fingerprint": "bf8fd57bc8395067", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6f33eb48a2718e58", "level": "error", "message": {"text": "Dangling fetch: POST /api/todoist/connect (web-app/components/todoist-settings.tsx:91)"}, "properties": {"repobilityId": "ceba46f1676c1c51", "scanner": "scanner-primary", "fingerprint": "6f33eb48a2718e58", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-26e3bbb7e1f0a2dc", "level": "error", "message": {"text": "Dangling fetch: POST /api/todoist/sync (web-app/components/todoist-settings.tsx:121)"}, "properties": {"repobilityId": "1fb8c6f1b390aa57", "scanner": "scanner-primary", "fingerprint": "26e3bbb7e1f0a2dc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0686e5392a6d22cd", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/todoist/connect (web-app/components/todoist-settings.tsx:150)"}, "properties": {"repobilityId": "799dd741da85f933", "scanner": "scanner-primary", "fingerprint": "0686e5392a6d22cd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0d93da3de3fe10bd", "level": "error", "message": {"text": "Dangling fetch: GET /api/history?${query} (web-app/components/history-timeline-scrubber.tsx:94)"}, "properties": {"repobilityId": "2f0ac59a9207d889", "scanner": "scanner-primary", "fingerprint": "0d93da3de3fe10bd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2485c748a43a4ba8", "level": "error", "message": {"text": "Dangling fetch: POST /api/daily-plan (web-app/components/daily-plan-card.tsx:88)"}, "properties": {"repobilityId": "151d2ca4df709bc4", "scanner": "scanner-primary", "fingerprint": "2485c748a43a4ba8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-738c95dc18efe3d0", "level": "error", "message": {"text": "Dangling fetch: GET /api/email/threads/${threadId} (web-app/components/email-work-list.tsx:675)"}, "properties": {"repobilityId": "eabacfa267dbaf8d", "scanner": "scanner-primary", "fingerprint": "738c95dc18efe3d0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8d9654a9d8e47a1a", "level": "error", "message": {"text": "Dangling fetch: GET /api/email/threads/${threadId} (web-app/components/email-work-list.tsx:721)"}, "properties": {"repobilityId": "1ea10a15838cbffc", "scanner": "scanner-primary", "fingerprint": "8d9654a9d8e47a1a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-76c812905e4f72d3", "level": "error", "message": {"text": "Dangling fetch: GET /api/email/threads/${item.id}/tasks (web-app/components/email-work-list.tsx:759)"}, "properties": {"repobilityId": "8c6757cfe22e1dea", "scanner": "scanner-primary", "fingerprint": "76c812905e4f72d3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e51f3bdb069465e2", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/threads/${item.id}/tasks (web-app/components/email-work-list.tsx:776)"}, "properties": {"repobilityId": "82a402e67f3b09fb", "scanner": "scanner-primary", "fingerprint": "e51f3bdb069465e2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a261a77169266cd6", "level": "error", "message": {"text": "Dangling fetch: GET /api/email/threads/${item.id}/tasks (web-app/components/email-work-list.tsx:808)"}, "properties": {"repobilityId": "2aa54e7698008240", "scanner": "scanner-primary", "fingerprint": "a261a77169266cd6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f6bfde86d958a853", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/spam-exceptions (web-app/components/email-spam-review-modal.tsx:255)"}, "properties": {"repobilityId": "3d011c719d337961", "scanner": "scanner-primary", "fingerprint": "f6bfde86d958a853", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d6ba1ba37f97ec69", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/spam-exceptions/${ruleId}/revert (web-app/components/email-spam-review-modal.tsx:292)"}, "properties": {"repobilityId": "66e27810e945f50b", "scanner": "scanner-primary", "fingerprint": "d6ba1ba37f97ec69", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6d73e482870f3107", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/threads/${thread.id}/actions (web-app/components/email-spam-review-modal.tsx:360)"}, "properties": {"repobilityId": "7a5b064f33f0c897", "scanner": "scanner-primary", "fingerprint": "6d73e482870f3107", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3729664304e08eff", "level": "error", "message": {"text": "Dangling fetch: POST /api/time-blocks/chat (web-app/components/calendar-chat.tsx:55)"}, "properties": {"repobilityId": "3f7b78fc80b7bcdc", "scanner": "scanner-primary", "fingerprint": "3729664304e08eff", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-719d083b98089e6f", "level": "error", "message": {"text": "Dangling fetch: POST /api/todoist/quick-sync (web-app/components/todoist-quick-sync-modal.tsx:66)"}, "properties": {"repobilityId": "52002e205a0420be", "scanner": "scanner-primary", "fingerprint": "719d083b98089e6f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-302b6dc8bdcc7e17", "level": "error", "message": {"text": "Dangling fetch: GET /api/ai-memory/playbooks (web-app/components/ai-playbook-tab.tsx:34)"}, "properties": {"repobilityId": "86d6f6ba0f8170e6", "scanner": "scanner-primary", "fingerprint": "302b6dc8bdcc7e17", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8f5d52b03b040af4", "level": "error", "message": {"text": "Dangling fetch: PUT /api/ai-memory/playbooks/${selected.id} (web-app/components/ai-playbook-tab.tsx:61)"}, "properties": {"repobilityId": "cb0214dedba7159b", "scanner": "scanner-primary", "fingerprint": "8f5d52b03b040af4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f01b4203d9b81ba6", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai-memory/playbooks (web-app/components/ai-playbook-tab.tsx:80)"}, "properties": {"repobilityId": "ab67384d2167ad27", "scanner": "scanner-primary", "fingerprint": "f01b4203d9b81ba6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-449ba06216341f51", "level": "error", "message": {"text": "Dangling fetch: POST /api/todoist/connect (web-app/components/todoist-integration.tsx:225)"}, "properties": {"repobilityId": "204ef6080ca31894", "scanner": "scanner-primary", "fingerprint": "449ba06216341f51", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-66d9600537ade0d4", "level": "error", "message": {"text": "Dangling fetch: POST /api/todoist/sync (web-app/components/todoist-integration.tsx:289)"}, "properties": {"repobilityId": "242cf7bdb7e5f31d", "scanner": "scanner-primary", "fingerprint": "66d9600537ade0d4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5e3b8534ff2fba56", "level": "error", "message": {"text": "Dangling fetch: GET /api/ai-memory/traces (web-app/components/ai-decision-history-tab.tsx:71)"}, "properties": {"repobilityId": "902da86421ad8658", "scanner": "scanner-primary", "fingerprint": "5e3b8534ff2fba56", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1687f908c0dc21a3", "level": "error", "message": {"text": "Dangling fetch: GET /api/ai-memory/traces/${id} (web-app/components/ai-decision-history-tab.tsx:92)"}, "properties": {"repobilityId": "05b8de0bfe0750e3", "scanner": "scanner-primary", "fingerprint": "1687f908c0dc21a3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7d892af89abdb8ca", "level": "error", "message": {"text": "Dangling fetch: GET /api/tasks/unestimated?limit=50 (web-app/components/estimates-view.tsx:48)"}, "properties": {"repobilityId": "bfb600bd5a6da4d1", "scanner": "scanner-primary", "fingerprint": "7d892af89abdb8ca", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8f794a7179a12342", "level": "error", "message": {"text": "Dangling fetch: GET /api/tasks/estimate/examples?limit=100 (web-app/components/estimates-view.tsx:64)"}, "properties": {"repobilityId": "65df5273f3730cb1", "scanner": "scanner-primary", "fingerprint": "8f794a7179a12342", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b97a1f5f3b2bd82c", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/tasks/estimate/examples?id=${id} (web-app/components/estimates-view.tsx:86)"}, "properties": {"repobilityId": "dbdc25228c8218da", "scanner": "scanner-primary", "fingerprint": "b97a1f5f3b2bd82c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3114786ca436e395", "level": "error", "message": {"text": "Dangling fetch: GET /api/calendar/token (web-app/app/settings/page.tsx:339)"}, "properties": {"repobilityId": "0386cf32cfcab5ac", "scanner": "scanner-primary", "fingerprint": "3114786ca436e395", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0d71968987bfcac9", "level": "error", "message": {"text": "Dangling fetch: POST /api/calendar/token (web-app/app/settings/page.tsx:354)"}, "properties": {"repobilityId": "47795db8f1f88a91", "scanner": "scanner-primary", "fingerprint": "0d71968987bfcac9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6870409c5f6112f5", "level": "error", "message": {"text": "Dangling fetch: GET /api/database (web-app/app/settings/page.tsx:396)"}, "properties": {"repobilityId": "2da11481a0b21d80", "scanner": "scanner-primary", "fingerprint": "6870409c5f6112f5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d46451e2b3e0be9f", "level": "error", "message": {"text": "Dangling fetch: GET /api/keys/personal-access-tokens (web-app/app/settings/page.tsx:410)"}, "properties": {"repobilityId": "ee2182859ee86bc8", "scanner": "scanner-primary", "fingerprint": "d46451e2b3e0be9f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-010edbd8ba32528e", "level": "error", "message": {"text": "Dangling fetch: POST /api/keys/personal-access-tokens (web-app/app/settings/page.tsx:445)"}, "properties": {"repobilityId": "f614a3c72d26aaa8", "scanner": "scanner-primary", "fingerprint": "010edbd8ba32528e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-33a258528cc5a6c2", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/keys/personal-access-tokens/${id} (web-app/app/settings/page.tsx:484)"}, "properties": {"repobilityId": "70f75f31b3c567ff", "scanner": "scanner-primary", "fingerprint": "33a258528cc5a6c2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4c8f2298495fd488", "level": "error", "message": {"text": "Dangling fetch: PUT /api/organizations/${selectedOrganization.id} (web-app/app/settings/page.tsx:2159)"}, "properties": {"repobilityId": "be3b45b472c265c0", "scanner": "scanner-primary", "fingerprint": "4c8f2298495fd488", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-084f98dc2485a698", "level": "error", "message": {"text": "Dangling fetch: POST /api/invite-user (web-app/app/settings/page.tsx:2202)"}, "properties": {"repobilityId": "6276b43c7985bca4", "scanner": "scanner-primary", "fingerprint": "084f98dc2485a698", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ade86428f5e76748", "level": "error", "message": {"text": "Dangling fetch: PUT /api/organizations/${organizationId} (web-app/app/settings/page.tsx:2258)"}, "properties": {"repobilityId": "a6b851acf0ccc546", "scanner": "scanner-primary", "fingerprint": "ade86428f5e76748", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b3e94e6d4988492d", "level": "error", "message": {"text": "Dangling fetch: PUT /api/organizations/${organizationId} (web-app/app/settings/page.tsx:2293)"}, "properties": {"repobilityId": "f829a0cddce09a6c", "scanner": "scanner-primary", "fingerprint": "b3e94e6d4988492d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ec19b1d573b96a09", "level": "error", "message": {"text": "Dangling fetch: PUT /api/users/${userId} (web-app/app/settings/page.tsx:2317)"}, "properties": {"repobilityId": "e47eb463a0eea15f", "scanner": "scanner-primary", "fingerprint": "ec19b1d573b96a09", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-33700b0f87ffefe1", "level": "error", "message": {"text": "Dangling fetch: POST /api/resend-invite (web-app/app/settings/page.tsx:2345)"}, "properties": {"repobilityId": "591839d5524b5a54", "scanner": "scanner-primary", "fingerprint": "33700b0f87ffefe1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2b9d056074a57ad6", "level": "error", "message": {"text": "Dangling fetch: POST /api/cancel-invite (web-app/app/settings/page.tsx:2369)"}, "properties": {"repobilityId": "ae657a58de0e01b4", "scanner": "scanner-primary", "fingerprint": "2b9d056074a57ad6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-68024ed8f056a7b1", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/login (web-app/app/auth/login/page.tsx:38)"}, "properties": {"repobilityId": "bc6c6b10ff131468", "scanner": "scanner-primary", "fingerprint": "68024ed8f056a7b1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-10b5958e494f9a2b", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/forgot-password (web-app/app/auth/forgot-password/page.tsx:21)"}, "properties": {"repobilityId": "ffb4afdb4d6f97aa", "scanner": "scanner-primary", "fingerprint": "10b5958e494f9a2b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7f30d5fb883803cf", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/register (web-app/app/auth/register/page.tsx:39)"}, "properties": {"repobilityId": "64a538d039940bad", "scanner": "scanner-primary", "fingerprint": "7f30d5fb883803cf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6a04afb279ed5093", "level": "error", "message": {"text": "Dangling fetch: POST /api/accept-invite (web-app/app/auth/accept-invite/page.tsx:61)"}, "properties": {"repobilityId": "3873fc8b8253b974", "scanner": "scanner-primary", "fingerprint": "6a04afb279ed5093", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0111191e781ecad4", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/login (web-app/app/auth/accept-invite/page.tsx:78)"}, "properties": {"repobilityId": "3a1bcd15a07fdb6c", "scanner": "scanner-primary", "fingerprint": "0111191e781ecad4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c9f3755fc7696f8c", "level": "error", "message": {"text": "Dangling fetch: POST /api/accept-invite (web-app/app/auth/accept-invite/page.tsx:114)"}, "properties": {"repobilityId": "c886b6f404f5ac04", "scanner": "scanner-primary", "fingerprint": "c9f3755fc7696f8c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c1224aa10cb73093", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (web-app/app/api/time-blocks/chat/route.ts:26)"}, "properties": {"repobilityId": "082662846f85c101", "scanner": "scanner-primary", "fingerprint": "c1224aa10cb73093", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-18670bc97e9931ad", "level": "error", "message": {"text": "Dangling fetch: GET /api/trash (web-app/app/trash/page.tsx:129)"}, "properties": {"repobilityId": "d519902a7f3411e3", "scanner": "scanner-primary", "fingerprint": "18670bc97e9931ad", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-34a34da69ba54b82", "level": "error", "message": {"text": "Dangling fetch: POST /api/trash/restore (web-app/app/trash/page.tsx:157)"}, "properties": {"repobilityId": "5055e94bb50bcb1c", "scanner": "scanner-primary", "fingerprint": "34a34da69ba54b82", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2e5f8e8f5ff2ed8b", "level": "error", "message": {"text": "Dangling fetch: POST /api/trash/purge (web-app/app/trash/page.tsx:182)"}, "properties": {"repobilityId": "b6b69c45f05e46da", "scanner": "scanner-primary", "fingerprint": "2e5f8e8f5ff2ed8b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-00fef3463fc08714", "level": "error", "message": {"text": "Dangling fetch: GET /api/email/inbox?projectId=${encodeURIComponent(projectId)} (web-app/app/[view]/view-client.tsx:1104)"}, "properties": {"repobilityId": "5890c117614d3497", "scanner": "scanner-primary", "fingerprint": "00fef3463fc08714", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6db00e34bad8848c", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/mailboxes/sync-due (web-app/app/[view]/view-client.tsx:1154)"}, "properties": {"repobilityId": "2a0b5f87d75c5f66", "scanner": "scanner-primary", "fingerprint": "6db00e34bad8848c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1f47424d9c946fd5", "level": "error", "message": {"text": "Dangling fetch: GET /api/email/task-links (web-app/app/[view]/view-client.tsx:1216)"}, "properties": {"repobilityId": "3778d0bfee999aa5", "scanner": "scanner-primary", "fingerprint": "1f47424d9c946fd5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-285ca7e779dcfb6f", "level": "error", "message": {"text": "Dangling fetch: PUT /api/tasks/${id} (web-app/app/[view]/view-client.tsx:1262)"}, "properties": {"repobilityId": "06e28fb89af099ef", "scanner": "scanner-primary", "fingerprint": "285ca7e779dcfb6f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6fed293155956fd1", "level": "error", "message": {"text": "Dangling fetch: POST /api/todoist/quick-sync (web-app/app/[view]/view-client.tsx:1288)"}, "properties": {"repobilityId": "89fb0f999c99ff0e", "scanner": "scanner-primary", "fingerprint": "6fed293155956fd1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cb299d23bbd13738", "level": "error", "message": {"text": "Dangling fetch: POST /api/tasks (web-app/app/[view]/view-client.tsx:1379)"}, "properties": {"repobilityId": "ec71df8344e33267", "scanner": "scanner-primary", "fingerprint": "cb299d23bbd13738", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-007350b60e02725c", "level": "error", "message": {"text": "Dangling fetch: POST /api/task-sections (web-app/app/[view]/view-client.tsx:1390)"}, "properties": {"repobilityId": "d0e825ce8be52b8a", "scanner": "scanner-primary", "fingerprint": "007350b60e02725c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-04d8733b46db66ea", "level": "error", "message": {"text": "Dangling fetch: POST /api/tasks (web-app/app/[view]/view-client.tsx:1421)"}, "properties": {"repobilityId": "b3856f4351acefbf", "scanner": "scanner-primary", "fingerprint": "04d8733b46db66ea", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2055468b24c29cbf", "level": "error", "message": {"text": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:1501)"}, "properties": {"repobilityId": "77638f9a337a3c41", "scanner": "scanner-primary", "fingerprint": "2055468b24c29cbf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5520bef855fb89f7", "level": "error", "message": {"text": "Dangling fetch: PUT /api/tasks/${subtask.id} (web-app/app/[view]/view-client.tsx:1516)"}, "properties": {"repobilityId": "0aa2b0ad8a4ee4ef", "scanner": "scanner-primary", "fingerprint": "5520bef855fb89f7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d51867bb7b6aa87f", "level": "error", "message": {"text": "Dangling fetch: POST /api/tasks (web-app/app/[view]/view-client.tsx:1542)"}, "properties": {"repobilityId": "4b9bbd10c97ddee5", "scanner": "scanner-primary", "fingerprint": "d51867bb7b6aa87f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5ee978ffed695ed2", "level": "error", "message": {"text": "Dangling fetch: PUT /api/tasks/${savedTaskId} (web-app/app/[view]/view-client.tsx:1711)"}, "properties": {"repobilityId": "cc383d1feb21a9c3", "scanner": "scanner-primary", "fingerprint": "5ee978ffed695ed2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-65829ea49133aa3d", "level": "error", "message": {"text": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:1769)"}, "properties": {"repobilityId": "4dc16f3793526e76", "scanner": "scanner-primary", "fingerprint": "65829ea49133aa3d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bc8f91ea579b2ddf", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:1820)"}, "properties": {"repobilityId": "831b1c94da1313f2", "scanner": "scanner-primary", "fingerprint": "bc8f91ea579b2ddf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ba2632a0c632ec0c", "level": "error", "message": {"text": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:1864)"}, "properties": {"repobilityId": "062db832c0ca63bd", "scanner": "scanner-primary", "fingerprint": "ba2632a0c632ec0c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-564e4b3603aca188", "level": "error", "message": {"text": "Dangling fetch: POST /api/tasks (web-app/app/[view]/view-client.tsx:1913)"}, "properties": {"repobilityId": "2cbedae2e144b243", "scanner": "scanner-primary", "fingerprint": "564e4b3603aca188", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3c1760b2b1f1a860", "level": "error", "message": {"text": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:1940)"}, "properties": {"repobilityId": "c95ae1146d84f67f", "scanner": "scanner-primary", "fingerprint": "3c1760b2b1f1a860", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8631696f6ba2943f", "level": "error", "message": {"text": "Dangling fetch: POST /api/invite-user (web-app/app/[view]/view-client.tsx:2019)"}, "properties": {"repobilityId": "33a4f3916e137b40", "scanner": "scanner-primary", "fingerprint": "8631696f6ba2943f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eee0044a527aee83", "level": "error", "message": {"text": "Dangling fetch: POST /api/invite-user (web-app/app/[view]/view-client.tsx:2084)"}, "properties": {"repobilityId": "8f165258f5b1d070", "scanner": "scanner-primary", "fingerprint": "eee0044a527aee83", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7b14b6024506352a", "level": "error", "message": {"text": "Dangling fetch: POST /api/resend-invite (web-app/app/[view]/view-client.tsx:2116)"}, "properties": {"repobilityId": "8676c3211828bb90", "scanner": "scanner-primary", "fingerprint": "7b14b6024506352a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6487e17d088389e8", "level": "error", "message": {"text": "Dangling fetch: POST /api/cancel-invite (web-app/app/[view]/view-client.tsx:2144)"}, "properties": {"repobilityId": "4375e2fdc3b7d67f", "scanner": "scanner-primary", "fingerprint": "6487e17d088389e8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8a8952cd5213db0f", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/tasks/${taskDeleteConfirm.taskId} (web-app/app/[view]/view-client.tsx:2179)"}, "properties": {"repobilityId": "960bfef805d10469", "scanner": "scanner-primary", "fingerprint": "8a8952cd5213db0f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-19039aa2086af74f", "level": "error", "message": {"text": "Dangling fetch: POST /api/trash/restore (web-app/app/[view]/view-client.tsx:2212)"}, "properties": {"repobilityId": "95eaf1151faabb90", "scanner": "scanner-primary", "fingerprint": "19039aa2086af74f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a96857e77b86fe38", "level": "error", "message": {"text": "Dangling fetch: PUT /api/projects/${projectId} (web-app/app/[view]/view-client.tsx:2235)"}, "properties": {"repobilityId": "24f7f51f9890b005", "scanner": "scanner-primary", "fingerprint": "a96857e77b86fe38", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-41630b8e52d7f55b", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/projects/${projectId} (web-app/app/[view]/view-client.tsx:2252)"}, "properties": {"repobilityId": "7345460ec2c103b1", "scanner": "scanner-primary", "fingerprint": "41630b8e52d7f55b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f8bea800973417c9", "level": "error", "message": {"text": "Dangling fetch: POST /api/projects (web-app/app/[view]/view-client.tsx:2273)"}, "properties": {"repobilityId": "9f95e7247d614e56", "scanner": "scanner-primary", "fingerprint": "f8bea800973417c9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f5d35868e7801841", "level": "error", "message": {"text": "Dangling fetch: POST /api/organizations (web-app/app/[view]/view-client.tsx:2313)"}, "properties": {"repobilityId": "0ee55b8216c3860e", "scanner": "scanner-primary", "fingerprint": "f5d35868e7801841", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-281984f1eedd6ca4", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/organizations/${orgId} (web-app/app/[view]/view-client.tsx:2333)"}, "properties": {"repobilityId": "c64442ead290903d", "scanner": "scanner-primary", "fingerprint": "281984f1eedd6ca4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d7afd34a398b9737", "level": "error", "message": {"text": "Dangling fetch: PUT /api/organizations/${orgId} (web-app/app/[view]/view-client.tsx:2376)"}, "properties": {"repobilityId": "debc09700bf675ab", "scanner": "scanner-primary", "fingerprint": "d7afd34a398b9737", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9857c66996690ad4", "level": "error", "message": {"text": "Dangling fetch: PUT /api/projects/${project.id} (web-app/app/[view]/view-client.tsx:2405)"}, "properties": {"repobilityId": "b0de3a521d65ceeb", "scanner": "scanner-primary", "fingerprint": "9857c66996690ad4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ca07c13d3f62f5bb", "level": "error", "message": {"text": "Dangling fetch: POST /api/projects/reorder (web-app/app/[view]/view-client.tsx:2441)"}, "properties": {"repobilityId": "a6be8afc44114900", "scanner": "scanner-primary", "fingerprint": "ca07c13d3f62f5bb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d1b420dc1b4a3c21", "level": "error", "message": {"text": "Dangling fetch: POST /api/organizations/reorder (web-app/app/[view]/view-client.tsx:2458)"}, "properties": {"repobilityId": "e98ee904d49ff7a5", "scanner": "scanner-primary", "fingerprint": "d1b420dc1b4a3c21", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3edf28a2f891cda0", "level": "error", "message": {"text": "Dangling fetch: POST /api/sections (web-app/app/[view]/view-client.tsx:2477)"}, "properties": {"repobilityId": "17352184832a65b4", "scanner": "scanner-primary", "fingerprint": "3edf28a2f891cda0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6a6f6f79bf0066ea", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/sections/${sectionId} (web-app/app/[view]/view-client.tsx:2525)"}, "properties": {"repobilityId": "8b8f14d286f2e31e", "scanner": "scanner-primary", "fingerprint": "6a6f6f79bf0066ea", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-46ed2344626d9e67", "level": "error", "message": {"text": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:2577)"}, "properties": {"repobilityId": "a4298b5d41e752c0", "scanner": "scanner-primary", "fingerprint": "46ed2344626d9e67", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3b9b07c67dadfa9f", "level": "error", "message": {"text": "Dangling fetch: POST /api/task-sections (web-app/app/[view]/view-client.tsx:2589)"}, "properties": {"repobilityId": "98932df2ea76dd84", "scanner": "scanner-primary", "fingerprint": "3b9b07c67dadfa9f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f7c3fbf71e920527", "level": "error", "message": {"text": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:2649)"}, "properties": {"repobilityId": "351afa15ca0c3fd3", "scanner": "scanner-primary", "fingerprint": "f7c3fbf71e920527", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-507eebd542b0ec53", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/task-sections?taskId=${encodeURIComponent(taskId)}&sectionId=${encodeURIComponent(sectionId)} (web-app/app/[view]/view-client.tsx:2663)"}, "properties": {"repobilityId": "006aaf2f0f727c83", "scanner": "scanner-primary", "fingerprint": "507eebd542b0ec53", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bde389c70b821a77", "level": "error", "message": {"text": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:2816)"}, "properties": {"repobilityId": "085d520fcf52a0b6", "scanner": "scanner-primary", "fingerprint": "bde389c70b821a77", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b8df9da22131af6e", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai-planner/auto-section (web-app/app/[view]/view-client.tsx:3149)"}, "properties": {"repobilityId": "3ab1ff3188f103a5", "scanner": "scanner-primary", "fingerprint": "b8df9da22131af6e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b5ffdb7f7a19d109", "level": "error", "message": {"text": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:3703)"}, "properties": {"repobilityId": "462980882824842e", "scanner": "scanner-primary", "fingerprint": "b5ffdb7f7a19d109", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-17503d34e5d0bf34", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/threads/${inboxItemId}/actions (web-app/app/[view]/view-client.tsx:4222)"}, "properties": {"repobilityId": "63add8eec4bd3cb5", "scanner": "scanner-primary", "fingerprint": "17503d34e5d0bf34", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-17c43572c2d8613c", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/threads/${inboxItemId}/actions (web-app/app/[view]/view-client.tsx:4237)"}, "properties": {"repobilityId": "72d276699e24d359", "scanner": "scanner-primary", "fingerprint": "17c43572c2d8613c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5077d8d28f2312e3", "level": "error", "message": {"text": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:4400)"}, "properties": {"repobilityId": "809b80cff97f26ae", "scanner": "scanner-primary", "fingerprint": "5077d8d28f2312e3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2694b1dd000d1f45", "level": "error", "message": {"text": "Dangling fetch: PUT /api/tasks/${taskId} (web-app/app/[view]/view-client.tsx:5156)"}, "properties": {"repobilityId": "ba6b3130e91a2439", "scanner": "scanner-primary", "fingerprint": "2694b1dd000d1f45", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bd787b1bf120626e", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/mailboxes/sync-due (web-app/app/[view]/view-client.tsx:5973)"}, "properties": {"repobilityId": "f52f8eb16a803ba1", "scanner": "scanner-primary", "fingerprint": "bd787b1bf120626e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9b1495444e1a8962", "level": "error", "message": {"text": "Dangling fetch: PUT /api/organizations/${organizationId} (web-app/app/[view]/view-client.tsx:6172)"}, "properties": {"repobilityId": "a405d784d3ea2aad", "scanner": "scanner-primary", "fingerprint": "9b1495444e1a8962", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-883af88b0b31aafe", "level": "error", "message": {"text": "Dangling fetch: PUT /api/organizations/${organizationId} (web-app/app/[view]/view-client.tsx:6200)"}, "properties": {"repobilityId": "480366f0d1f59830", "scanner": "scanner-primary", "fingerprint": "883af88b0b31aafe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-31a639c028611a92", "level": "error", "message": {"text": "Dangling fetch: PUT /api/tasks/${task.id} (web-app/app/[view]/view-client.tsx:6367)"}, "properties": {"repobilityId": "e615fa78244b3777", "scanner": "scanner-primary", "fingerprint": "31a639c028611a92", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-68bd2fcf376966c0", "level": "error", "message": {"text": "Dangling fetch: GET /api/time-blocks (web-app/app/calendar/page.tsx:45)"}, "properties": {"repobilityId": "fb66532e723f041b", "scanner": "scanner-primary", "fingerprint": "68bd2fcf376966c0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e240c73497e5c80e", "level": "error", "message": {"text": "Dangling fetch: GET /api/tasks (web-app/app/calendar/page.tsx:60)"}, "properties": {"repobilityId": "76ba98aec1cbb118", "scanner": "scanner-primary", "fingerprint": "e240c73497e5c80e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d3371f5c10ee3beb", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/time-blocks/${blockId} (web-app/app/calendar/page.tsx:72)"}, "properties": {"repobilityId": "85de97d32fbdf43b", "scanner": "scanner-primary", "fingerprint": "d3371f5c10ee3beb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-af45df2e3bb000a7", "level": "error", "message": {"text": "Dangling fetch: POST /api/time-blocks (web-app/app/calendar/page.tsx:95)"}, "properties": {"repobilityId": "b457187fd20009cc", "scanner": "scanner-primary", "fingerprint": "af45df2e3bb000a7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4f54449cd25bedd8", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/time-blocks/${blockId} (web-app/app/calendar/page.tsx:119)"}, "properties": {"repobilityId": "0b0a068abf89b35b", "scanner": "scanner-primary", "fingerprint": "4f54449cd25bedd8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b3c3c84929bec191", "level": "error", "message": {"text": "Dangling fetch: POST /api/time-blocks/${blockId}/tasks (web-app/app/calendar/page.tsx:135)"}, "properties": {"repobilityId": "bd5926499b1810b5", "scanner": "scanner-primary", "fingerprint": "b3c3c84929bec191", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0a0021eff3dead86", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (web-app/lib/ai-agent/providers.ts:171)"}, "properties": {"repobilityId": "854bd172398687ac", "scanner": "scanner-primary", "fingerprint": "0a0021eff3dead86", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-097d8280054d5975", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/ai-memory/write.ts:155)"}, "properties": {"repobilityId": "20cb9285131b6371", "scanner": "scanner-primary", "fingerprint": "097d8280054d5975", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-029c162b38f514e3", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/ai-memory/playbook.ts:133)"}, "properties": {"repobilityId": "848ae0d547244a2c", "scanner": "scanner-primary", "fingerprint": "029c162b38f514e3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a06f32173fd68c85", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/ai-planner/auto-section.ts:193)"}, "properties": {"repobilityId": "12221df1f94e4028", "scanner": "scanner-primary", "fingerprint": "a06f32173fd68c85", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-563c717573d09aad", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/ai-planner/server.ts:210)"}, "properties": {"repobilityId": "11401902875d2909", "scanner": "scanner-primary", "fingerprint": "563c717573d09aad", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4e70c37e8ec0c19e", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/daily-plan/server.ts:162)"}, "properties": {"repobilityId": "95bd6e8f7ccfdf38", "scanner": "scanner-primary", "fingerprint": "4e70c37e8ec0c19e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c18c1a6b0f4b1da0", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/embeddings (web-app/lib/ai-core/embeddings.ts:9)"}, "properties": {"repobilityId": "410664d40b935607", "scanner": "scanner-primary", "fingerprint": "c18c1a6b0f4b1da0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1632c7cb5c89df7c", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/ai-estimator/server.ts:135)"}, "properties": {"repobilityId": "fc645b7d9b1191ad", "scanner": "scanner-primary", "fingerprint": "1632c7cb5c89df7c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-20c475d1c13fd85b", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/email-inbox/ai.ts:883)"}, "properties": {"repobilityId": "0b04f329a61ff10f", "scanner": "scanner-primary", "fingerprint": "20c475d1c13fd85b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c381860f03a865e7", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/email-inbox/ai.ts:1032)"}, "properties": {"repobilityId": "ec90f9c00e5a13ad", "scanner": "scanner-primary", "fingerprint": "c381860f03a865e7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7fd1632cc648a29e", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/email-inbox/rule-assistant.ts:285)"}, "properties": {"repobilityId": "b3b20f45e62455c2", "scanner": "scanner-primary", "fingerprint": "7fd1632cc648a29e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-11396ffd6aa2ae54", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (web-app/lib/email-inbox/spam-exception.ts:228)"}, "properties": {"repobilityId": "2f824d9f67cab7fc", "scanner": "scanner-primary", "fingerprint": "11396ffd6aa2ae54", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f2b93272c0cdd105", "level": "note", "message": {"text": "Unused endpoint: GET /v1/health"}, "properties": {"repobilityId": "2d465bcea5c718d9", "scanner": "scanner-primary", "fingerprint": "f2b93272c0cdd105", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e1c8dc9bea021e14", "level": "note", "message": {"text": "Unused endpoint: ALL /v1/*"}, "properties": {"repobilityId": "5da03ff5295f6d51", "scanner": "scanner-primary", "fingerprint": "e1c8dc9bea021e14", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}