{"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-dcfe501d9c03d9d4", "name": "Stray `console.log` in TS/JS \u2014 tests/e2e/auth/heal-graph-tokens.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/e2e/auth/heal-graph-tokens.ts:38"}, "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-74829040c545cbb4", "name": "Stray `console.log` in TS/JS \u2014 tests/e2e/auth/check-graph-tokens.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/e2e/auth/check-graph-tokens.ts: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-6a3ddf3ce2363f54", "name": "Stray `console.log` in TS/JS \u2014 tests/e2e/auth/export-session.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/e2e/auth/export-session.ts:19"}, "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-7f4b8c87e7401f90", "name": "Stray `console.log` in TS/JS \u2014 tests/e2e/auth/global-setup.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/e2e/auth/global-setup.ts:37"}, "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-ead2f0feb86dab85", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-dep-map.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-dep-map.ts: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-6bc8d67948deb7fe", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-org-contacts.ts:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-org-contacts.ts:30"}, "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-54aa0e74096d7786", "name": "`truncate` class without `title=` for hover reveal \u2014 components/AccountSwitcher.tsx:45", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/AccountSwitcher.tsx:45"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-621f3e6c72aed7c8", "name": "`truncate` class without `title=` for hover reveal \u2014 components/SnoozedClient.tsx:93", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/SnoozedClient.tsx:93"}, "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-cbec745de4f99586", "name": "`truncate` class without `title=` for hover reveal \u2014 components/SnoozePicker.tsx:119", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/SnoozePicker.tsx:119"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a62470b2783a1de4", "name": "`truncate` class without `title=` for hover reveal \u2014 components/Sidebar.tsx:122", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/Sidebar.tsx:122"}, "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-a551f5279b95ade4", "name": "`truncate` class without `title=` for hover reveal \u2014 components/compose/ComposeClient.tsx:1815", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/compose/ComposeClient.tsx:1815"}, "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-d0bdaa1d9bff1f81", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/compose/ComposeClient.tsx:3004", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/compose/ComposeClient.tsx:3004"}, "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-ac147012592181b9", "name": "`truncate` class without `title=` for hover reveal \u2014 components/folder/FolderClient.tsx:63", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/folder/FolderClient.tsx:63"}, "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-81f2ac8e28a322b9", "name": "`truncate` class without `title=` for hover reveal \u2014 components/scheduled/ScheduledEmailsClient.tsx:147", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/scheduled/ScheduledEmailsClient.tsx:147"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-52e20e8bc6c9af7b", "name": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/DashboardClient.tsx:490", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/DashboardClient.tsx:490"}, "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-bae94b027f8d1dd7", "name": "`truncate` class without `title=` for hover reveal \u2014 components/teams/TeamsClient.tsx:530", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/teams/TeamsClient.tsx:530"}, "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-ebf4a48dd5bf68fd", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/teams/TeamsClient.tsx:156", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/teams/TeamsClient.tsx:156"}, "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-dd11fc1cbac5dbf0", "name": "`truncate` class without `title=` for hover reveal \u2014 components/templates/TemplatesClient.tsx:217", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/templates/TemplatesClient.tsx:217"}, "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-754d56a2d0ef15d5", "name": "`truncate` class without `title=` for hover reveal \u2014 components/accounts/AccountsClient.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/accounts/AccountsClient.tsx:129"}, "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-c22649517275798c", "name": "`truncate` class without `title=` for hover reveal \u2014 components/reminders/RemindersPanel.tsx:140", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/reminders/RemindersPanel.tsx:140"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0019361f4e36e914", "name": "`truncate` class without `title=` for hover reveal \u2014 components/contacts/ContactsClient.tsx:686", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/contacts/ContactsClient.tsx:686"}, "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-5348b6322e907fad", "name": "`truncate` class without `title=` for hover reveal \u2014 components/attachments/AttachmentsClient.tsx:784", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/attachments/AttachmentsClient.tsx:784"}, "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-b725f82612ca7938", "name": "`truncate` class without `title=` for hover reveal \u2014 components/inbox/AiReplyModal.tsx:76", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/inbox/AiReplyModal.tsx:76"}, "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-06e37609cb599810", "name": "`truncate` class without `title=` for hover reveal \u2014 components/inbox/EmailReadClient.tsx:738", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/inbox/EmailReadClient.tsx:738"}, "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-a439939bff3d6b62", "name": "`truncate` class without `title=` for hover reveal \u2014 components/inbox/InboxClient.tsx:168", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/inbox/InboxClient.tsx:168"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df6cfddae24b75b4", "name": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/CalendarClient.tsx:228", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/CalendarClient.tsx:228"}, "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-0a6f3799f361303d", "name": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/EventDetailModal.tsx:218", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/EventDetailModal.tsx:218"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bc4a63a8383f37cc", "name": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/EventFormModal.tsx:622", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/EventFormModal.tsx:622"}, "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-91604ed8eeebde09", "name": "`truncate` class without `title=` for hover reveal \u2014 app/login/page.tsx:50", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/login/page.tsx:50"}, "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-a7c22e04ff94d70d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/signatures/page.tsx:445", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/signatures/page.tsx:445"}, "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-5892f0b38e9f0dd1", "name": "Stray `console.log` in TS/JS \u2014 lib/prisma.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/prisma.ts:17"}, "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-150a3bd7cb1204d2", "name": "TODO/FIXME marker in shipping code \u2014 lib/generated/prisma/runtime/client.d.ts:1797", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 lib/generated/prisma/runtime/client.d.ts:1797"}, "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-8fe90825d5dcb467", "name": "Stray `console.log` in TS/JS \u2014 lib/generated/prisma/runtime/wasm-compiler-edge.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/generated/prisma/runtime/wasm-compiler-edge.js:6"}, "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-4b6f20164f23459b", "name": "Stray `console.log` in TS/JS \u2014 lib/generated/prisma/runtime/client.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/generated/prisma/runtime/client.js:6"}, "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-d5e861156db67df8", "name": "Stray `console.log` in TS/JS \u2014 lib/providers/crypto.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/providers/crypto.ts:14"}, "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-ba398fc7382af778", "name": "`truncate` class without `title=` for hover reveal \u2014 refs/design/mock-ups/pages/EmailComposerWindow.jsx:106", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 refs/design/mock-ups/pages/EmailComposerWindow.jsx:106"}, "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-a1dfef1a595bb5bc", "name": "`truncate` class without `title=` for hover reveal \u2014 refs/design/mock-ups/pages/InboxComposeTrigger.jsx:138", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 refs/design/mock-ups/pages/InboxComposeTrigger.jsx:138"}, "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-cfce5e89f16b53d5", "name": "`truncate` class without `title=` for hover reveal \u2014 refs/design/mock-ups/pages/EmailRules.jsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 refs/design/mock-ups/pages/EmailRules.jsx: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-cae1495e585c8a6d", "name": "Icon-only button without accessible name \u2014 refs/design/mock-ups/pages/demo-nav.js:238", "shortDescription": {"text": "Icon-only button without accessible name \u2014 refs/design/mock-ups/pages/demo-nav.js:238"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3c09e9ea4ac37307", "name": "`truncate` class without `title=` for hover reveal \u2014 refs/design/mock-ups/pages/SignatureManagement.jsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 refs/design/mock-ups/pages/SignatureManagement.jsx: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-85650307bf5009c8", "name": "`truncate` class without `title=` for hover reveal \u2014 refs/design/mock-ups/pages/AIRemixPanel.jsx:42", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 refs/design/mock-ups/pages/AIRemixPanel.jsx:42"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-78f46ad0bc0bb2d9", "name": "`truncate` class without `title=` for hover reveal \u2014 refs/design/mock-ups/pages/AIDictateMode.jsx:42", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 refs/design/mock-ups/pages/AIDictateMode.jsx:42"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c98e0e66e937583c", "name": "Insecure pattern 'node_child_process' in scripts/generate-dep-map.ts:16", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/generate-dep-map.ts:16"}, "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-20af4e857488a9ff", "name": "Insecure pattern 'dangerous_innerhtml' in components/compose/ComposeClient.tsx:3004", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/compose/ComposeClient.tsx:3004"}, "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-fc43cac0bc2839eb", "name": "Insecure pattern 'direct_innerhtml_assignment' in components/compose/ComposeClient.tsx:1078", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in components/compose/ComposeClient.tsx:1078"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0736b2a856119f89", "name": "Insecure pattern 'direct_innerhtml_assignment' in components/shared/ReadingPane.tsx:17", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in components/shared/ReadingPane.tsx:17"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-018f87881feebafd", "name": "Insecure pattern 'dangerous_innerhtml' in components/teams/TeamsClient.tsx:156", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/teams/TeamsClient.tsx:156"}, "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-d57d6b1e75d1750d", "name": "Insecure pattern 'exec_used' in components/signatures/SignaturesClient.tsx:519", "shortDescription": {"text": "Insecure pattern 'exec_used' in components/signatures/SignaturesClient.tsx:519"}, "fullDescription": {"text": "Found a known-risky pattern (exec_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-af43c1fabcd2559e", "name": "Insecure pattern 'direct_innerhtml_assignment' in components/signatures/SignaturesClient.tsx:14", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in components/signatures/SignaturesClient.tsx:14"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-69e69e1fdb43db66", "name": "Insecure pattern 'direct_innerhtml_assignment' in components/inbox/EmailReadClient.tsx:76", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in components/inbox/EmailReadClient.tsx:76"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e9be407327f11460", "name": "Insecure pattern 'direct_innerhtml_assignment' in components/inbox/InboxClient.tsx:61", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in components/inbox/InboxClient.tsx:61"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a933378aef863f13", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/(app)/signatures/page.tsx:32", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/(app)/signatures/page.tsx:32"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dd7cc525e3caa655", "name": "Possible secret in lib/generated/prisma/edge.js", "shortDescription": {"text": "Possible secret in lib/generated/prisma/edge.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-96d83b9c2dc6b295", "name": "Possible secret in lib/generated/prisma/index-browser.js", "shortDescription": {"text": "Possible secret in lib/generated/prisma/index-browser.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-be626df4fab0eb83", "name": "Possible secret in lib/generated/prisma/index.js", "shortDescription": {"text": "Possible secret in lib/generated/prisma/index.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-3f9f8911c2f42240", "name": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/demo-nav.js:121", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/demo-nav.js:121"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d363f80e2aa46d6d", "name": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/Detailed Help Center \u2014 Brand Design System/", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/Detailed Help Center \u2014 Brand Design System/index.html:625"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a50216243e8733ba", "name": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/Disconnect Confirmation/index.html:492", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/Disconnect Confirmation/index.html:492"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-30314f3a4305397a", "name": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/AI Dictate Overlay (Copy)/index.html:635", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/AI Dictate Overlay (Copy)/index.html:635"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-34317035d9e0e599", "name": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/AI Remix Panel/index.html:546", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/AI Remix Panel/index.html:546"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-48001803dbc0d3b9", "name": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/Personal Dashboard \u2013 Brand Collection Appli", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/Personal Dashboard \u2013 Brand Collection Applied/index.html:361"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8199c7fd919237a6", "name": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/Sign Up/index.html:175", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/Sign Up/index.html:175"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ae784c2c4abc05eb", "name": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/Inbox/index.html:394", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/Inbox/index.html:394"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-faade2386ffc0b1b", "name": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/Account Details & Sync Settings/index.html:", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/Account Details & Sync Settings/index.html:755"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "pnpm/action-setup@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": "medium", "confidence": 1.0}}, {"id": "scanner-cb639d9a10a47b23", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a47e6e061dd53ab2", "name": "Very large file: components/compose/ComposeClient.tsx (3682 lines)", "shortDescription": {"text": "Very large file: components/compose/ComposeClient.tsx (3682 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-1e1b44b49081de8a", "name": "Very large file: components/help/HelpClient.tsx (1313 lines)", "shortDescription": {"text": "Very large file: components/help/HelpClient.tsx (1313 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-c62394cef38e715b", "name": "Very large file: components/attachments/AttachmentsClient.tsx (1094 lines)", "shortDescription": {"text": "Very large file: components/attachments/AttachmentsClient.tsx (1094 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-fa6ec62fe2061cfc", "name": "Very large file: components/inbox/InboxClient.tsx (2242 lines)", "shortDescription": {"text": "Very large file: components/inbox/InboxClient.tsx (2242 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-658ee366f6893107", "name": "Very large file: components/calendar/CalendarClient.tsx (1701 lines)", "shortDescription": {"text": "Very large file: components/calendar/CalendarClient.tsx (1701 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-0ac37d38b64149c5", "name": "Very large file: lib/generated/prisma/runtime/client.d.ts (3334 lines)", "shortDescription": {"text": "Very large file: lib/generated/prisma/runtime/client.d.ts (3334 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-0a588fd4c0f367bd", "name": "Very large file: lib/providers/jmap.ts (1875 lines)", "shortDescription": {"text": "Very large file: lib/providers/jmap.ts (1875 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-4383cbfb4b6af764", "name": "Very large file: refs/design/mock-ups/pages/EmailRules.jsx (803 lines)", "shortDescription": {"text": "Very large file: refs/design/mock-ups/pages/EmailRules.jsx (803 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-61f335e87f8fbc4d", "name": "Very large file: refs/design/mock-ups/pages/demo-nav.js (1085 lines)", "shortDescription": {"text": "Very large file: refs/design/mock-ups/pages/demo-nav.js (1085 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": "46 tests / 275 src (ratio 0.17)."}, "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-aa0ebe95df2c8080", "name": "Node manifest has dependencies but no lockfile: lib/generated/prisma/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: lib/generated/prisma/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1fc7becd16135bcc", "name": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Unified Red Enterprise Calendar/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Unified Red Enterprise Calendar/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9cbd86758f9caa76", "name": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Sent/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Sent/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3265927c16dea646", "name": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/MailBox/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/MailBox/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b5776111a59cfa7d", "name": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Detailed Help Center \u2014 Brand Design System/pa", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Detailed Help Center \u2014 Brand Design System/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8b086a63ac1d3d50", "name": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Disconnect Confirmation/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Disconnect Confirmation/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a7ea5d3510c5fc63", "name": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/AI Dictate Overlay (Copy)/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/AI Dictate Overlay (Copy)/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ec441dc42a40ab3", "name": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/AI Remix Panel/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/AI Remix Panel/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7384f7f4aa28365e", "name": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Personal Dashboard \u2013 Brand Collection Applied", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Personal Dashboard \u2013 Brand Collection Applied/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-685a2843bce6b46b", "name": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Add Email Account/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Add Email Account/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ac823ec4cee629be", "name": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/EaseMail - Attachments Hub/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/EaseMail - Attachments Hub/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6160039888cc364a", "name": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Sign Up/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Sign Up/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-14123e13fb0ef930", "name": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Email Accounts Dashboard/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Email Accounts Dashboard/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e8961e509a8b2258", "name": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Drafts/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Drafts/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c11431a0cb77c1c2", "name": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Trash/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Trash/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f3408c8b77ff7e92", "name": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Starred/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Starred/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9b8fcfdf34d8ac2e", "name": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Event Detail/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Event Detail/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-910eaf60294caa67", "name": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Inbox/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Inbox/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-78f1c45d8d9b81a6", "name": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Email Composer/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Email Composer/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-65f866b0815081a8", "name": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Forgot Password/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Forgot Password/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-815f1fd6e13fcd97", "name": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Account Details & Sync Settings/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Account Details & Sync Settings/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 19 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 97 placeholder/mock markers across 24 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-6b71cb3ca9e382a7", "name": "Commented-code block (5 lines) in middleware.ts:30", "shortDescription": {"text": "Commented-code block (5 lines) in middleware.ts:30"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-10daf77273811a77", "name": "Commented-code block (6 lines) in eslint.config.mjs:28", "shortDescription": {"text": "Commented-code block (6 lines) in eslint.config.mjs: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-bae5ed20893f463d", "name": "Commented-code block (7 lines) in tests/e2e/folders.spec.ts:23", "shortDescription": {"text": "Commented-code block (7 lines) in tests/e2e/folders.spec.ts:23"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-63f9a26cfc904ba0", "name": "Commented-code block (6 lines) in tests/e2e/contacts.spec.ts:25", "shortDescription": {"text": "Commented-code block (6 lines) in tests/e2e/contacts.spec.ts:25"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a3a575e9d59ba02c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/AppShell.tsx:276", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/AppShell.tsx:276"}, "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-08f9b37194a7e5f1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/Sidebar.tsx:214", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/Sidebar.tsx:214"}, "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-743027e12a97210d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/settings/SettingsClient.tsx:264", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/settings/SettingsClient.tsx:264"}, "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-8b84ec459bd2ec28", "name": "Commented-code block (5 lines) in components/compose/ComposeClient.tsx:192", "shortDescription": {"text": "Commented-code block (5 lines) in components/compose/ComposeClient.tsx:192"}, "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-0cab2e2219c8d309", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/compose/ComposeClient.tsx:711", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/compose/ComposeClient.tsx:711"}, "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-6ea8f0a7fee8a2cb", "name": "Commented-code block (5 lines) in components/folder/FolderClient.tsx:181", "shortDescription": {"text": "Commented-code block (5 lines) in components/folder/FolderClient.tsx:181"}, "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-8663e5287edfb534", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/folder/FolderClient.tsx:199", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/folder/FolderClient.tsx:199"}, "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-6a76f7d2ee8c6675", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/dashboard/DashboardClient.tsx:242", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/dashboard/DashboardClient.tsx:242"}, "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-3dc14b1449ffb761", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/teams/TeamsClient.tsx:295", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/teams/TeamsClient.tsx:295"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e29a9a795b4f609e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/templates/TemplatesClient.tsx:118", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/templates/TemplatesClient.tsx:118"}, "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-9ca620b4e157b91c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/admin/AdminClient.tsx:101", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/admin/AdminClient.tsx:101"}, "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-a6a8ab21fc6878a5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/email-rules/EmailRulesClient.tsx:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/email-rules/EmailRulesClient.tsx:25"}, "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-844858f0092ad29d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/signatures/SignaturesClient.tsx:175", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/signatures/SignaturesClient.tsx:175"}, "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-b5cda06258ae2bd4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/attachments/AttachmentsClient.tsx:578", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/attachments/AttachmentsClient.tsx:578"}, "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-9106b22d7164aeef", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/inbox/AiReplyModal.tsx:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/inbox/AiReplyModal.tsx:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d45aed47f46bb757", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/inbox/AiSummaryPanel.tsx:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/inbox/AiSummaryPanel.tsx:71"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-acab044157192fb1", "name": "Commented-code block (5 lines) in components/inbox/EmailReadClient.tsx:131", "shortDescription": {"text": "Commented-code block (5 lines) in components/inbox/EmailReadClient.tsx:131"}, "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-1b8cb54ef54c7993", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/inbox/EmailReadClient.tsx:115", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/inbox/EmailReadClient.tsx:115"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fc35d836fabfd63a", "name": "Commented-code block (5 lines) in components/inbox/InboxClient.tsx:655", "shortDescription": {"text": "Commented-code block (5 lines) in components/inbox/InboxClient.tsx:655"}, "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-a6ddb742de6b5cc3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/inbox/InboxClient.tsx:457", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/inbox/InboxClient.tsx:457"}, "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-c0ea760dcddec777", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/CalendarClient.tsx:723", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/CalendarClient.tsx:723"}, "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-5ddbae6f76ddc978", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/EventFormModal.tsx:318", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/EventFormModal.tsx:318"}, "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-965a03200ef93a7c", "name": "Commented-code block (7 lines) in app/api/mail/folder/route.ts:300", "shortDescription": {"text": "Commented-code block (7 lines) in app/api/mail/folder/route.ts:300"}, "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-104287b50e7a77f6", "name": "Commented-code block (5 lines) in app/api/mail/message/[id]/route.ts:37", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/mail/message/[id]/route.ts:37"}, "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-6a67a87dc135fc35", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/mail/attachments/[messageId]/[attachmentId]/route.ts:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/mail/attachments/[messageId]/[attachmentId]/route.ts:60"}, "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-43872b72b0149ab7", "name": "Commented-code block (5 lines) in app/api/rules/apply-action/route.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/rules/apply-action/route.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e1f5cfcfbf111943", "name": "Commented-code block (6 lines) in app/api/admin/users/[id]/role/route.ts:11", "shortDescription": {"text": "Commented-code block (6 lines) in app/api/admin/users/[id]/role/route.ts:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3401977928013df6", "name": "Commented-code block (7 lines) in app/api/cron/migrate/route.ts:6", "shortDescription": {"text": "Commented-code block (7 lines) in app/api/cron/migrate/route.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a1c7e9cb00a66d47", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/signatures/page.tsx:571", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/signatures/page.tsx:571"}, "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-e680118a4ba5fed7", "name": "Commented-code block (5 lines) in lib/rate-limit.ts:67", "shortDescription": {"text": "Commented-code block (5 lines) in lib/rate-limit.ts:67"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c477e3571e80cfa4", "name": "Commented-code block (5 lines) in lib/providers/jmap.ts:650", "shortDescription": {"text": "Commented-code block (5 lines) in lib/providers/jmap.ts:650"}, "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-89909e79839a0d73", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/providers/jmap.ts:3", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/providers/jmap.ts:3"}, "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-a5c6f95363a0c3fe", "name": "Commented-code block (7 lines) in lib/providers/imap.ts:374", "shortDescription": {"text": "Commented-code block (7 lines) in lib/providers/imap.ts:374"}, "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-24aa419b653d2100", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/providers/imap.ts:400", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/providers/imap.ts:400"}, "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-3fda5ebd020bcbd2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/microsoft/graph.ts:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/microsoft/graph.ts:60"}, "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-fffbac14ecc09de4", "name": "Legacy-named symbol `Q4_Design_Mockups_v2` in refs/design/mock-ups/pages/demo-nav.js:235", "shortDescription": {"text": "Legacy-named symbol `Q4_Design_Mockups_v2` in refs/design/mock-ups/pages/demo-nav.js:235"}, "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}}]}}, "automationDetails": {"id": "repobility/20899"}, "properties": {"repository": "tdaniel1925/march4-easemail", "repoUrl": "https://github.com/tdaniel1925/march4-easemail", "branch": "main"}, "results": [{"ruleId": "scanner-dcfe501d9c03d9d4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/e2e/auth/heal-graph-tokens.ts:38"}, "properties": {"repobilityId": "287bd3902a1b64ec", "scanner": "scanner-primary", "fingerprint": "dcfe501d9c03d9d4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-74829040c545cbb4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/e2e/auth/check-graph-tokens.ts:31"}, "properties": {"repobilityId": "a010ecc0843ddd5b", "scanner": "scanner-primary", "fingerprint": "74829040c545cbb4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6a3ddf3ce2363f54", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/e2e/auth/export-session.ts:19"}, "properties": {"repobilityId": "06ea6e6731737d02", "scanner": "scanner-primary", "fingerprint": "6a3ddf3ce2363f54", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7f4b8c87e7401f90", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/e2e/auth/global-setup.ts:37"}, "properties": {"repobilityId": "f37524d94353a88f", "scanner": "scanner-primary", "fingerprint": "7f4b8c87e7401f90", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ead2f0feb86dab85", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-dep-map.ts:22"}, "properties": {"repobilityId": "72d6e933a8b0a9d3", "scanner": "scanner-primary", "fingerprint": "ead2f0feb86dab85", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6bc8d67948deb7fe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-org-contacts.ts:30"}, "properties": {"repobilityId": "782dc9727dbc3270", "scanner": "scanner-primary", "fingerprint": "6bc8d67948deb7fe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-54aa0e74096d7786", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/AccountSwitcher.tsx:45"}, "properties": {"repobilityId": "a382bf70b2b2026e", "scanner": "scanner-primary", "fingerprint": "54aa0e74096d7786", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-621f3e6c72aed7c8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/SnoozedClient.tsx:93"}, "properties": {"repobilityId": "e48219df4157ff1e", "scanner": "scanner-primary", "fingerprint": "621f3e6c72aed7c8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cbec745de4f99586", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/SnoozePicker.tsx:119"}, "properties": {"repobilityId": "a098d7f0135e8ea8", "scanner": "scanner-primary", "fingerprint": "cbec745de4f99586", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a62470b2783a1de4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/Sidebar.tsx:122"}, "properties": {"repobilityId": "0401ab5eaa62b445", "scanner": "scanner-primary", "fingerprint": "a62470b2783a1de4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a551f5279b95ade4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/compose/ComposeClient.tsx:1815"}, "properties": {"repobilityId": "9fe0859124092c0b", "scanner": "scanner-primary", "fingerprint": "a551f5279b95ade4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d0bdaa1d9bff1f81", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/compose/ComposeClient.tsx:3004"}, "properties": {"repobilityId": "a147e577e3b33221", "scanner": "scanner-primary", "fingerprint": "d0bdaa1d9bff1f81", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ac147012592181b9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/folder/FolderClient.tsx:63"}, "properties": {"repobilityId": "23e6ab9ff74e365b", "scanner": "scanner-primary", "fingerprint": "ac147012592181b9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-81f2ac8e28a322b9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/scheduled/ScheduledEmailsClient.tsx:147"}, "properties": {"repobilityId": "d466e763ded56106", "scanner": "scanner-primary", "fingerprint": "81f2ac8e28a322b9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-52e20e8bc6c9af7b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/dashboard/DashboardClient.tsx:490"}, "properties": {"repobilityId": "4cb78778020ad6dc", "scanner": "scanner-primary", "fingerprint": "52e20e8bc6c9af7b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bae94b027f8d1dd7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/teams/TeamsClient.tsx:530"}, "properties": {"repobilityId": "4eff4e33a8ce8e49", "scanner": "scanner-primary", "fingerprint": "bae94b027f8d1dd7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ebf4a48dd5bf68fd", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/teams/TeamsClient.tsx:156"}, "properties": {"repobilityId": "aab0bcede5710fb3", "scanner": "scanner-primary", "fingerprint": "ebf4a48dd5bf68fd", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-dd11fc1cbac5dbf0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/templates/TemplatesClient.tsx:217"}, "properties": {"repobilityId": "9a0e1133461c78b2", "scanner": "scanner-primary", "fingerprint": "dd11fc1cbac5dbf0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-754d56a2d0ef15d5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/accounts/AccountsClient.tsx:129"}, "properties": {"repobilityId": "34abba7d75aa8b06", "scanner": "scanner-primary", "fingerprint": "754d56a2d0ef15d5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c22649517275798c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/reminders/RemindersPanel.tsx:140"}, "properties": {"repobilityId": "0dd8c2eefc5489ed", "scanner": "scanner-primary", "fingerprint": "c22649517275798c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0019361f4e36e914", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/contacts/ContactsClient.tsx:686"}, "properties": {"repobilityId": "e629c9642a3aeffb", "scanner": "scanner-primary", "fingerprint": "0019361f4e36e914", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5348b6322e907fad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/attachments/AttachmentsClient.tsx:784"}, "properties": {"repobilityId": "3814a0a999616eed", "scanner": "scanner-primary", "fingerprint": "5348b6322e907fad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b725f82612ca7938", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/inbox/AiReplyModal.tsx:76"}, "properties": {"repobilityId": "16c7aa5d196a3465", "scanner": "scanner-primary", "fingerprint": "b725f82612ca7938", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-06e37609cb599810", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/inbox/EmailReadClient.tsx:738"}, "properties": {"repobilityId": "595123a6449c3377", "scanner": "scanner-primary", "fingerprint": "06e37609cb599810", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a439939bff3d6b62", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/inbox/InboxClient.tsx:168"}, "properties": {"repobilityId": "31e445107f44e439", "scanner": "scanner-primary", "fingerprint": "a439939bff3d6b62", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-df6cfddae24b75b4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/CalendarClient.tsx:228"}, "properties": {"repobilityId": "a666e7f7456e5337", "scanner": "scanner-primary", "fingerprint": "df6cfddae24b75b4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0a6f3799f361303d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/EventDetailModal.tsx:218"}, "properties": {"repobilityId": "ce667800fedd6d5b", "scanner": "scanner-primary", "fingerprint": "0a6f3799f361303d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bc4a63a8383f37cc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/calendar/EventFormModal.tsx:622"}, "properties": {"repobilityId": "0c8cf5bb98681d8b", "scanner": "scanner-primary", "fingerprint": "bc4a63a8383f37cc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-91604ed8eeebde09", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/login/page.tsx:50"}, "properties": {"repobilityId": "46a15874751be40c", "scanner": "scanner-primary", "fingerprint": "91604ed8eeebde09", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a7c22e04ff94d70d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/signatures/page.tsx:445"}, "properties": {"repobilityId": "3a5843b14e6a6090", "scanner": "scanner-primary", "fingerprint": "a7c22e04ff94d70d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5892f0b38e9f0dd1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/prisma.ts:17"}, "properties": {"repobilityId": "b509414ae0a088b5", "scanner": "scanner-primary", "fingerprint": "5892f0b38e9f0dd1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-150a3bd7cb1204d2", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 lib/generated/prisma/runtime/client.d.ts:1797"}, "properties": {"repobilityId": "7548ed818df5675b", "scanner": "scanner-primary", "fingerprint": "150a3bd7cb1204d2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-8fe90825d5dcb467", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/generated/prisma/runtime/wasm-compiler-edge.js:6"}, "properties": {"repobilityId": "3a2a10d1a59426df", "scanner": "scanner-primary", "fingerprint": "8fe90825d5dcb467", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4b6f20164f23459b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/generated/prisma/runtime/client.js:6"}, "properties": {"repobilityId": "02b35a02a8fbb75a", "scanner": "scanner-primary", "fingerprint": "4b6f20164f23459b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d5e861156db67df8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/providers/crypto.ts:14"}, "properties": {"repobilityId": "cf6348067af80ca8", "scanner": "scanner-primary", "fingerprint": "d5e861156db67df8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ba398fc7382af778", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 refs/design/mock-ups/pages/EmailComposerWindow.jsx:106"}, "properties": {"repobilityId": "5267399b0d7d0661", "scanner": "scanner-primary", "fingerprint": "ba398fc7382af778", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a1dfef1a595bb5bc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 refs/design/mock-ups/pages/InboxComposeTrigger.jsx:138"}, "properties": {"repobilityId": "a4d2d41c05d5ec1b", "scanner": "scanner-primary", "fingerprint": "a1dfef1a595bb5bc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cfce5e89f16b53d5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 refs/design/mock-ups/pages/EmailRules.jsx:109"}, "properties": {"repobilityId": "f902e57b093fe418", "scanner": "scanner-primary", "fingerprint": "cfce5e89f16b53d5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cae1495e585c8a6d", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 refs/design/mock-ups/pages/demo-nav.js:238"}, "properties": {"repobilityId": "c9854fc97f640437", "scanner": "scanner-primary", "fingerprint": "cae1495e585c8a6d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-3c09e9ea4ac37307", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 refs/design/mock-ups/pages/SignatureManagement.jsx:109"}, "properties": {"repobilityId": "1c672bb610338bcb", "scanner": "scanner-primary", "fingerprint": "3c09e9ea4ac37307", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-85650307bf5009c8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 refs/design/mock-ups/pages/AIRemixPanel.jsx:42"}, "properties": {"repobilityId": "9c75a768d15054e7", "scanner": "scanner-primary", "fingerprint": "85650307bf5009c8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-78f46ad0bc0bb2d9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 refs/design/mock-ups/pages/AIDictateMode.jsx:42"}, "properties": {"repobilityId": "d22db776e7af0f17", "scanner": "scanner-primary", "fingerprint": "78f46ad0bc0bb2d9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c98e0e66e937583c", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/generate-dep-map.ts:16"}, "properties": {"repobilityId": "c7d87768fc7f307c", "scanner": "scanner-primary", "fingerprint": "c98e0e66e937583c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate-dep-map.ts"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-20af4e857488a9ff", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/compose/ComposeClient.tsx:3004"}, "properties": {"repobilityId": "63f8ae9af42be82d", "scanner": "scanner-primary", "fingerprint": "20af4e857488a9ff", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/compose/ComposeClient.tsx"}, "region": {"startLine": 3004}}}]}, {"ruleId": "scanner-fc43cac0bc2839eb", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in components/compose/ComposeClient.tsx:1078"}, "properties": {"repobilityId": "7222ccec132030ae", "scanner": "scanner-primary", "fingerprint": "fc43cac0bc2839eb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/compose/ComposeClient.tsx"}, "region": {"startLine": 1078}}}]}, {"ruleId": "scanner-0736b2a856119f89", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in components/shared/ReadingPane.tsx:17"}, "properties": {"repobilityId": "e60e546aa5387d14", "scanner": "scanner-primary", "fingerprint": "0736b2a856119f89", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/shared/ReadingPane.tsx"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-018f87881feebafd", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/teams/TeamsClient.tsx:156"}, "properties": {"repobilityId": "ba86b488ec60ba65", "scanner": "scanner-primary", "fingerprint": "018f87881feebafd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/teams/TeamsClient.tsx"}, "region": {"startLine": 156}}}]}, {"ruleId": "scanner-d57d6b1e75d1750d", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in components/signatures/SignaturesClient.tsx:519"}, "properties": {"repobilityId": "cc844bd5de209620", "scanner": "scanner-primary", "fingerprint": "d57d6b1e75d1750d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/signatures/SignaturesClient.tsx"}, "region": {"startLine": 519}}}]}, {"ruleId": "scanner-af43c1fabcd2559e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in components/signatures/SignaturesClient.tsx:14"}, "properties": {"repobilityId": "049a2d2be51d9390", "scanner": "scanner-primary", "fingerprint": "af43c1fabcd2559e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/signatures/SignaturesClient.tsx"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-69e69e1fdb43db66", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in components/inbox/EmailReadClient.tsx:76"}, "properties": {"repobilityId": "fac6b32d63d77b53", "scanner": "scanner-primary", "fingerprint": "69e69e1fdb43db66", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/inbox/EmailReadClient.tsx"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-e9be407327f11460", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in components/inbox/InboxClient.tsx:61"}, "properties": {"repobilityId": "4233f49a8536cdae", "scanner": "scanner-primary", "fingerprint": "e9be407327f11460", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/inbox/InboxClient.tsx"}, "region": {"startLine": 61}}}]}, {"ruleId": "scanner-a933378aef863f13", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/(app)/signatures/page.tsx:32"}, "properties": {"repobilityId": "d9e40d6fed643a5e", "scanner": "scanner-primary", "fingerprint": "a933378aef863f13", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/(app)/signatures/page.tsx"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-dd7cc525e3caa655", "level": "error", "message": {"text": "Possible secret in lib/generated/prisma/edge.js"}, "properties": {"repobilityId": "587f0e2bb63f11cc", "scanner": "scanner-primary", "fingerprint": "dd7cc525e3caa655", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/generated/prisma/edge.js"}, "region": {"startLine": 520}}}]}, {"ruleId": "scanner-96d83b9c2dc6b295", "level": "error", "message": {"text": "Possible secret in lib/generated/prisma/index-browser.js"}, "properties": {"repobilityId": "6ae426fa147e099e", "scanner": "scanner-primary", "fingerprint": "96d83b9c2dc6b295", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/generated/prisma/index-browser.js"}, "region": {"startLine": 548}}}]}, {"ruleId": "scanner-be626df4fab0eb83", "level": "error", "message": {"text": "Possible secret in lib/generated/prisma/index.js"}, "properties": {"repobilityId": "dc82f4202ade8516", "scanner": "scanner-primary", "fingerprint": "be626df4fab0eb83", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/generated/prisma/index.js"}, "region": {"startLine": 521}}}]}, {"ruleId": "scanner-3f9f8911c2f42240", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/demo-nav.js:121"}, "properties": {"repobilityId": "2a27a51f45a770f3", "scanner": "scanner-primary", "fingerprint": "3f9f8911c2f42240", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/demo-nav.js"}, "region": {"startLine": 121}}}]}, {"ruleId": "scanner-d363f80e2aa46d6d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/Detailed Help Center \u2014 Brand Design System/index.html:625"}, "properties": {"repobilityId": "b138adc1a852c5d2", "scanner": "scanner-primary", "fingerprint": "d363f80e2aa46d6d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Detailed Help Center \u2014 Brand Design System/index.html"}, "region": {"startLine": 625}}}]}, {"ruleId": "scanner-a50216243e8733ba", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/Disconnect Confirmation/index.html:492"}, "properties": {"repobilityId": "fc94fef2823f61b3", "scanner": "scanner-primary", "fingerprint": "a50216243e8733ba", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Disconnect Confirmation/index.html"}, "region": {"startLine": 492}}}]}, {"ruleId": "scanner-30314f3a4305397a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/AI Dictate Overlay (Copy)/index.html:635"}, "properties": {"repobilityId": "c5982f5863da05d2", "scanner": "scanner-primary", "fingerprint": "30314f3a4305397a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/AI Dictate Overlay (Copy)/index.html"}, "region": {"startLine": 635}}}]}, {"ruleId": "scanner-34317035d9e0e599", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/AI Remix Panel/index.html:546"}, "properties": {"repobilityId": "448ea2c0056bc3dd", "scanner": "scanner-primary", "fingerprint": "34317035d9e0e599", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/AI Remix Panel/index.html"}, "region": {"startLine": 546}}}]}, {"ruleId": "scanner-48001803dbc0d3b9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/Personal Dashboard \u2013 Brand Collection Applied/index.html:361"}, "properties": {"repobilityId": "9cb3d65fd8def195", "scanner": "scanner-primary", "fingerprint": "48001803dbc0d3b9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Personal Dashboard \u2013 Brand Collection Applied/index.html"}, "region": {"startLine": 361}}}]}, {"ruleId": "scanner-8199c7fd919237a6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/Sign Up/index.html:175"}, "properties": {"repobilityId": "85f3e62594426762", "scanner": "scanner-primary", "fingerprint": "8199c7fd919237a6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Sign Up/index.html"}, "region": {"startLine": 175}}}]}, {"ruleId": "scanner-ae784c2c4abc05eb", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/Inbox/index.html:394"}, "properties": {"repobilityId": "290ae50c04e8190c", "scanner": "scanner-primary", "fingerprint": "ae784c2c4abc05eb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Inbox/index.html"}, "region": {"startLine": 394}}}]}, {"ruleId": "scanner-faade2386ffc0b1b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in refs/design/mock-ups/pages/Account Details & Sync Settings/index.html:755"}, "properties": {"repobilityId": "0e356c11947a400e", "scanner": "scanner-primary", "fingerprint": "faade2386ffc0b1b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Account Details & Sync Settings/index.html"}, "region": {"startLine": 755}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "54597edb7f5bad38", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "edeab51902066991", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a47e6e061dd53ab2", "level": "note", "message": {"text": "Very large file: components/compose/ComposeClient.tsx (3682 lines)"}, "properties": {"repobilityId": "1c26c7a2f17454a5", "scanner": "scanner-primary", "fingerprint": "a47e6e061dd53ab2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1e1b44b49081de8a", "level": "note", "message": {"text": "Very large file: components/help/HelpClient.tsx (1313 lines)"}, "properties": {"repobilityId": "b86007b2ac3862ae", "scanner": "scanner-primary", "fingerprint": "1e1b44b49081de8a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c62394cef38e715b", "level": "note", "message": {"text": "Very large file: components/attachments/AttachmentsClient.tsx (1094 lines)"}, "properties": {"repobilityId": "8850c09a474a6ca4", "scanner": "scanner-primary", "fingerprint": "c62394cef38e715b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fa6ec62fe2061cfc", "level": "note", "message": {"text": "Very large file: components/inbox/InboxClient.tsx (2242 lines)"}, "properties": {"repobilityId": "2672b7a8795ae4fd", "scanner": "scanner-primary", "fingerprint": "fa6ec62fe2061cfc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-658ee366f6893107", "level": "note", "message": {"text": "Very large file: components/calendar/CalendarClient.tsx (1701 lines)"}, "properties": {"repobilityId": "941df7c865ca5aea", "scanner": "scanner-primary", "fingerprint": "658ee366f6893107", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0ac37d38b64149c5", "level": "note", "message": {"text": "Very large file: lib/generated/prisma/runtime/client.d.ts (3334 lines)"}, "properties": {"repobilityId": "80269ddc638e3644", "scanner": "scanner-primary", "fingerprint": "0ac37d38b64149c5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0a588fd4c0f367bd", "level": "note", "message": {"text": "Very large file: lib/providers/jmap.ts (1875 lines)"}, "properties": {"repobilityId": "05df242d24fbb8f1", "scanner": "scanner-primary", "fingerprint": "0a588fd4c0f367bd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4383cbfb4b6af764", "level": "note", "message": {"text": "Very large file: refs/design/mock-ups/pages/EmailRules.jsx (803 lines)"}, "properties": {"repobilityId": "e84f1b11e0a1345f", "scanner": "scanner-primary", "fingerprint": "4383cbfb4b6af764", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-61f335e87f8fbc4d", "level": "note", "message": {"text": "Very large file: refs/design/mock-ups/pages/demo-nav.js (1085 lines)"}, "properties": {"repobilityId": "ce0a03852e39aa04", "scanner": "scanner-primary", "fingerprint": "61f335e87f8fbc4d", "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": "b5edd69d24a505ab", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-aa0ebe95df2c8080", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: lib/generated/prisma/package.json"}, "properties": {"repobilityId": "3f4185df48035fdd", "scanner": "scanner-primary", "fingerprint": "aa0ebe95df2c8080", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/generated/prisma/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1fc7becd16135bcc", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Unified Red Enterprise Calendar/package.json"}, "properties": {"repobilityId": "d027f2b7ce47a2ef", "scanner": "scanner-primary", "fingerprint": "1fc7becd16135bcc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Unified Red Enterprise Calendar/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9cbd86758f9caa76", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Sent/package.json"}, "properties": {"repobilityId": "90352e4931373ff9", "scanner": "scanner-primary", "fingerprint": "9cbd86758f9caa76", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Sent/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3265927c16dea646", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/MailBox/package.json"}, "properties": {"repobilityId": "20d6de8696d0b551", "scanner": "scanner-primary", "fingerprint": "3265927c16dea646", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/MailBox/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b5776111a59cfa7d", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Detailed Help Center \u2014 Brand Design System/package.json"}, "properties": {"repobilityId": "6aa919d1b41fb0d6", "scanner": "scanner-primary", "fingerprint": "b5776111a59cfa7d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Detailed Help Center \u2014 Brand Design System/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8b086a63ac1d3d50", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Disconnect Confirmation/package.json"}, "properties": {"repobilityId": "da86236809305ee4", "scanner": "scanner-primary", "fingerprint": "8b086a63ac1d3d50", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Disconnect Confirmation/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a7ea5d3510c5fc63", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/AI Dictate Overlay (Copy)/package.json"}, "properties": {"repobilityId": "27dd09d1a82512e9", "scanner": "scanner-primary", "fingerprint": "a7ea5d3510c5fc63", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/AI Dictate Overlay (Copy)/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ec441dc42a40ab3", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/AI Remix Panel/package.json"}, "properties": {"repobilityId": "04e9a2719d641cb3", "scanner": "scanner-primary", "fingerprint": "3ec441dc42a40ab3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/AI Remix Panel/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7384f7f4aa28365e", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Personal Dashboard \u2013 Brand Collection Applied/package.json"}, "properties": {"repobilityId": "73e6c90ca34fce3f", "scanner": "scanner-primary", "fingerprint": "7384f7f4aa28365e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Personal Dashboard \u2013 Brand Collection Applied/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-685a2843bce6b46b", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Add Email Account/package.json"}, "properties": {"repobilityId": "3a0247eb094383fb", "scanner": "scanner-primary", "fingerprint": "685a2843bce6b46b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Add Email Account/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ac823ec4cee629be", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/EaseMail - Attachments Hub/package.json"}, "properties": {"repobilityId": "b8f51a74aeb1a6be", "scanner": "scanner-primary", "fingerprint": "ac823ec4cee629be", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/EaseMail - Attachments Hub/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6160039888cc364a", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Sign Up/package.json"}, "properties": {"repobilityId": "4f6d116e194845ce", "scanner": "scanner-primary", "fingerprint": "6160039888cc364a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Sign Up/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-14123e13fb0ef930", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Email Accounts Dashboard/package.json"}, "properties": {"repobilityId": "b8f96cbd668d9e78", "scanner": "scanner-primary", "fingerprint": "14123e13fb0ef930", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Email Accounts Dashboard/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e8961e509a8b2258", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Drafts/package.json"}, "properties": {"repobilityId": "fe06801f364b49bd", "scanner": "scanner-primary", "fingerprint": "e8961e509a8b2258", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Drafts/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c11431a0cb77c1c2", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Trash/package.json"}, "properties": {"repobilityId": "267e13fe01f965a8", "scanner": "scanner-primary", "fingerprint": "c11431a0cb77c1c2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Trash/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f3408c8b77ff7e92", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Starred/package.json"}, "properties": {"repobilityId": "f00c61f83fd2cc7c", "scanner": "scanner-primary", "fingerprint": "f3408c8b77ff7e92", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Starred/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9b8fcfdf34d8ac2e", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Event Detail/package.json"}, "properties": {"repobilityId": "5af2242c0b9c4bf0", "scanner": "scanner-primary", "fingerprint": "9b8fcfdf34d8ac2e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Event Detail/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-910eaf60294caa67", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Inbox/package.json"}, "properties": {"repobilityId": "31a3bb1d06ef5347", "scanner": "scanner-primary", "fingerprint": "910eaf60294caa67", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Inbox/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-78f1c45d8d9b81a6", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Email Composer/package.json"}, "properties": {"repobilityId": "e69e5c6fe9e93bbd", "scanner": "scanner-primary", "fingerprint": "78f1c45d8d9b81a6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Email Composer/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-65f866b0815081a8", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Forgot Password/package.json"}, "properties": {"repobilityId": "c0fab258dfc31265", "scanner": "scanner-primary", "fingerprint": "65f866b0815081a8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Forgot Password/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-815f1fd6e13fcd97", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: refs/design/mock-ups/pages/Account Details & Sync Settings/package.json"}, "properties": {"repobilityId": "51c62994ba241fd6", "scanner": "scanner-primary", "fingerprint": "815f1fd6e13fcd97", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "refs/design/mock-ups/pages/Account Details & Sync Settings/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "e9312ba494cda031", "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": "55587f061db6b1a1", "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": "e0f933235b044ea0", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "202543aa26eb7ebf", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "559fb55c7fe612ee", "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": "47d0b650c60c963a", "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": "cab2cf29d62a7dce", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-6b71cb3ca9e382a7", "level": "none", "message": {"text": "Commented-code block (5 lines) in middleware.ts:30"}, "properties": {"repobilityId": "fa9f4786c3a5fc71", "scanner": "scanner-primary", "fingerprint": "6b71cb3ca9e382a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-10daf77273811a77", "level": "none", "message": {"text": "Commented-code block (6 lines) in eslint.config.mjs:28"}, "properties": {"repobilityId": "99ff0ee82d520415", "scanner": "scanner-primary", "fingerprint": "10daf77273811a77", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bae5ed20893f463d", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/e2e/folders.spec.ts:23"}, "properties": {"repobilityId": "304ed2ad566df332", "scanner": "scanner-primary", "fingerprint": "bae5ed20893f463d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-63f9a26cfc904ba0", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/e2e/contacts.spec.ts:25"}, "properties": {"repobilityId": "53bc7e2c725d060a", "scanner": "scanner-primary", "fingerprint": "63f9a26cfc904ba0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a3a575e9d59ba02c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/AppShell.tsx:276"}, "properties": {"repobilityId": "f07cf04b0849ef57", "scanner": "scanner-primary", "fingerprint": "a3a575e9d59ba02c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-08f9b37194a7e5f1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/Sidebar.tsx:214"}, "properties": {"repobilityId": "ed2c8ad6c3580b8f", "scanner": "scanner-primary", "fingerprint": "08f9b37194a7e5f1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-743027e12a97210d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/settings/SettingsClient.tsx:264"}, "properties": {"repobilityId": "8aa0d2b6e7b952cc", "scanner": "scanner-primary", "fingerprint": "743027e12a97210d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8b84ec459bd2ec28", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/compose/ComposeClient.tsx:192"}, "properties": {"repobilityId": "4ae5cdb490cec200", "scanner": "scanner-primary", "fingerprint": "8b84ec459bd2ec28", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0cab2e2219c8d309", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/compose/ComposeClient.tsx:711"}, "properties": {"repobilityId": "c1c450bc9d8ecd9e", "scanner": "scanner-primary", "fingerprint": "0cab2e2219c8d309", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6ea8f0a7fee8a2cb", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/folder/FolderClient.tsx:181"}, "properties": {"repobilityId": "cbe636f37e999054", "scanner": "scanner-primary", "fingerprint": "6ea8f0a7fee8a2cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8663e5287edfb534", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/folder/FolderClient.tsx:199"}, "properties": {"repobilityId": "9577d2c694510f46", "scanner": "scanner-primary", "fingerprint": "8663e5287edfb534", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6a76f7d2ee8c6675", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/dashboard/DashboardClient.tsx:242"}, "properties": {"repobilityId": "bcce883507105354", "scanner": "scanner-primary", "fingerprint": "6a76f7d2ee8c6675", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3dc14b1449ffb761", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/teams/TeamsClient.tsx:295"}, "properties": {"repobilityId": "00e31334f1c59edb", "scanner": "scanner-primary", "fingerprint": "3dc14b1449ffb761", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e29a9a795b4f609e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/templates/TemplatesClient.tsx:118"}, "properties": {"repobilityId": "ab82b8452833718a", "scanner": "scanner-primary", "fingerprint": "e29a9a795b4f609e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9ca620b4e157b91c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/admin/AdminClient.tsx:101"}, "properties": {"repobilityId": "3adfa995b2a30544", "scanner": "scanner-primary", "fingerprint": "9ca620b4e157b91c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a6a8ab21fc6878a5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/email-rules/EmailRulesClient.tsx:25"}, "properties": {"repobilityId": "43c0482519faf5ab", "scanner": "scanner-primary", "fingerprint": "a6a8ab21fc6878a5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-844858f0092ad29d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/signatures/SignaturesClient.tsx:175"}, "properties": {"repobilityId": "0eac6d5c4ad81ec7", "scanner": "scanner-primary", "fingerprint": "844858f0092ad29d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b5cda06258ae2bd4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/attachments/AttachmentsClient.tsx:578"}, "properties": {"repobilityId": "e4b6ae104b4d8d2f", "scanner": "scanner-primary", "fingerprint": "b5cda06258ae2bd4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9106b22d7164aeef", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/inbox/AiReplyModal.tsx:29"}, "properties": {"repobilityId": "b89c35bfe33f034f", "scanner": "scanner-primary", "fingerprint": "9106b22d7164aeef", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d45aed47f46bb757", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/inbox/AiSummaryPanel.tsx:71"}, "properties": {"repobilityId": "911a3e1dcc9072f8", "scanner": "scanner-primary", "fingerprint": "d45aed47f46bb757", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-acab044157192fb1", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/inbox/EmailReadClient.tsx:131"}, "properties": {"repobilityId": "cab5c590fb15f3ae", "scanner": "scanner-primary", "fingerprint": "acab044157192fb1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b8cb54ef54c7993", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/inbox/EmailReadClient.tsx:115"}, "properties": {"repobilityId": "221189d3cd6b0a3a", "scanner": "scanner-primary", "fingerprint": "1b8cb54ef54c7993", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fc35d836fabfd63a", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/inbox/InboxClient.tsx:655"}, "properties": {"repobilityId": "bb23cba3b592e5fe", "scanner": "scanner-primary", "fingerprint": "fc35d836fabfd63a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a6ddb742de6b5cc3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/inbox/InboxClient.tsx:457"}, "properties": {"repobilityId": "cde88174902836ee", "scanner": "scanner-primary", "fingerprint": "a6ddb742de6b5cc3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c0ea760dcddec777", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/CalendarClient.tsx:723"}, "properties": {"repobilityId": "ee862b8880f98e08", "scanner": "scanner-primary", "fingerprint": "c0ea760dcddec777", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5ddbae6f76ddc978", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/calendar/EventFormModal.tsx:318"}, "properties": {"repobilityId": "0c96f46af96b67cd", "scanner": "scanner-primary", "fingerprint": "5ddbae6f76ddc978", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-965a03200ef93a7c", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/api/mail/folder/route.ts:300"}, "properties": {"repobilityId": "25e172c87ce46b56", "scanner": "scanner-primary", "fingerprint": "965a03200ef93a7c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-104287b50e7a77f6", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/mail/message/[id]/route.ts:37"}, "properties": {"repobilityId": "0239e8c3e474233c", "scanner": "scanner-primary", "fingerprint": "104287b50e7a77f6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6a67a87dc135fc35", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/mail/attachments/[messageId]/[attachmentId]/route.ts:60"}, "properties": {"repobilityId": "29922938057937b0", "scanner": "scanner-primary", "fingerprint": "6a67a87dc135fc35", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-43872b72b0149ab7", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/rules/apply-action/route.ts:7"}, "properties": {"repobilityId": "9787ff1700b37002", "scanner": "scanner-primary", "fingerprint": "43872b72b0149ab7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e1f5cfcfbf111943", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/api/admin/users/[id]/role/route.ts:11"}, "properties": {"repobilityId": "7154e2a609f22baf", "scanner": "scanner-primary", "fingerprint": "e1f5cfcfbf111943", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3401977928013df6", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/api/cron/migrate/route.ts:6"}, "properties": {"repobilityId": "7b20754c4fdea5e7", "scanner": "scanner-primary", "fingerprint": "3401977928013df6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a1c7e9cb00a66d47", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/signatures/page.tsx:571"}, "properties": {"repobilityId": "e99f3a7b3b3e96ea", "scanner": "scanner-primary", "fingerprint": "a1c7e9cb00a66d47", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e680118a4ba5fed7", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/rate-limit.ts:67"}, "properties": {"repobilityId": "04f11d668d12276c", "scanner": "scanner-primary", "fingerprint": "e680118a4ba5fed7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c477e3571e80cfa4", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/providers/jmap.ts:650"}, "properties": {"repobilityId": "67260df8285c1154", "scanner": "scanner-primary", "fingerprint": "c477e3571e80cfa4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-89909e79839a0d73", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/providers/jmap.ts:3"}, "properties": {"repobilityId": "aba6c8bf18445618", "scanner": "scanner-primary", "fingerprint": "89909e79839a0d73", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a5c6f95363a0c3fe", "level": "none", "message": {"text": "Commented-code block (7 lines) in lib/providers/imap.ts:374"}, "properties": {"repobilityId": "ef851fd0823435c5", "scanner": "scanner-primary", "fingerprint": "a5c6f95363a0c3fe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-24aa419b653d2100", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/providers/imap.ts:400"}, "properties": {"repobilityId": "c35de337305d4c30", "scanner": "scanner-primary", "fingerprint": "24aa419b653d2100", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3fda5ebd020bcbd2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/microsoft/graph.ts:60"}, "properties": {"repobilityId": "f92e41f52e1e2c45", "scanner": "scanner-primary", "fingerprint": "3fda5ebd020bcbd2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fffbac14ecc09de4", "level": "note", "message": {"text": "Legacy-named symbol `Q4_Design_Mockups_v2` in refs/design/mock-ups/pages/demo-nav.js:235"}, "properties": {"repobilityId": "e13ab0b9de5aa602", "scanner": "scanner-primary", "fingerprint": "fffbac14ecc09de4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}]}]}