{"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-768b1de6ae684576", "name": "Stray `console.log` in TS/JS \u2014 test-drizzle-returning.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-drizzle-returning.js: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-340869339838654b", "name": "Stray `console.log` in TS/JS \u2014 api/_lib/push.ts:58", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 api/_lib/push.ts:58"}, "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-296006dd1639cd5c", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-blog.ts:603", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-blog.ts:603"}, "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-887affe137c17680", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-org-currency.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-org-currency.ts:27"}, "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-0ad7ebfac17893dd", "name": "Stray `console.log` in TS/JS \u2014 scripts/register-worker-schedules.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/register-worker-schedules.ts:28"}, "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-4086c1a7289f3fa7", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-orgs.ts:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-orgs.ts:36"}, "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-265c0e90971438b9", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-admin.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-admin.ts:28"}, "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-ca0fce2994b1b04f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/CountryCombobox.tsx:40", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CountryCombobox.tsx:40"}, "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-1523bc716cd43c19", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ClientOverviewModal.tsx:131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ClientOverviewModal.tsx:131"}, "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-aee378858fdcb47d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/AccountSelector.tsx:296", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AccountSelector.tsx:296"}, "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-a4b513b409dd9af4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/CurrencyCombobox.tsx:30", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CurrencyCombobox.tsx:30"}, "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-f8b1e29f7a37d9e4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/CategoryPicker.tsx:131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CategoryPicker.tsx:131"}, "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-c569a0ac792f3c48", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/TransactionDetailModal.tsx:162", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/TransactionDetailModal.tsx:162"}, "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-ebccc0288cc4e1f4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/MultiSelect.tsx:66", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/MultiSelect.tsx:66"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-590a053c75f00105", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/MobileAppLayout.tsx:235", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/MobileAppLayout.tsx:235"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4eceb14fce795c43", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/TransactionPeekModal.tsx:76", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/TransactionPeekModal.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-c70d42c044b7b82b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/OrgSwitcher.tsx:59", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/OrgSwitcher.tsx:59"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b17755dc3e013dea", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/transactions/TransactionAttachments.tsx:134", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/transactions/TransactionAttachments.tsx:134"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-be601586b0460995", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/transactions/AddTransactionDialog.tsx:253", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/transactions/AddTransactionDialog.tsx:253"}, "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-761de82f558205ac", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/transactions/tx-form.tsx:59", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/transactions/tx-form.tsx:59"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6a65e58716c0f122", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/notifications/RemindersCard.tsx:170", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/notifications/RemindersCard.tsx:170"}, "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-0a48e75d45cd7fc6", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:95", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:95"}, "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-9867345748bf7ad8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/budget/BusinessBudgetCard.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/budget/BusinessBudgetCard.tsx:80"}, "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-2889d38fce1ca52a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/wealth/TransferWizard.tsx:28", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/wealth/TransferWizard.tsx:28"}, "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-0f512b23a626c481", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/wealth/AccountCombobox.tsx:53", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/wealth/AccountCombobox.tsx:53"}, "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-e08392ee2d4e817c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/wealth/BankNameCombobox.tsx:97", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/wealth/BankNameCombobox.tsx:97"}, "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-c2d5101893ffc5e3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/wealth/AccountDetailsSection.tsx:151", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/wealth/AccountDetailsSection.tsx:151"}, "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-26f2b5bcb957a458", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/wealth/icon-select.tsx:27", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/wealth/icon-select.tsx:27"}, "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-ce491127af705d33", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/wealth/AccountQuickAddSheet.tsx:200", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/wealth/AccountQuickAddSheet.tsx:200"}, "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-6e06da0257eeaecf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ClientFilesPage.tsx:243", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ClientFilesPage.tsx:243"}, "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-4797d6cdda84bcb7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/BudgetDetailPage.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/BudgetDetailPage.tsx:95"}, "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-cc19829507a5c454", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ClientsPage.tsx:430", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ClientsPage.tsx:430"}, "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-0cc9e42ed8d324ce", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/TrashPage.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/TrashPage.tsx:124"}, "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-fdf87397cab7402d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ClientDetailPage.tsx:433", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ClientDetailPage.tsx:433"}, "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-5accb8dd05c703dd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/WealthAccountDetailPage.tsx:212", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/WealthAccountDetailPage.tsx:212"}, "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-a170e66650388fa2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ClosedClientsPage.tsx:113", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ClosedClientsPage.tsx:113"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b189f502ca169b86", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/OrganizationsPage.tsx:205", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/OrganizationsPage.tsx:205"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3d8545f2070b9946", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/QuotationsPage.tsx:708", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/QuotationsPage.tsx:708"}, "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-52cecfece0746366", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/MoneyFlowPage.tsx:188", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/MoneyFlowPage.tsx:188"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8544af655100eae6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ProfilePage.tsx:192", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ProfilePage.tsx:192"}, "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-93301e322bb8cfa1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/OrgMembersPage.tsx:225", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/OrgMembersPage.tsx:225"}, "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-e7adaed26f268158", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Dashboard.tsx:215", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Dashboard.tsx:215"}, "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-16eec05ec781f307", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/TransactionsPage.tsx:715", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/TransactionsPage.tsx:715"}, "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-c579068f30abc180", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/RecurringPage.tsx:290", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/RecurringPage.tsx:290"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-898876d4d22eb1bf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/WealthPage.tsx:497", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/WealthPage.tsx:497"}, "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-ed18ac0acf9b3dd0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/CalendarPage.tsx:270", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/CalendarPage.tsx:270"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1889dc32e698780f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/CategoriesPage.tsx:211", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/CategoriesPage.tsx:211"}, "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-1925168ea433f563", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SpacesPage.tsx:214", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SpacesPage.tsx:214"}, "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-72690f4ee643198c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/BudgetsPage.tsx:143", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/BudgetsPage.tsx:143"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c4acf1933caa342c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ReferralPage.tsx:204", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ReferralPage.tsx:204"}, "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-338846d51d67e3c6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/AnalyticsPage.tsx:201", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/AnalyticsPage.tsx:201"}, "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-c05de322142853c4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SpaceDetailPage.tsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SpaceDetailPage.tsx:130"}, "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-d87959a881aa48c1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminUserGroupsPage.tsx:125", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminUserGroupsPage.tsx:125"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dab63846608394c7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminReferralsPage.tsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminReferralsPage.tsx:145"}, "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-c72b06b3ddeb98a7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminBlogPage.tsx:313", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminBlogPage.tsx:313"}, "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-7c9f0a605e27741a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminAdminsPage.tsx:278", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminAdminsPage.tsx:278"}, "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-861bdd8583b6d26d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminBroadcastStudioPage.tsx:211", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminBroadcastStudioPage.tsx:211"}, "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-739e23a6e02a41dc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminPlansPage.tsx:176", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminPlansPage.tsx:176"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0024b0dab488edc9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/landing/components/DashboardMockup.tsx:40", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/landing/components/DashboardMockup.tsx:40"}, "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-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d5df2242e5bf1442", "name": "Insecure pattern 'node_child_process' in scripts/secret-scan.mjs:14", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/secret-scan.mjs:14"}, "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-1acc30cfc7d9d225", "name": "Insecure pattern 'node_child_process' in scripts/check-route-guards.mjs:8", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/check-route-guards.mjs:8"}, "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-3d44a9278c768369", "name": "Insecure pattern 'dangerous_innerhtml' in scripts/check-route-guards.mjs:48", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in scripts/check-route-guards.mjs:48"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f36756e4816e3f59", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:95", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:95"}, "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-d4f698dcefef5da8", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-65c9bd56493a81d3", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-21aa0c39a7c1ca23", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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-7fe2d1f889a636b2", "name": "Very large file: src/lib/db/schema.ts (870 lines)", "shortDescription": {"text": "Very large file: src/lib/db/schema.ts (870 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-bf168b91b1539e44", "name": "Very large file: src/pages/ClientDetailPage.tsx (933 lines)", "shortDescription": {"text": "Very large file: src/pages/ClientDetailPage.tsx (933 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-6b42fdc2dafc95d6", "name": "Very large file: src/pages/MoneyFlowPage.tsx (1455 lines)", "shortDescription": {"text": "Very large file: src/pages/MoneyFlowPage.tsx (1455 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-6797fead0b072803", "name": "Very large file: src/pages/Dashboard.tsx (1485 lines)", "shortDescription": {"text": "Very large file: src/pages/Dashboard.tsx (1485 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-044f1b3a3db26c74", "name": "Very large file: src/pages/TransactionsPage.tsx (1109 lines)", "shortDescription": {"text": "Very large file: src/pages/TransactionsPage.tsx (1109 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "32 test file(s) for 457 source file(s) (ratio 0.07). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 59 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 179 placeholder/mock markers across 65 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-17d866d91a7c451e", "name": "Agent instruction/config may expose a secret: CLAUDE.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4f1013d6d7af4e18", "name": "Agent authority lacks a verifier contract: .claude/skills/transition-creator/references/this-project.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/transition-creator/references/this-project.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3be23ad2d1bffbf3", "name": "Commented-code block (5 lines) in playwright.config.ts:56", "shortDescription": {"text": "Commented-code block (5 lines) in playwright.config.ts:56"}, "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-a7e39db2444109ce", "name": "Commented-code block (5 lines) in vite.config.ts:84", "shortDescription": {"text": "Commented-code block (5 lines) in vite.config.ts:84"}, "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-63926b0e8ecc2591", "name": "Commented-code block (7 lines) in api/index.ts:7", "shortDescription": {"text": "Commented-code block (7 lines) in api/index.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-90d11856f0685bf4", "name": "Commented-code block (10 lines) in api/ssr.ts:11", "shortDescription": {"text": "Commented-code block (10 lines) in api/ssr.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-8be66adbbcbe471b", "name": "Commented-code block (5 lines) in api/_ssr/markdown.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in api/_ssr/markdown.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-d074cb29bcf19584", "name": "Commented-code block (6 lines) in api/_routes/flow.ts:27", "shortDescription": {"text": "Commented-code block (6 lines) in api/_routes/flow.ts:27"}, "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-2aa0219065e79e9a", "name": "Commented-code block (5 lines) in api/_routes/spaces.ts:11", "shortDescription": {"text": "Commented-code block (5 lines) in api/_routes/spaces.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-6a3f90c9c0331ed8", "name": "Commented-code block (5 lines) in api/_routes/notifications/preferences.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in api/_routes/notifications/preferences.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-22e2233576dc9655", "name": "Commented-code block (5 lines) in api/_routes/wealth/transfer.ts:54", "shortDescription": {"text": "Commented-code block (5 lines) in api/_routes/wealth/transfer.ts:54"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-47116f1569444bf8", "name": "Commented-code block (5 lines) in api/_routes/wealth/accounts.ts:13", "shortDescription": {"text": "Commented-code block (5 lines) in api/_routes/wealth/accounts.ts:13"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d5a24c87f2c6f892", "name": "Commented-code block (5 lines) in api/_routes/admin/worker.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in api/_routes/admin/worker.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6b6f1691a84b94ba", "name": "Commented-code block (5 lines) in api/_routes/admin/user-groups/[id]/members.ts:45", "shortDescription": {"text": "Commented-code block (5 lines) in api/_routes/admin/user-groups/[id]/members.ts:45"}, "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-099d6d4b0fa15322", "name": "Commented-code block (5 lines) in api/_routes/clients/bulk-delete.ts:44", "shortDescription": {"text": "Commented-code block (5 lines) in api/_routes/clients/bulk-delete.ts:44"}, "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-c8ea0183ed6f00b0", "name": "Commented-code block (5 lines) in api/_routes/clients/[id]/media.ts:22", "shortDescription": {"text": "Commented-code block (5 lines) in api/_routes/clients/[id]/media.ts:22"}, "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-bdb80d13179cfe60", "name": "Commented-code block (6 lines) in api/_routes/cron/notifications.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in api/_routes/cron/notifications.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ff5cec21725c4cff", "name": "Commented-code block (5 lines) in api/_routes/public/blog.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in api/_routes/public/blog.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-03a25a742e7b2fca", "name": "Commented-code block (5 lines) in api/_routes/public/pricing.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in api/_routes/public/pricing.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-19a55b975d22fae4", "name": "Commented-code block (6 lines) in api/_lib/auth.ts:139", "shortDescription": {"text": "Commented-code block (6 lines) in api/_lib/auth.ts:139"}, "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-e3b6bdd774b8b62c", "name": "Commented-code block (5 lines) in api/_lib/dodo.ts:183", "shortDescription": {"text": "Commented-code block (5 lines) in api/_lib/dodo.ts:183"}, "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-216c60776d939368", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/dodo.ts:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/dodo.ts:68"}, "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-339e6f78d1a50e3c", "name": "Legacy-named symbol `sk_live_legacy` in api/_lib/dodo.test.ts:44", "shortDescription": {"text": "Legacy-named symbol `sk_live_legacy` in api/_lib/dodo.test.ts:44"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f9afc43a7f0bdb1c", "name": "Commented-code block (5 lines) in api/_lib/push.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in api/_lib/push.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ef329ac8fb99c4d1", "name": "Commented-code block (5 lines) in api/_lib/notifications.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in api/_lib/notifications.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c2cd1f19ea80f712", "name": "Commented-code block (8 lines) in api/_lib/billing-sync.ts:87", "shortDescription": {"text": "Commented-code block (8 lines) in api/_lib/billing-sync.ts:87"}, "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-e41909584e699b94", "name": "Commented-code block (5 lines) in api/_lib/indexnow.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in api/_lib/indexnow.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9af1cdefa9eb65bc", "name": "Commented-code block (9 lines) in api/_lib/recurring-materialize.ts:4", "shortDescription": {"text": "Commented-code block (9 lines) in api/_lib/recurring-materialize.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e142d3e67c5046e9", "name": "Commented-code block (5 lines) in api/_lib/bank-brand.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in api/_lib/bank-brand.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-244f7793a75c6e43", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/bank-brand.ts:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/bank-brand.ts:16"}, "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-c9c9fb5892f99a03", "name": "Commented-code block (12 lines) in api/_lib/attachments.ts:6", "shortDescription": {"text": "Commented-code block (12 lines) in api/_lib/attachments.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-b7147bcb738984f8", "name": "Commented-code block (6 lines) in api/_lib/broadcast-deliver.ts:68", "shortDescription": {"text": "Commented-code block (6 lines) in api/_lib/broadcast-deliver.ts:68"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9d9c3862ee16bec8", "name": "Commented-code block (6 lines) in scripts/secret-scan.mjs:7", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/secret-scan.mjs: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-8066a2152787d7ae", "name": "Commented-code block (6 lines) in scripts/i18n-fill.mjs:4", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/i18n-fill.mjs:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e66a94c8dcf9f042", "name": "Commented-code block (5 lines) in scripts/make-admin.mjs:5", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/make-admin.mjs:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b285e6c2258e6d36", "name": "Commented-code block (6 lines) in scripts/seed-blog.ts:10", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/seed-blog.ts:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e9dfd5475784d440", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/register-worker-schedules.ts:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/register-worker-schedules.ts:31"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1b34cdc9d7d24be5", "name": "Commented-code block (8 lines) in scripts/boot-functions.mjs:5", "shortDescription": {"text": "Commented-code block (8 lines) in scripts/boot-functions.mjs:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c9bf0b8873f55d71", "name": "Commented-code block (6 lines) in scripts/check-i18n.mjs:4", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/check-i18n.mjs:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-76e191fe0aedc9c3", "name": "Commented-code block (7 lines) in scripts/check-esm-extensions.mjs:5", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/check-esm-extensions.mjs:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ff5fbfd6fa6bac4d", "name": "Commented-code block (6 lines) in pwa/vite-pwa.ts:13", "shortDescription": {"text": "Commented-code block (6 lines) in pwa/vite-pwa.ts:13"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-051e00b7f8a414ef", "name": "Commented-code block (6 lines) in pwa/sw-policy.ts:10", "shortDescription": {"text": "Commented-code block (6 lines) in pwa/sw-policy.ts:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-17557131f52aafb4", "name": "Commented-code block (5 lines) in pwa/manifest.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in pwa/manifest.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-465effe2caec22b2", "name": "Commented-code block (5 lines) in pwa/pwa-assets.config.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in pwa/pwa-assets.config.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-4ad79482bdf9a686", "name": "Commented-code block (8 lines) in public/kill-sw.js:3", "shortDescription": {"text": "Commented-code block (8 lines) in public/kill-sw.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-18632e2bccbdf596", "name": "Commented-code block (5 lines) in src/components/UpdatePrompt.tsx:13", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/UpdatePrompt.tsx:13"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e6296481f9f1ea28", "name": "Commented-code block (6 lines) in src/components/FitText.tsx:4", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/FitText.tsx:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c95b2be82dfb614a", "name": "Commented-code block (5 lines) in src/components/AppLayout.tsx:95", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/AppLayout.tsx:95"}, "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-5c1e6186eb854f12", "name": "Commented-code block (5 lines) in src/components/MobileAppLayout.tsx:118", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/MobileAppLayout.tsx:118"}, "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-ddec05c27da200b7", "name": "Commented-code block (6 lines) in src/components/Markdown.tsx:6", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/Markdown.tsx: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-27781eef286a854d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/transactions/tx-form-utils.ts:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/transactions/tx-form-utils.ts:45"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3fea137da0094244", "name": "Commented-code block (5 lines) in src/components/ui/dialog.tsx:9", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/ui/dialog.tsx:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cfc6867bb3e8497e", "name": "Commented-code block (5 lines) in src/lib/api.ts:17", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/api.ts:17"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2b2a4307a2459fb7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api.ts:88", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api.ts:88"}, "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-a245d6479ffaad4a", "name": "Commented-code block (10 lines) in src/lib/data-events.ts:5", "shortDescription": {"text": "Commented-code block (10 lines) in src/lib/data-events.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4df9f646452f7b18", "name": "Commented-code block (6 lines) in src/lib/money.ts:5", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/money.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-03e6a832ef3927c3", "name": "Commented-code block (5 lines) in src/lib/image-upload.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/image-upload.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ec509bc42713c56a", "name": "Commented-code block (5 lines) in src/lib/notifications.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/notifications.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c8607e535486fd8a", "name": "Commented-code block (6 lines) in src/lib/admin-roles.ts:25", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/admin-roles.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-55dd7c8a48bb31e4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/attachments-client.ts:87", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/attachments-client.ts:87"}, "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-56e0e897b3845f63", "name": "Commented-code block (5 lines) in src/lib/money-flow.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/money-flow.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-24b023850a3d22f0", "name": "Commented-code block (6 lines) in src/lib/dashboard-layout.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/dashboard-layout.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-38872853fbed3cd9", "name": "Commented-code block (6 lines) in src/lib/api-router.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/api-router.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a3ca00db15364066", "name": "Commented-code block (5 lines) in src/lib/notification-context.tsx:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/notification-context.tsx: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-3bef96ce4d934f64", "name": "Commented-code block (6 lines) in src/lib/billing-currency.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/billing-currency.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b759bcdbaaa8a85c", "name": "Commented-code block (6 lines) in src/lib/spaces.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/spaces.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2311a14f9f98f8c1", "name": "Commented-code block (5 lines) in src/lib/recurring-transfer.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/recurring-transfer.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bb96fb862b7a2765", "name": "Commented-code block (5 lines) in src/lib/types.ts:73", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/types.ts:73"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c2db3dd21e0408fd", "name": "Commented-code block (6 lines) in src/lib/schedule-notifications.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/schedule-notifications.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-072419ace6c04837", "name": "Commented-code block (8 lines) in src/lib/use-redirect-to-app.ts:3", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/use-redirect-to-app.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2c12c8ba8c5a8a94", "name": "Commented-code block (5 lines) in src/lib/wealth-ledger.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/wealth-ledger.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d457543fd08b69d3", "name": "Commented-code block (5 lines) in src/lib/i18n/use-language.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/i18n/use-language.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-048587dd894a9b7a", "name": "Commented-code block (5 lines) in src/lib/pwa/web-push.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/pwa/web-push.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-043237194982ed49", "name": "Commented-code block (5 lines) in src/lib/pwa/register-sw.ts:31", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/pwa/register-sw.ts:31"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dddb3cfbebd960e8", "name": "Commented-code block (5 lines) in src/lib/pwa/use-install-prompt.ts:18", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/pwa/use-install-prompt.ts:18"}, "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-b9217793f0a97d16", "name": "Commented-code block (5 lines) in src/lib/pwa/chunk-recovery.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/pwa/chunk-recovery.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1eeedee764139168", "name": "Commented-code block (5 lines) in src/lib/db/schema.ts:199", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/db/schema.ts:199"}, "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-5ef433f3c5618a05", "name": "Commented-code block (7 lines) in src/lib/db/retry.ts:3", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/db/retry.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c46f978378468e1c", "name": "Commented-code block (8 lines) in src/lib/db/index.ts:8", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/db/index.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5944d607c7957dee", "name": "Commented-code block (7 lines) in src/lib/seo/site.ts:14", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/seo/site.ts:14"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ff6b7a874b746d7c", "name": "Commented-code block (5 lines) in src/pages/QuotationsPage.tsx:206", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/QuotationsPage.tsx:206"}, "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-f709e08dbbcde035", "name": "Commented-code block (5 lines) in src/pages/MoneyFlowPage.tsx:295", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/MoneyFlowPage.tsx:295"}, "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-fe249c04f660e0ad", "name": "Commented-code block (5 lines) in src/pages/Dashboard.tsx:147", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/Dashboard.tsx:147"}, "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-5d7290005a644e26", "name": "Commented-code block (7 lines) in src/pages/WealthPage.tsx:66", "shortDescription": {"text": "Commented-code block (7 lines) in src/pages/WealthPage.tsx:66"}, "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-9b770ff3c29cd2fb", "name": "Commented-code block (5 lines) in src/pages/admin/AdminPlansPage.tsx:111", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/admin/AdminPlansPage.tsx:111"}, "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-126965a0d65b162f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/landing/blog/useBlog.ts:46", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/landing/blog/useBlog.ts:46"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5cff410ad2bfd64f", "name": "Commented-code block (5 lines) in src/landing/blog/useSeo.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/landing/blog/useSeo.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-80f930e413de0be3", "name": "Commented-code block (5 lines) in src/landing/lib/useSpaNav.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in src/landing/lib/useSpaNav.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6217295ff5c1e5f0", "name": "Commented-code block (8 lines) in e2e/auth.setup.ts:94", "shortDescription": {"text": "Commented-code block (8 lines) in e2e/auth.setup.ts:94"}, "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-2c3b47e3a18bfc54", "name": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/auth.setup.ts:123", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/auth.setup.ts:123"}, "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-030da566069872e9", "name": "15 env vars used in code but missing from .env.example", "shortDescription": {"text": "15 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `BRANDFETCH_APIKEY`, `CI`, `CLERK_PUBLISHABLE_KEY`, `DODO_PAYMENTS_API_KEY_LIVE`, `DODO_PAYMENTS_API_KEY_TEST`, `DODO_PAYMENTS_WEBHOOK_SECRET_LIVE`, `DODO_PAYMENTS_WEBHOOK_SECRET_TEST`, `E2E_CLERK_EMAIL` + 7 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5f870067bc2693e7", "name": "Frontend route `privacy-policy` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `privacy-policy` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cb6cdc2b8d06fae5", "name": "Frontend route `terms-of-service` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `terms-of-service` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0ef62b429f63fe1a", "name": "Frontend route `refund-policy` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `refund-policy` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-89944ed3eb590061", "name": "Frontend route `blog` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `blog` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-594931b37933153c", "name": "Frontend route `blog/:slug` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `blog/:slug` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-918a1b78edaee874", "name": "Frontend route `invitations/:token` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `invitations/:token` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c26202481f0f2b85", "name": "Frontend route `login/*` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `login/*` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-469d4d49cacbf705", "name": "Frontend route `signup/*` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `signup/*` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f2d6a5ecb8f2b1d2", "name": "Frontend route `forgot-password` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `forgot-password` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f61bc5317d2f023d", "name": "Frontend route `reset-password` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `reset-password` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a23c2f3e3fe7a22f", "name": "Frontend route `onboarding` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `onboarding` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c8a179cd751f19c5", "name": "Frontend route `organization-setup` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `organization-setup` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fea04209d8ae8555", "name": "Frontend route `users` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `users` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e45a1234275957aa", "name": "Frontend route `organizations` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `organizations` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e6dbf87fc09d5470", "name": "Frontend route `organizations/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `organizations/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e6e7889f0ade2a1a", "name": "Frontend route `subscriptions` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `subscriptions` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c6b1063982c47250", "name": "Frontend route `invoices` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `invoices` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ab4f3719ff475c5f", "name": "Frontend route `billing-attempts` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `billing-attempts` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fb1caf12bdb7300c", "name": "Frontend route `plans` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `plans` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b8b8d0b0c900c62f", "name": "Frontend route `referrals` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `referrals` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e9a5eaf3d666c71e", "name": "Frontend route `worker` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `worker` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-426a3161a17b93e0", "name": "Frontend route `broadcasts` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `broadcasts` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-15ff6f7e555ec2ed", "name": "Frontend route `user-groups` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `user-groups` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-76c3df96bdc4f90b", "name": "Frontend route `admins` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `admins` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cef386312d50c26d", "name": "Frontend route `dashboard` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b113530310976905", "name": "Frontend route `clients` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `clients` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-48fa5e91cd31e011", "name": "Frontend route `clients/closed` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `clients/closed` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4bc73e666d3871e9", "name": "Frontend route `clients/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `clients/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1308c85998b5493b", "name": "Frontend route `clients/:id/files` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `clients/:id/files` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9ac98cf781049a5d", "name": "Frontend route `transactions` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `transactions` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-26f4c71e514629ca", "name": "Frontend route `recurring` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `recurring` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c8e4000b565c4f77", "name": "Frontend route `calendar` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `calendar` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-198c6cd5c07a1170", "name": "Frontend route `flow` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `flow` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-88bea86a3d497b55", "name": "Frontend route `wealth` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `wealth` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-890c9e4d8486eb35", "name": "Frontend route `wealth/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `wealth/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-039e055b13e8d50f", "name": "Frontend route `spaces` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `spaces` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0175b30b86fa1fe1", "name": "Frontend route `spaces/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `spaces/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ddc1f0e866f6323f", "name": "Frontend route `analytics` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `analytics` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5eea6ac24aef1c6e", "name": "Frontend route `categories` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `categories` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-61fcd655756b6e35", "name": "Frontend route `budgets` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `budgets` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b2e092c883f41d1d", "name": "Frontend route `budgets/:key` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `budgets/:key` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9c6781816b23f921", "name": "Frontend route `quotations` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `quotations` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1bae38b7bd5ec22d", "name": "Frontend route `organizations/:id/members` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `organizations/:id/members` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a5b626331c1abf81", "name": "Frontend route `subscription` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `subscription` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-87903f6f064cac08", "name": "Frontend route `trash` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `trash` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1087e39a1f7f1f80", "name": "Frontend route `notifications` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `notifications` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-11feb210c2f50b50", "name": "Frontend route `profile` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `profile` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3ca5aa3978bae256", "name": "Dangling fetch: POST https://api.resend.com/emails (api/_lib/email.ts:33)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (api/_lib/email.ts:33)"}, "fullDescription": {"text": "`api/_lib/email.ts:33` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/emails`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-520da91169a2dfaf", "name": "Dangling fetch: POST /api/transactions/${txId}/attachments (src/components/transactions/tx-form-utils.ts:45)", "shortDescription": {"text": "Dangling fetch: POST /api/transactions/${txId}/attachments (src/components/transactions/tx-form-utils.ts:45)"}, "fullDescription": {"text": "`src/components/transactions/tx-form-utils.ts:45` calls `POST /api/transactions/${txId}/attachments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/transactions/<p>/attachments`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1c2c6818aa6a323b", "name": "Dangling fetch: DELETE /api/trash/purge (src/pages/TrashPage.tsx:87)", "shortDescription": {"text": "Dangling fetch: DELETE /api/trash/purge (src/pages/TrashPage.tsx:87)"}, "fullDescription": {"text": "`src/pages/TrashPage.tsx:87` calls `DELETE /api/trash/purge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trash/purge`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9b0c023034e7d7a1", "name": "Dangling fetch: POST /api/quotations/${viewTarget.id}/attachments (src/pages/QuotationsPage.tsx:375)", "shortDescription": {"text": "Dangling fetch: POST /api/quotations/${viewTarget.id}/attachments (src/pages/QuotationsPage.tsx:375)"}, "fullDescription": {"text": "`src/pages/QuotationsPage.tsx:375` calls `POST /api/quotations/${viewTarget.id}/attachments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/quotations/<p>/attachments`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5dd4a95638c4314c", "name": "Dangling fetch: GET /api/quotation-attachments/${attachment.id} (src/pages/QuotationsPage.tsx:405)", "shortDescription": {"text": "Dangling fetch: GET /api/quotation-attachments/${attachment.id} (src/pages/QuotationsPage.tsx:405)"}, "fullDescription": {"text": "`src/pages/QuotationsPage.tsx:405` calls `GET /api/quotation-attachments/${attachment.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/quotation-attachments/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c55b38a82a0c1fa5", "name": "Dangling fetch: DELETE /api/quotation-attachments/${deleteAttachId} (src/pages/QuotationsPage.tsx:426)", "shortDescription": {"text": "Dangling fetch: DELETE /api/quotation-attachments/${deleteAttachId} (src/pages/QuotationsPage.tsx:426)"}, "fullDescription": {"text": "`src/pages/QuotationsPage.tsx:426` calls `DELETE /api/quotation-attachments/${deleteAttachId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/quotation-attachments/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-eb34b01ea1d6b9e9", "name": "Dangling fetch: DELETE /api/organizations/${id}/members (src/pages/OrgMembersPage.tsx:147)", "shortDescription": {"text": "Dangling fetch: DELETE /api/organizations/${id}/members (src/pages/OrgMembersPage.tsx:147)"}, "fullDescription": {"text": "`src/pages/OrgMembersPage.tsx:147` calls `DELETE /api/organizations/${id}/members` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/organizations/<p>/members`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7469872a1dc52cc5", "name": "Dangling fetch: DELETE /api/organizations/${id}/members (src/pages/OrgMembersPage.tsx:168)", "shortDescription": {"text": "Dangling fetch: DELETE /api/organizations/${id}/members (src/pages/OrgMembersPage.tsx:168)"}, "fullDescription": {"text": "`src/pages/OrgMembersPage.tsx:168` calls `DELETE /api/organizations/${id}/members` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/organizations/<p>/members`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c0026b952abe884d", "name": "Dangling fetch: GET /api/billing/invoice-pdf?id=${invoice.id} (src/pages/SubscriptionPage.tsx:334)", "shortDescription": {"text": "Dangling fetch: GET /api/billing/invoice-pdf?id=${invoice.id} (src/pages/SubscriptionPage.tsx:334)"}, "fullDescription": {"text": "`src/pages/SubscriptionPage.tsx:334` calls `GET /api/billing/invoice-pdf?id=${invoice.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/billing/invoice-pdf`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a35e337568b1fb81", "name": "Dangling fetch: POST /api/transactions/${viewTx.id}/attachments (src/pages/TransactionsPage.tsx:466)", "shortDescription": {"text": "Dangling fetch: POST /api/transactions/${viewTx.id}/attachments (src/pages/TransactionsPage.tsx:466)"}, "fullDescription": {"text": "`src/pages/TransactionsPage.tsx:466` calls `POST /api/transactions/${viewTx.id}/attachments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/transactions/<p>/attachments`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1f63d05c61d08a6e", "name": "Dangling fetch: GET /api/attachments/${attachment.id} (src/pages/TransactionsPage.tsx:496)", "shortDescription": {"text": "Dangling fetch: GET /api/attachments/${attachment.id} (src/pages/TransactionsPage.tsx:496)"}, "fullDescription": {"text": "`src/pages/TransactionsPage.tsx:496` calls `GET /api/attachments/${attachment.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/attachments/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-38b26d2a18e590b3", "name": "Dangling fetch: DELETE /api/attachments/${deleteAttachId} (src/pages/TransactionsPage.tsx:517)", "shortDescription": {"text": "Dangling fetch: DELETE /api/attachments/${deleteAttachId} (src/pages/TransactionsPage.tsx:517)"}, "fullDescription": {"text": "`src/pages/TransactionsPage.tsx:517` calls `DELETE /api/attachments/${deleteAttachId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/attachments/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ca70a6332ad1eaf5", "name": "Dangling fetch: GET /api/invitations/${token} (src/pages/InvitationPage.tsx:35)", "shortDescription": {"text": "Dangling fetch: GET /api/invitations/${token} (src/pages/InvitationPage.tsx:35)"}, "fullDescription": {"text": "`src/pages/InvitationPage.tsx:35` calls `GET /api/invitations/${token}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/invitations/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cc3922e9c4c3cd7e", "name": "Dangling fetch: POST /api/invitations/${token} (src/pages/InvitationPage.tsx:62)", "shortDescription": {"text": "Dangling fetch: POST /api/invitations/${token} (src/pages/InvitationPage.tsx:62)"}, "fullDescription": {"text": "`src/pages/InvitationPage.tsx:62` calls `POST /api/invitations/${token}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/invitations/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-eb7c2d8d2e45427f", "name": "Dangling fetch: DELETE /api/invitations/${token} (src/pages/InvitationPage.tsx:105)", "shortDescription": {"text": "Dangling fetch: DELETE /api/invitations/${token} (src/pages/InvitationPage.tsx:105)"}, "fullDescription": {"text": "`src/pages/InvitationPage.tsx:105` calls `DELETE /api/invitations/${token}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/invitations/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e102724741707ccf", "name": "Dangling fetch: GET /api/admin/invoices?invoice_id=${inv.id}&document=1 (src/pages/admin/AdminInvoicesPage.tsx:168)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/invoices?invoice_id=${inv.id}&document=1 (src/pages/admin/AdminInvoicesPage.tsx:168)"}, "fullDescription": {"text": "`src/pages/admin/AdminInvoicesPage.tsx:168` calls `GET /api/admin/invoices?invoice_id=${inv.id}&document=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/invoices`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-08c001ec5cd81e73", "name": "Dangling fetch: GET /api/public/blog/${encodeURIComponent(slug)} (src/landing/blog/useBlog.ts:97)", "shortDescription": {"text": "Dangling fetch: GET /api/public/blog/${encodeURIComponent(slug)} (src/landing/blog/useBlog.ts:97)"}, "fullDescription": {"text": "`src/landing/blog/useBlog.ts:97` calls `GET /api/public/blog/${encodeURIComponent(slug)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/public/blog/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-74d25284019fc63d", "name": "Dangling fetch: GET /api/public/pricing (src/landing/lib/usePricing.ts:47)", "shortDescription": {"text": "Dangling fetch: GET /api/public/pricing (src/landing/lib/usePricing.ts:47)"}, "fullDescription": {"text": "`src/landing/lib/usePricing.ts:47` calls `GET /api/public/pricing` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/public/pricing`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-00076e898ed5ada7", "name": "Dangling fetch: POST /api/onboarding (e2e/auth.setup.ts:123)", "shortDescription": {"text": "Dangling fetch: POST /api/onboarding (e2e/auth.setup.ts:123)"}, "fullDescription": {"text": "`e2e/auth.setup.ts:123` calls `POST /api/onboarding` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/onboarding`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dde3adb27bf7eebe", "name": "Unused endpoint: USE /api", "shortDescription": {"text": "Unused endpoint: USE /api"}, "fullDescription": {"text": "`vite.config.ts` declares `USE /api` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-684f0e83ba7e1558", "name": "Unused endpoint: GET ", "shortDescription": {"text": "Unused endpoint: GET "}, "fullDescription": {"text": "`src/components/transactions/AddTransactionDialog.tsx` declares `GET ` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/22420"}, "properties": {"repository": "vorreix/profitsync", "repoUrl": "https://github.com/vorreix/profitsync", "branch": "main"}, "results": [{"ruleId": "scanner-768b1de6ae684576", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-drizzle-returning.js:14"}, "properties": {"repobilityId": "6663191787ef45e8", "scanner": "scanner-primary", "fingerprint": "768b1de6ae684576", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-340869339838654b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 api/_lib/push.ts:58"}, "properties": {"repobilityId": "7cb173d6e3f60772", "scanner": "scanner-primary", "fingerprint": "340869339838654b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-296006dd1639cd5c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-blog.ts:603"}, "properties": {"repobilityId": "1eb7bee0d3325f65", "scanner": "scanner-primary", "fingerprint": "296006dd1639cd5c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-887affe137c17680", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-org-currency.ts:27"}, "properties": {"repobilityId": "6ed9b1e1601ae43e", "scanner": "scanner-primary", "fingerprint": "887affe137c17680", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0ad7ebfac17893dd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/register-worker-schedules.ts:28"}, "properties": {"repobilityId": "f1251a4f988ff684", "scanner": "scanner-primary", "fingerprint": "0ad7ebfac17893dd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4086c1a7289f3fa7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-orgs.ts:36"}, "properties": {"repobilityId": "a512891658e673ea", "scanner": "scanner-primary", "fingerprint": "4086c1a7289f3fa7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-265c0e90971438b9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-admin.ts:28"}, "properties": {"repobilityId": "442ee759a63ef5a7", "scanner": "scanner-primary", "fingerprint": "265c0e90971438b9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ca0fce2994b1b04f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CountryCombobox.tsx:40"}, "properties": {"repobilityId": "8242f7e1f09decd2", "scanner": "scanner-primary", "fingerprint": "ca0fce2994b1b04f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1523bc716cd43c19", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ClientOverviewModal.tsx:131"}, "properties": {"repobilityId": "fe816527e7550ad1", "scanner": "scanner-primary", "fingerprint": "1523bc716cd43c19", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aee378858fdcb47d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AccountSelector.tsx:296"}, "properties": {"repobilityId": "1467439247e14ee0", "scanner": "scanner-primary", "fingerprint": "aee378858fdcb47d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a4b513b409dd9af4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CurrencyCombobox.tsx:30"}, "properties": {"repobilityId": "0dd1a07e469bbab3", "scanner": "scanner-primary", "fingerprint": "a4b513b409dd9af4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f8b1e29f7a37d9e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CategoryPicker.tsx:131"}, "properties": {"repobilityId": "a7ee671da7465847", "scanner": "scanner-primary", "fingerprint": "f8b1e29f7a37d9e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c569a0ac792f3c48", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/TransactionDetailModal.tsx:162"}, "properties": {"repobilityId": "57ffbbdc1014ea68", "scanner": "scanner-primary", "fingerprint": "c569a0ac792f3c48", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ebccc0288cc4e1f4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/MultiSelect.tsx:66"}, "properties": {"repobilityId": "5a75ce46c4cf50dd", "scanner": "scanner-primary", "fingerprint": "ebccc0288cc4e1f4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-590a053c75f00105", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/MobileAppLayout.tsx:235"}, "properties": {"repobilityId": "99ec3550a0677399", "scanner": "scanner-primary", "fingerprint": "590a053c75f00105", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4eceb14fce795c43", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/TransactionPeekModal.tsx:76"}, "properties": {"repobilityId": "d55407e3b76f5348", "scanner": "scanner-primary", "fingerprint": "4eceb14fce795c43", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c70d42c044b7b82b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/OrgSwitcher.tsx:59"}, "properties": {"repobilityId": "f0b9e0885583ec05", "scanner": "scanner-primary", "fingerprint": "c70d42c044b7b82b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b17755dc3e013dea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/transactions/TransactionAttachments.tsx:134"}, "properties": {"repobilityId": "07ed418186280004", "scanner": "scanner-primary", "fingerprint": "b17755dc3e013dea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-be601586b0460995", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/transactions/AddTransactionDialog.tsx:253"}, "properties": {"repobilityId": "0537fb662b98f67e", "scanner": "scanner-primary", "fingerprint": "be601586b0460995", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-761de82f558205ac", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/transactions/tx-form.tsx:59"}, "properties": {"repobilityId": "d13db331e029da4f", "scanner": "scanner-primary", "fingerprint": "761de82f558205ac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6a65e58716c0f122", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/notifications/RemindersCard.tsx:170"}, "properties": {"repobilityId": "2c8531bc8f3cd012", "scanner": "scanner-primary", "fingerprint": "6a65e58716c0f122", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0a48e75d45cd7fc6", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:95"}, "properties": {"repobilityId": "b8c68f17a4018107", "scanner": "scanner-primary", "fingerprint": "0a48e75d45cd7fc6", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9867345748bf7ad8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/budget/BusinessBudgetCard.tsx:80"}, "properties": {"repobilityId": "de2588d1325b8be8", "scanner": "scanner-primary", "fingerprint": "9867345748bf7ad8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2889d38fce1ca52a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/wealth/TransferWizard.tsx:28"}, "properties": {"repobilityId": "c8d6e77b7544dd6d", "scanner": "scanner-primary", "fingerprint": "2889d38fce1ca52a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0f512b23a626c481", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/wealth/AccountCombobox.tsx:53"}, "properties": {"repobilityId": "b4033c11156a3d23", "scanner": "scanner-primary", "fingerprint": "0f512b23a626c481", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e08392ee2d4e817c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/wealth/BankNameCombobox.tsx:97"}, "properties": {"repobilityId": "ff9f0be8aedc7bca", "scanner": "scanner-primary", "fingerprint": "e08392ee2d4e817c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c2d5101893ffc5e3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/wealth/AccountDetailsSection.tsx:151"}, "properties": {"repobilityId": "89e940221b27aed4", "scanner": "scanner-primary", "fingerprint": "c2d5101893ffc5e3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-26f2b5bcb957a458", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/wealth/icon-select.tsx:27"}, "properties": {"repobilityId": "3668d219a44b0a98", "scanner": "scanner-primary", "fingerprint": "26f2b5bcb957a458", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce491127af705d33", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/wealth/AccountQuickAddSheet.tsx:200"}, "properties": {"repobilityId": "aecb7e19b62a3493", "scanner": "scanner-primary", "fingerprint": "ce491127af705d33", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6e06da0257eeaecf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ClientFilesPage.tsx:243"}, "properties": {"repobilityId": "9c8acf38bbd0bab9", "scanner": "scanner-primary", "fingerprint": "6e06da0257eeaecf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4797d6cdda84bcb7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/BudgetDetailPage.tsx:95"}, "properties": {"repobilityId": "f1e3344c6c4614b7", "scanner": "scanner-primary", "fingerprint": "4797d6cdda84bcb7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cc19829507a5c454", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ClientsPage.tsx:430"}, "properties": {"repobilityId": "ad96c290808abea7", "scanner": "scanner-primary", "fingerprint": "cc19829507a5c454", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0cc9e42ed8d324ce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/TrashPage.tsx:124"}, "properties": {"repobilityId": "41e99e17724c3ade", "scanner": "scanner-primary", "fingerprint": "0cc9e42ed8d324ce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fdf87397cab7402d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ClientDetailPage.tsx:433"}, "properties": {"repobilityId": "19498bd37fcbbea9", "scanner": "scanner-primary", "fingerprint": "fdf87397cab7402d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5accb8dd05c703dd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/WealthAccountDetailPage.tsx:212"}, "properties": {"repobilityId": "d3b4257fa7f4a17c", "scanner": "scanner-primary", "fingerprint": "5accb8dd05c703dd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a170e66650388fa2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ClosedClientsPage.tsx:113"}, "properties": {"repobilityId": "15670449464ebb85", "scanner": "scanner-primary", "fingerprint": "a170e66650388fa2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b189f502ca169b86", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/OrganizationsPage.tsx:205"}, "properties": {"repobilityId": "fd60cd195e34a594", "scanner": "scanner-primary", "fingerprint": "b189f502ca169b86", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3d8545f2070b9946", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/QuotationsPage.tsx:708"}, "properties": {"repobilityId": "d35e0c402359a8aa", "scanner": "scanner-primary", "fingerprint": "3d8545f2070b9946", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-52cecfece0746366", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/MoneyFlowPage.tsx:188"}, "properties": {"repobilityId": "28c58494d3340f26", "scanner": "scanner-primary", "fingerprint": "52cecfece0746366", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8544af655100eae6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ProfilePage.tsx:192"}, "properties": {"repobilityId": "16027c4ce7b27cae", "scanner": "scanner-primary", "fingerprint": "8544af655100eae6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-93301e322bb8cfa1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/OrgMembersPage.tsx:225"}, "properties": {"repobilityId": "c769b9536a17177c", "scanner": "scanner-primary", "fingerprint": "93301e322bb8cfa1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e7adaed26f268158", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Dashboard.tsx:215"}, "properties": {"repobilityId": "ef6dffe971709383", "scanner": "scanner-primary", "fingerprint": "e7adaed26f268158", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-16eec05ec781f307", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/TransactionsPage.tsx:715"}, "properties": {"repobilityId": "37729d120db0bd52", "scanner": "scanner-primary", "fingerprint": "16eec05ec781f307", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c579068f30abc180", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/RecurringPage.tsx:290"}, "properties": {"repobilityId": "43b366363d1fb97c", "scanner": "scanner-primary", "fingerprint": "c579068f30abc180", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-898876d4d22eb1bf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/WealthPage.tsx:497"}, "properties": {"repobilityId": "f9250c78b9c1bc62", "scanner": "scanner-primary", "fingerprint": "898876d4d22eb1bf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ed18ac0acf9b3dd0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/CalendarPage.tsx:270"}, "properties": {"repobilityId": "1b3ba8b65fb7ea74", "scanner": "scanner-primary", "fingerprint": "ed18ac0acf9b3dd0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1889dc32e698780f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/CategoriesPage.tsx:211"}, "properties": {"repobilityId": "8258b5b9e80953bf", "scanner": "scanner-primary", "fingerprint": "1889dc32e698780f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1925168ea433f563", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SpacesPage.tsx:214"}, "properties": {"repobilityId": "26a702943a209987", "scanner": "scanner-primary", "fingerprint": "1925168ea433f563", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-72690f4ee643198c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/BudgetsPage.tsx:143"}, "properties": {"repobilityId": "bab5b13f87cb5c37", "scanner": "scanner-primary", "fingerprint": "72690f4ee643198c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c4acf1933caa342c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ReferralPage.tsx:204"}, "properties": {"repobilityId": "5751ee1d79dc63c7", "scanner": "scanner-primary", "fingerprint": "c4acf1933caa342c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-338846d51d67e3c6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/AnalyticsPage.tsx:201"}, "properties": {"repobilityId": "858d93d0bac2eb16", "scanner": "scanner-primary", "fingerprint": "338846d51d67e3c6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c05de322142853c4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SpaceDetailPage.tsx:130"}, "properties": {"repobilityId": "89d7606566e343d5", "scanner": "scanner-primary", "fingerprint": "c05de322142853c4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d87959a881aa48c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminUserGroupsPage.tsx:125"}, "properties": {"repobilityId": "269298fc595e77bc", "scanner": "scanner-primary", "fingerprint": "d87959a881aa48c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dab63846608394c7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminReferralsPage.tsx:145"}, "properties": {"repobilityId": "6b87726506ed8ea5", "scanner": "scanner-primary", "fingerprint": "dab63846608394c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c72b06b3ddeb98a7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminBlogPage.tsx:313"}, "properties": {"repobilityId": "f0875e9129c0ebe9", "scanner": "scanner-primary", "fingerprint": "c72b06b3ddeb98a7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7c9f0a605e27741a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminAdminsPage.tsx:278"}, "properties": {"repobilityId": "a3bb278adc04bd3a", "scanner": "scanner-primary", "fingerprint": "7c9f0a605e27741a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-861bdd8583b6d26d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminBroadcastStudioPage.tsx:211"}, "properties": {"repobilityId": "6f9410ff441599a0", "scanner": "scanner-primary", "fingerprint": "861bdd8583b6d26d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-739e23a6e02a41dc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/AdminPlansPage.tsx:176"}, "properties": {"repobilityId": "84ec8958a828027e", "scanner": "scanner-primary", "fingerprint": "739e23a6e02a41dc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0024b0dab488edc9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/landing/components/DashboardMockup.tsx:40"}, "properties": {"repobilityId": "84078bd7c9239d13", "scanner": "scanner-primary", "fingerprint": "0024b0dab488edc9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-d5df2242e5bf1442", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/secret-scan.mjs:14"}, "properties": {"repobilityId": "0c6da144e9cce9be", "scanner": "scanner-primary", "fingerprint": "d5df2242e5bf1442", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/secret-scan.mjs"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-1acc30cfc7d9d225", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/check-route-guards.mjs:8"}, "properties": {"repobilityId": "aefc3dc82fe4d3b0", "scanner": "scanner-primary", "fingerprint": "1acc30cfc7d9d225", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/check-route-guards.mjs"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-3d44a9278c768369", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in scripts/check-route-guards.mjs:48"}, "properties": {"repobilityId": "2cd2678f81e5a464", "scanner": "scanner-primary", "fingerprint": "3d44a9278c768369", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/check-route-guards.mjs"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-f36756e4816e3f59", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:95"}, "properties": {"repobilityId": "33f10636e53b4298", "scanner": "scanner-primary", "fingerprint": "f36756e4816e3f59", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ui/chart.tsx"}, "region": {"startLine": 95}}}]}, {"ruleId": "scanner-d4f698dcefef5da8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "36a46fa8ccf9fa7b", "scanner": "scanner-primary", "fingerprint": "d4f698dcefef5da8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pr.yml"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-d4f698dcefef5da8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "dac7c58281a3da8b", "scanner": "scanner-primary", "fingerprint": "d4f698dcefef5da8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pr.yml"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-65c9bd56493a81d3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b44a73dd9c718042", "scanner": "scanner-primary", "fingerprint": "65c9bd56493a81d3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e.yml"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-65c9bd56493a81d3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b1ab3c3bf570d7b2", "scanner": "scanner-primary", "fingerprint": "65c9bd56493a81d3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e.yml"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-65c9bd56493a81d3", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "8e879d8d5d310b9f", "scanner": "scanner-primary", "fingerprint": "65c9bd56493a81d3", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/e2e.yml"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-21aa0c39a7c1ca23", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "15862df22abefae1", "scanner": "scanner-primary", "fingerprint": "21aa0c39a7c1ca23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/security.yml"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-21aa0c39a7c1ca23", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d4949c9579856e4f", "scanner": "scanner-primary", "fingerprint": "21aa0c39a7c1ca23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/security.yml"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "b86179956da3a4a8", "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-7fe2d1f889a636b2", "level": "note", "message": {"text": "Very large file: src/lib/db/schema.ts (870 lines)"}, "properties": {"repobilityId": "8a61261276d0ea7b", "scanner": "scanner-primary", "fingerprint": "7fe2d1f889a636b2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bf168b91b1539e44", "level": "note", "message": {"text": "Very large file: src/pages/ClientDetailPage.tsx (933 lines)"}, "properties": {"repobilityId": "06556fcde0e9282a", "scanner": "scanner-primary", "fingerprint": "bf168b91b1539e44", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6b42fdc2dafc95d6", "level": "note", "message": {"text": "Very large file: src/pages/MoneyFlowPage.tsx (1455 lines)"}, "properties": {"repobilityId": "5540540c40ef5a4e", "scanner": "scanner-primary", "fingerprint": "6b42fdc2dafc95d6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6797fead0b072803", "level": "note", "message": {"text": "Very large file: src/pages/Dashboard.tsx (1485 lines)"}, "properties": {"repobilityId": "65f65cb5d9f24cc9", "scanner": "scanner-primary", "fingerprint": "6797fead0b072803", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-044f1b3a3db26c74", "level": "note", "message": {"text": "Very large file: src/pages/TransactionsPage.tsx (1109 lines)"}, "properties": {"repobilityId": "24442fd5193ba509", "scanner": "scanner-primary", "fingerprint": "044f1b3a3db26c74", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "02c5f5d85ac4867a", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "bc5781df249aaa81", "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": "a33df2c4dcf3668c", "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": "55fa185144f78b5b", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "cd43ed910624d302", "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": "305d0cf7c763ac71", "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": "ca2868b57682cfb8", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-17d866d91a7c451e", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "properties": {"repobilityId": "ccce5984e58a48f0", "scanner": "scanner-primary", "fingerprint": "17d866d91a7c451e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 71}}}]}, {"ruleId": "scanner-4f1013d6d7af4e18", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/transition-creator/references/this-project.md"}, "properties": {"repobilityId": "c0d6bcf13b80e029", "scanner": "scanner-primary", "fingerprint": "4f1013d6d7af4e18", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/transition-creator/references/this-project.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3be23ad2d1bffbf3", "level": "none", "message": {"text": "Commented-code block (5 lines) in playwright.config.ts:56"}, "properties": {"repobilityId": "b64f91ed3eea49e0", "scanner": "scanner-primary", "fingerprint": "3be23ad2d1bffbf3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a7e39db2444109ce", "level": "none", "message": {"text": "Commented-code block (5 lines) in vite.config.ts:84"}, "properties": {"repobilityId": "1ec54e0d8bed084e", "scanner": "scanner-primary", "fingerprint": "a7e39db2444109ce", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-63926b0e8ecc2591", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/index.ts:7"}, "properties": {"repobilityId": "6485a827576a4d32", "scanner": "scanner-primary", "fingerprint": "63926b0e8ecc2591", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-90d11856f0685bf4", "level": "none", "message": {"text": "Commented-code block (10 lines) in api/ssr.ts:11"}, "properties": {"repobilityId": "6183010bb0ce2972", "scanner": "scanner-primary", "fingerprint": "90d11856f0685bf4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8be66adbbcbe471b", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_ssr/markdown.ts:7"}, "properties": {"repobilityId": "df32bb6356e8ec00", "scanner": "scanner-primary", "fingerprint": "8be66adbbcbe471b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d074cb29bcf19584", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/_routes/flow.ts:27"}, "properties": {"repobilityId": "cdb51670c3463e19", "scanner": "scanner-primary", "fingerprint": "d074cb29bcf19584", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2aa0219065e79e9a", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_routes/spaces.ts:11"}, "properties": {"repobilityId": "48129fd7fe50eb7b", "scanner": "scanner-primary", "fingerprint": "2aa0219065e79e9a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6a3f90c9c0331ed8", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_routes/notifications/preferences.ts:8"}, "properties": {"repobilityId": "b1482ff3a0608fe5", "scanner": "scanner-primary", "fingerprint": "6a3f90c9c0331ed8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-22e2233576dc9655", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_routes/wealth/transfer.ts:54"}, "properties": {"repobilityId": "eeb53c852236cce5", "scanner": "scanner-primary", "fingerprint": "22e2233576dc9655", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-47116f1569444bf8", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_routes/wealth/accounts.ts:13"}, "properties": {"repobilityId": "a5825b95f90ea174", "scanner": "scanner-primary", "fingerprint": "47116f1569444bf8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d5a24c87f2c6f892", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_routes/admin/worker.ts:4"}, "properties": {"repobilityId": "5bd198580f363c26", "scanner": "scanner-primary", "fingerprint": "d5a24c87f2c6f892", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b6f1691a84b94ba", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_routes/admin/user-groups/[id]/members.ts:45"}, "properties": {"repobilityId": "31dbff274cdd3d9f", "scanner": "scanner-primary", "fingerprint": "6b6f1691a84b94ba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-099d6d4b0fa15322", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_routes/clients/bulk-delete.ts:44"}, "properties": {"repobilityId": "226974b72c2cb612", "scanner": "scanner-primary", "fingerprint": "099d6d4b0fa15322", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c8ea0183ed6f00b0", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_routes/clients/[id]/media.ts:22"}, "properties": {"repobilityId": "1cd15263815a8a4e", "scanner": "scanner-primary", "fingerprint": "c8ea0183ed6f00b0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bdb80d13179cfe60", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/_routes/cron/notifications.ts:3"}, "properties": {"repobilityId": "62d0163b5568087e", "scanner": "scanner-primary", "fingerprint": "bdb80d13179cfe60", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ff5cec21725c4cff", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_routes/public/blog.ts:6"}, "properties": {"repobilityId": "af7903d6f9f57b52", "scanner": "scanner-primary", "fingerprint": "ff5cec21725c4cff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-03a25a742e7b2fca", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_routes/public/pricing.ts:6"}, "properties": {"repobilityId": "a195207bbc2b68cc", "scanner": "scanner-primary", "fingerprint": "03a25a742e7b2fca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-19a55b975d22fae4", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/_lib/auth.ts:139"}, "properties": {"repobilityId": "0eaf1bec351da4c9", "scanner": "scanner-primary", "fingerprint": "19a55b975d22fae4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e3b6bdd774b8b62c", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_lib/dodo.ts:183"}, "properties": {"repobilityId": "4bd31ec41a0c7f7b", "scanner": "scanner-primary", "fingerprint": "e3b6bdd774b8b62c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-216c60776d939368", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/dodo.ts:68"}, "properties": {"repobilityId": "4850038b0c828e52", "scanner": "scanner-primary", "fingerprint": "216c60776d939368", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-339e6f78d1a50e3c", "level": "note", "message": {"text": "Legacy-named symbol `sk_live_legacy` in api/_lib/dodo.test.ts:44"}, "properties": {"repobilityId": "22e12cd232c11197", "scanner": "scanner-primary", "fingerprint": "339e6f78d1a50e3c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f9afc43a7f0bdb1c", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_lib/push.ts:3"}, "properties": {"repobilityId": "e6fc1d4673da24de", "scanner": "scanner-primary", "fingerprint": "f9afc43a7f0bdb1c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ef329ac8fb99c4d1", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_lib/notifications.ts:3"}, "properties": {"repobilityId": "d971debbc1c5d67d", "scanner": "scanner-primary", "fingerprint": "ef329ac8fb99c4d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c2cd1f19ea80f712", "level": "none", "message": {"text": "Commented-code block (8 lines) in api/_lib/billing-sync.ts:87"}, "properties": {"repobilityId": "34e4a6300f5cc6da", "scanner": "scanner-primary", "fingerprint": "c2cd1f19ea80f712", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e41909584e699b94", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_lib/indexnow.ts:3"}, "properties": {"repobilityId": "cbc6146359359cb7", "scanner": "scanner-primary", "fingerprint": "e41909584e699b94", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9af1cdefa9eb65bc", "level": "none", "message": {"text": "Commented-code block (9 lines) in api/_lib/recurring-materialize.ts:4"}, "properties": {"repobilityId": "ae0f19f08d494c04", "scanner": "scanner-primary", "fingerprint": "9af1cdefa9eb65bc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e142d3e67c5046e9", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/_lib/bank-brand.ts:1"}, "properties": {"repobilityId": "5c154e27f9b872a9", "scanner": "scanner-primary", "fingerprint": "e142d3e67c5046e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-244f7793a75c6e43", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/bank-brand.ts:16"}, "properties": {"repobilityId": "883233e7a04bef37", "scanner": "scanner-primary", "fingerprint": "244f7793a75c6e43", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c9c9fb5892f99a03", "level": "none", "message": {"text": "Commented-code block (12 lines) in api/_lib/attachments.ts:6"}, "properties": {"repobilityId": "b394463b5a4a76eb", "scanner": "scanner-primary", "fingerprint": "c9c9fb5892f99a03", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b7147bcb738984f8", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/_lib/broadcast-deliver.ts:68"}, "properties": {"repobilityId": "3c7be835dabf1124", "scanner": "scanner-primary", "fingerprint": "b7147bcb738984f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9d9c3862ee16bec8", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/secret-scan.mjs:7"}, "properties": {"repobilityId": "5ece866e3488b509", "scanner": "scanner-primary", "fingerprint": "9d9c3862ee16bec8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8066a2152787d7ae", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/i18n-fill.mjs:4"}, "properties": {"repobilityId": "f740b0eb71c502ff", "scanner": "scanner-primary", "fingerprint": "8066a2152787d7ae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e66a94c8dcf9f042", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/make-admin.mjs:5"}, "properties": {"repobilityId": "6f77f46159165845", "scanner": "scanner-primary", "fingerprint": "e66a94c8dcf9f042", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b285e6c2258e6d36", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/seed-blog.ts:10"}, "properties": {"repobilityId": "6d2762776105cb8b", "scanner": "scanner-primary", "fingerprint": "b285e6c2258e6d36", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e9dfd5475784d440", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/register-worker-schedules.ts:31"}, "properties": {"repobilityId": "a9ff8aa076e045da", "scanner": "scanner-primary", "fingerprint": "e9dfd5475784d440", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1b34cdc9d7d24be5", "level": "none", "message": {"text": "Commented-code block (8 lines) in scripts/boot-functions.mjs:5"}, "properties": {"repobilityId": "42f80236e5e70cb4", "scanner": "scanner-primary", "fingerprint": "1b34cdc9d7d24be5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c9bf0b8873f55d71", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/check-i18n.mjs:4"}, "properties": {"repobilityId": "3fcc1ed8ee6adf68", "scanner": "scanner-primary", "fingerprint": "c9bf0b8873f55d71", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-76e191fe0aedc9c3", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/check-esm-extensions.mjs:5"}, "properties": {"repobilityId": "474351d2f30dd787", "scanner": "scanner-primary", "fingerprint": "76e191fe0aedc9c3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ff5fbfd6fa6bac4d", "level": "none", "message": {"text": "Commented-code block (6 lines) in pwa/vite-pwa.ts:13"}, "properties": {"repobilityId": "8449d7245b8541b1", "scanner": "scanner-primary", "fingerprint": "ff5fbfd6fa6bac4d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-051e00b7f8a414ef", "level": "none", "message": {"text": "Commented-code block (6 lines) in pwa/sw-policy.ts:10"}, "properties": {"repobilityId": "338a2cac3d9ee1f1", "scanner": "scanner-primary", "fingerprint": "051e00b7f8a414ef", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-17557131f52aafb4", "level": "none", "message": {"text": "Commented-code block (5 lines) in pwa/manifest.ts:3"}, "properties": {"repobilityId": "d827c7232ce77017", "scanner": "scanner-primary", "fingerprint": "17557131f52aafb4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-465effe2caec22b2", "level": "none", "message": {"text": "Commented-code block (5 lines) in pwa/pwa-assets.config.ts:7"}, "properties": {"repobilityId": "9a7d931056b691e5", "scanner": "scanner-primary", "fingerprint": "465effe2caec22b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4ad79482bdf9a686", "level": "none", "message": {"text": "Commented-code block (8 lines) in public/kill-sw.js:3"}, "properties": {"repobilityId": "c6eefbd5a6c719c2", "scanner": "scanner-primary", "fingerprint": "4ad79482bdf9a686", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-18632e2bccbdf596", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/UpdatePrompt.tsx:13"}, "properties": {"repobilityId": "6b12e963edcb8db3", "scanner": "scanner-primary", "fingerprint": "18632e2bccbdf596", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e6296481f9f1ea28", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/FitText.tsx:4"}, "properties": {"repobilityId": "eb439ad0f8282ed3", "scanner": "scanner-primary", "fingerprint": "e6296481f9f1ea28", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c95b2be82dfb614a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/AppLayout.tsx:95"}, "properties": {"repobilityId": "b5c6bdc6591abe17", "scanner": "scanner-primary", "fingerprint": "c95b2be82dfb614a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5c1e6186eb854f12", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/MobileAppLayout.tsx:118"}, "properties": {"repobilityId": "a43c3cdbdb45a93c", "scanner": "scanner-primary", "fingerprint": "5c1e6186eb854f12", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ddec05c27da200b7", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/Markdown.tsx:6"}, "properties": {"repobilityId": "807c67941c50eb68", "scanner": "scanner-primary", "fingerprint": "ddec05c27da200b7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-27781eef286a854d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/transactions/tx-form-utils.ts:45"}, "properties": {"repobilityId": "bca8e33de40b7b96", "scanner": "scanner-primary", "fingerprint": "27781eef286a854d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3fea137da0094244", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/ui/dialog.tsx:9"}, "properties": {"repobilityId": "59a2314ad53cd129", "scanner": "scanner-primary", "fingerprint": "3fea137da0094244", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cfc6867bb3e8497e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/api.ts:17"}, "properties": {"repobilityId": "531b2787e2aa3369", "scanner": "scanner-primary", "fingerprint": "cfc6867bb3e8497e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2b2a4307a2459fb7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api.ts:88"}, "properties": {"repobilityId": "41843b2649f9d80c", "scanner": "scanner-primary", "fingerprint": "2b2a4307a2459fb7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a245d6479ffaad4a", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/lib/data-events.ts:5"}, "properties": {"repobilityId": "3f13e695d38426cd", "scanner": "scanner-primary", "fingerprint": "a245d6479ffaad4a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4df9f646452f7b18", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/money.ts:5"}, "properties": {"repobilityId": "181471f520ba476e", "scanner": "scanner-primary", "fingerprint": "4df9f646452f7b18", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-03e6a832ef3927c3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/image-upload.ts:1"}, "properties": {"repobilityId": "840e3eff04ab97a2", "scanner": "scanner-primary", "fingerprint": "03e6a832ef3927c3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec509bc42713c56a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/notifications.ts:3"}, "properties": {"repobilityId": "894fd0e8bfafbd0c", "scanner": "scanner-primary", "fingerprint": "ec509bc42713c56a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c8607e535486fd8a", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/admin-roles.ts:25"}, "properties": {"repobilityId": "955bd1646bef2e10", "scanner": "scanner-primary", "fingerprint": "c8607e535486fd8a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-55dd7c8a48bb31e4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/attachments-client.ts:87"}, "properties": {"repobilityId": "a7b56b5035807723", "scanner": "scanner-primary", "fingerprint": "55dd7c8a48bb31e4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-56e0e897b3845f63", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/money-flow.ts:6"}, "properties": {"repobilityId": "bb333991281061bb", "scanner": "scanner-primary", "fingerprint": "56e0e897b3845f63", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-24b023850a3d22f0", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/dashboard-layout.ts:1"}, "properties": {"repobilityId": "c636eb6a591338b2", "scanner": "scanner-primary", "fingerprint": "24b023850a3d22f0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-38872853fbed3cd9", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/api-router.ts:3"}, "properties": {"repobilityId": "cb5fe9d613b8e4f3", "scanner": "scanner-primary", "fingerprint": "38872853fbed3cd9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a3ca00db15364066", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/notification-context.tsx:6"}, "properties": {"repobilityId": "052af12865fb1c6d", "scanner": "scanner-primary", "fingerprint": "a3ca00db15364066", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3bef96ce4d934f64", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/billing-currency.ts:3"}, "properties": {"repobilityId": "9aa453ff9895b3b3", "scanner": "scanner-primary", "fingerprint": "3bef96ce4d934f64", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b759bcdbaaa8a85c", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/spaces.ts:1"}, "properties": {"repobilityId": "0a0cc2051ce41a85", "scanner": "scanner-primary", "fingerprint": "b759bcdbaaa8a85c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2311a14f9f98f8c1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/recurring-transfer.ts:1"}, "properties": {"repobilityId": "5191f6353d1b77c0", "scanner": "scanner-primary", "fingerprint": "2311a14f9f98f8c1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bb96fb862b7a2765", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/types.ts:73"}, "properties": {"repobilityId": "690603b6b49503df", "scanner": "scanner-primary", "fingerprint": "bb96fb862b7a2765", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c2db3dd21e0408fd", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/schedule-notifications.ts:3"}, "properties": {"repobilityId": "41115241d4a8a402", "scanner": "scanner-primary", "fingerprint": "c2db3dd21e0408fd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-072419ace6c04837", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/use-redirect-to-app.ts:3"}, "properties": {"repobilityId": "f22c5b12fa913b97", "scanner": "scanner-primary", "fingerprint": "072419ace6c04837", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c12c8ba8c5a8a94", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/wealth-ledger.ts:3"}, "properties": {"repobilityId": "dfe3a29fe9a06d67", "scanner": "scanner-primary", "fingerprint": "2c12c8ba8c5a8a94", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d457543fd08b69d3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/i18n/use-language.ts:8"}, "properties": {"repobilityId": "b58bf23bec66284a", "scanner": "scanner-primary", "fingerprint": "d457543fd08b69d3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-048587dd894a9b7a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/pwa/web-push.ts:1"}, "properties": {"repobilityId": "66fb69d3f796d01b", "scanner": "scanner-primary", "fingerprint": "048587dd894a9b7a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-043237194982ed49", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/pwa/register-sw.ts:31"}, "properties": {"repobilityId": "413dd8daaefff7f3", "scanner": "scanner-primary", "fingerprint": "043237194982ed49", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dddb3cfbebd960e8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/pwa/use-install-prompt.ts:18"}, "properties": {"repobilityId": "c984f76eb3927041", "scanner": "scanner-primary", "fingerprint": "dddb3cfbebd960e8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9217793f0a97d16", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/pwa/chunk-recovery.ts:3"}, "properties": {"repobilityId": "807e8be2751bdd01", "scanner": "scanner-primary", "fingerprint": "b9217793f0a97d16", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1eeedee764139168", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/db/schema.ts:199"}, "properties": {"repobilityId": "b01063b1965be971", "scanner": "scanner-primary", "fingerprint": "1eeedee764139168", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5ef433f3c5618a05", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/db/retry.ts:3"}, "properties": {"repobilityId": "55bc48188e8cb9e4", "scanner": "scanner-primary", "fingerprint": "5ef433f3c5618a05", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c46f978378468e1c", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/db/index.ts:8"}, "properties": {"repobilityId": "efc8ba465bf4f351", "scanner": "scanner-primary", "fingerprint": "c46f978378468e1c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5944d607c7957dee", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/seo/site.ts:14"}, "properties": {"repobilityId": "16f7597c30b96d5d", "scanner": "scanner-primary", "fingerprint": "5944d607c7957dee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ff6b7a874b746d7c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/QuotationsPage.tsx:206"}, "properties": {"repobilityId": "b39a7cda01aae3eb", "scanner": "scanner-primary", "fingerprint": "ff6b7a874b746d7c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f709e08dbbcde035", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/MoneyFlowPage.tsx:295"}, "properties": {"repobilityId": "4cf34215d10fae57", "scanner": "scanner-primary", "fingerprint": "f709e08dbbcde035", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe249c04f660e0ad", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/Dashboard.tsx:147"}, "properties": {"repobilityId": "e43596f8e8c64993", "scanner": "scanner-primary", "fingerprint": "fe249c04f660e0ad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d7290005a644e26", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/pages/WealthPage.tsx:66"}, "properties": {"repobilityId": "7c0f332c238e5118", "scanner": "scanner-primary", "fingerprint": "5d7290005a644e26", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9b770ff3c29cd2fb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/admin/AdminPlansPage.tsx:111"}, "properties": {"repobilityId": "d9097e26367a6c82", "scanner": "scanner-primary", "fingerprint": "9b770ff3c29cd2fb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-126965a0d65b162f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/landing/blog/useBlog.ts:46"}, "properties": {"repobilityId": "e49375166eadac77", "scanner": "scanner-primary", "fingerprint": "126965a0d65b162f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5cff410ad2bfd64f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/landing/blog/useSeo.ts:3"}, "properties": {"repobilityId": "aeb78974eb4b20f9", "scanner": "scanner-primary", "fingerprint": "5cff410ad2bfd64f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-80f930e413de0be3", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/landing/lib/useSpaNav.ts:4"}, "properties": {"repobilityId": "db8f55e3c564a450", "scanner": "scanner-primary", "fingerprint": "80f930e413de0be3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6217295ff5c1e5f0", "level": "none", "message": {"text": "Commented-code block (8 lines) in e2e/auth.setup.ts:94"}, "properties": {"repobilityId": "940a645c442ceaec", "scanner": "scanner-primary", "fingerprint": "6217295ff5c1e5f0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c3b47e3a18bfc54", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/auth.setup.ts:123"}, "properties": {"repobilityId": "1b3e6de2f34cede9", "scanner": "scanner-primary", "fingerprint": "2c3b47e3a18bfc54", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-030da566069872e9", "level": "note", "message": {"text": "15 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "0519c1c0e8c1f8e4", "scanner": "scanner-primary", "fingerprint": "030da566069872e9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-5f870067bc2693e7", "level": "warning", "message": {"text": "Frontend route `privacy-policy` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "3a5312d33a967c60", "scanner": "scanner-primary", "fingerprint": "5f870067bc2693e7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cb6cdc2b8d06fae5", "level": "warning", "message": {"text": "Frontend route `terms-of-service` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "6e2851f3ad63ab88", "scanner": "scanner-primary", "fingerprint": "cb6cdc2b8d06fae5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0ef62b429f63fe1a", "level": "warning", "message": {"text": "Frontend route `refund-policy` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "7a1045a7b5f091a9", "scanner": "scanner-primary", "fingerprint": "0ef62b429f63fe1a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-89944ed3eb590061", "level": "warning", "message": {"text": "Frontend route `blog` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "d5dc4db43b974a2d", "scanner": "scanner-primary", "fingerprint": "89944ed3eb590061", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-594931b37933153c", "level": "warning", "message": {"text": "Frontend route `blog/:slug` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "e0c00591e71c54d7", "scanner": "scanner-primary", "fingerprint": "594931b37933153c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-918a1b78edaee874", "level": "warning", "message": {"text": "Frontend route `invitations/:token` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "7f901ae0efd26b57", "scanner": "scanner-primary", "fingerprint": "918a1b78edaee874", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c26202481f0f2b85", "level": "warning", "message": {"text": "Frontend route `login/*` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "81bc58c277c24bbd", "scanner": "scanner-primary", "fingerprint": "c26202481f0f2b85", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-469d4d49cacbf705", "level": "warning", "message": {"text": "Frontend route `signup/*` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "55adfeab9d549ca8", "scanner": "scanner-primary", "fingerprint": "469d4d49cacbf705", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f2d6a5ecb8f2b1d2", "level": "warning", "message": {"text": "Frontend route `forgot-password` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "10a02b57750ea312", "scanner": "scanner-primary", "fingerprint": "f2d6a5ecb8f2b1d2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f61bc5317d2f023d", "level": "warning", "message": {"text": "Frontend route `reset-password` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "939f7972ccd1e998", "scanner": "scanner-primary", "fingerprint": "f61bc5317d2f023d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a23c2f3e3fe7a22f", "level": "warning", "message": {"text": "Frontend route `onboarding` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "004c913e36d90ff3", "scanner": "scanner-primary", "fingerprint": "a23c2f3e3fe7a22f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c8a179cd751f19c5", "level": "warning", "message": {"text": "Frontend route `organization-setup` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "894792e633980fd7", "scanner": "scanner-primary", "fingerprint": "c8a179cd751f19c5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fea04209d8ae8555", "level": "warning", "message": {"text": "Frontend route `users` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "77ef62fee89e9f10", "scanner": "scanner-primary", "fingerprint": "fea04209d8ae8555", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e45a1234275957aa", "level": "warning", "message": {"text": "Frontend route `organizations` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "d0abd16a17a98760", "scanner": "scanner-primary", "fingerprint": "e45a1234275957aa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e6dbf87fc09d5470", "level": "warning", "message": {"text": "Frontend route `organizations/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "759a9ea188e9c44f", "scanner": "scanner-primary", "fingerprint": "e6dbf87fc09d5470", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e6e7889f0ade2a1a", "level": "warning", "message": {"text": "Frontend route `subscriptions` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "f36ef1e70baa4bde", "scanner": "scanner-primary", "fingerprint": "e6e7889f0ade2a1a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c6b1063982c47250", "level": "warning", "message": {"text": "Frontend route `invoices` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "3b0550ed7e59599d", "scanner": "scanner-primary", "fingerprint": "c6b1063982c47250", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ab4f3719ff475c5f", "level": "warning", "message": {"text": "Frontend route `billing-attempts` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "0a3a2acf2c138c19", "scanner": "scanner-primary", "fingerprint": "ab4f3719ff475c5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fb1caf12bdb7300c", "level": "warning", "message": {"text": "Frontend route `plans` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "3134730a22fc0ba0", "scanner": "scanner-primary", "fingerprint": "fb1caf12bdb7300c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b8b8d0b0c900c62f", "level": "warning", "message": {"text": "Frontend route `referrals` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "9461eeaaccc7595d", "scanner": "scanner-primary", "fingerprint": "b8b8d0b0c900c62f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e9a5eaf3d666c71e", "level": "warning", "message": {"text": "Frontend route `worker` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "da88032bd9fe881c", "scanner": "scanner-primary", "fingerprint": "e9a5eaf3d666c71e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-426a3161a17b93e0", "level": "warning", "message": {"text": "Frontend route `broadcasts` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "ee44f4d24ce9ce72", "scanner": "scanner-primary", "fingerprint": "426a3161a17b93e0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-15ff6f7e555ec2ed", "level": "warning", "message": {"text": "Frontend route `user-groups` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "d1cb5f98a91c3941", "scanner": "scanner-primary", "fingerprint": "15ff6f7e555ec2ed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-76c3df96bdc4f90b", "level": "warning", "message": {"text": "Frontend route `admins` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "6288231a7529295f", "scanner": "scanner-primary", "fingerprint": "76c3df96bdc4f90b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cef386312d50c26d", "level": "warning", "message": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "7176b9e63e301c9b", "scanner": "scanner-primary", "fingerprint": "cef386312d50c26d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b113530310976905", "level": "warning", "message": {"text": "Frontend route `clients` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "6c9162acfa5ee47e", "scanner": "scanner-primary", "fingerprint": "b113530310976905", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-48fa5e91cd31e011", "level": "warning", "message": {"text": "Frontend route `clients/closed` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "700027b57e3c6bc8", "scanner": "scanner-primary", "fingerprint": "48fa5e91cd31e011", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4bc73e666d3871e9", "level": "warning", "message": {"text": "Frontend route `clients/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "224146d5bc39c9b9", "scanner": "scanner-primary", "fingerprint": "4bc73e666d3871e9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1308c85998b5493b", "level": "warning", "message": {"text": "Frontend route `clients/:id/files` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "351948fe9ef43eb9", "scanner": "scanner-primary", "fingerprint": "1308c85998b5493b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9ac98cf781049a5d", "level": "warning", "message": {"text": "Frontend route `transactions` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "30e7b394f6dda288", "scanner": "scanner-primary", "fingerprint": "9ac98cf781049a5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-26f4c71e514629ca", "level": "warning", "message": {"text": "Frontend route `recurring` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "a152f25d0ecc4f1b", "scanner": "scanner-primary", "fingerprint": "26f4c71e514629ca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c8e4000b565c4f77", "level": "warning", "message": {"text": "Frontend route `calendar` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "24fc59df23dca5be", "scanner": "scanner-primary", "fingerprint": "c8e4000b565c4f77", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-198c6cd5c07a1170", "level": "warning", "message": {"text": "Frontend route `flow` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "1b8628ac2c2d3c96", "scanner": "scanner-primary", "fingerprint": "198c6cd5c07a1170", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-88bea86a3d497b55", "level": "warning", "message": {"text": "Frontend route `wealth` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "eb0c4f943f45d126", "scanner": "scanner-primary", "fingerprint": "88bea86a3d497b55", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-890c9e4d8486eb35", "level": "warning", "message": {"text": "Frontend route `wealth/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "06c11f6a2fa1cbb2", "scanner": "scanner-primary", "fingerprint": "890c9e4d8486eb35", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-039e055b13e8d50f", "level": "warning", "message": {"text": "Frontend route `spaces` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "bd6bb5fa345eccf5", "scanner": "scanner-primary", "fingerprint": "039e055b13e8d50f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0175b30b86fa1fe1", "level": "warning", "message": {"text": "Frontend route `spaces/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "21886331f6326405", "scanner": "scanner-primary", "fingerprint": "0175b30b86fa1fe1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ddc1f0e866f6323f", "level": "warning", "message": {"text": "Frontend route `analytics` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "5dd95ee593452334", "scanner": "scanner-primary", "fingerprint": "ddc1f0e866f6323f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5eea6ac24aef1c6e", "level": "warning", "message": {"text": "Frontend route `categories` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "dcf182e3114192b8", "scanner": "scanner-primary", "fingerprint": "5eea6ac24aef1c6e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-61fcd655756b6e35", "level": "warning", "message": {"text": "Frontend route `budgets` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "6e8207d77bde220a", "scanner": "scanner-primary", "fingerprint": "61fcd655756b6e35", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b2e092c883f41d1d", "level": "warning", "message": {"text": "Frontend route `budgets/:key` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "9d370b93d6047332", "scanner": "scanner-primary", "fingerprint": "b2e092c883f41d1d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9c6781816b23f921", "level": "warning", "message": {"text": "Frontend route `quotations` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "6e169a4f09c3358c", "scanner": "scanner-primary", "fingerprint": "9c6781816b23f921", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1bae38b7bd5ec22d", "level": "warning", "message": {"text": "Frontend route `organizations/:id/members` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "5050b398b3576f09", "scanner": "scanner-primary", "fingerprint": "1bae38b7bd5ec22d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a5b626331c1abf81", "level": "warning", "message": {"text": "Frontend route `subscription` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "d005167d0872bd06", "scanner": "scanner-primary", "fingerprint": "a5b626331c1abf81", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-87903f6f064cac08", "level": "warning", "message": {"text": "Frontend route `trash` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "afc2aa55c3dc0e74", "scanner": "scanner-primary", "fingerprint": "87903f6f064cac08", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1087e39a1f7f1f80", "level": "warning", "message": {"text": "Frontend route `notifications` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "3b22a826a77c3550", "scanner": "scanner-primary", "fingerprint": "1087e39a1f7f1f80", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-11feb210c2f50b50", "level": "warning", "message": {"text": "Frontend route `profile` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "96c44ef5fce161fb", "scanner": "scanner-primary", "fingerprint": "11feb210c2f50b50", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3ca5aa3978bae256", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (api/_lib/email.ts:33)"}, "properties": {"repobilityId": "f927b40208ce9b3c", "scanner": "scanner-primary", "fingerprint": "3ca5aa3978bae256", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-520da91169a2dfaf", "level": "error", "message": {"text": "Dangling fetch: POST /api/transactions/${txId}/attachments (src/components/transactions/tx-form-utils.ts:45)"}, "properties": {"repobilityId": "fee3539d37d94352", "scanner": "scanner-primary", "fingerprint": "520da91169a2dfaf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1c2c6818aa6a323b", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/trash/purge (src/pages/TrashPage.tsx:87)"}, "properties": {"repobilityId": "5e59dd8501cb2ce6", "scanner": "scanner-primary", "fingerprint": "1c2c6818aa6a323b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9b0c023034e7d7a1", "level": "error", "message": {"text": "Dangling fetch: POST /api/quotations/${viewTarget.id}/attachments (src/pages/QuotationsPage.tsx:375)"}, "properties": {"repobilityId": "53febe3bd3f187b5", "scanner": "scanner-primary", "fingerprint": "9b0c023034e7d7a1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5dd4a95638c4314c", "level": "error", "message": {"text": "Dangling fetch: GET /api/quotation-attachments/${attachment.id} (src/pages/QuotationsPage.tsx:405)"}, "properties": {"repobilityId": "5a27e9a3d5cba9c8", "scanner": "scanner-primary", "fingerprint": "5dd4a95638c4314c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c55b38a82a0c1fa5", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/quotation-attachments/${deleteAttachId} (src/pages/QuotationsPage.tsx:426)"}, "properties": {"repobilityId": "648034193b31576a", "scanner": "scanner-primary", "fingerprint": "c55b38a82a0c1fa5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eb34b01ea1d6b9e9", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/organizations/${id}/members (src/pages/OrgMembersPage.tsx:147)"}, "properties": {"repobilityId": "e8e182be61fff409", "scanner": "scanner-primary", "fingerprint": "eb34b01ea1d6b9e9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7469872a1dc52cc5", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/organizations/${id}/members (src/pages/OrgMembersPage.tsx:168)"}, "properties": {"repobilityId": "611098ac302493b1", "scanner": "scanner-primary", "fingerprint": "7469872a1dc52cc5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c0026b952abe884d", "level": "error", "message": {"text": "Dangling fetch: GET /api/billing/invoice-pdf?id=${invoice.id} (src/pages/SubscriptionPage.tsx:334)"}, "properties": {"repobilityId": "3012afe0957a6183", "scanner": "scanner-primary", "fingerprint": "c0026b952abe884d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a35e337568b1fb81", "level": "error", "message": {"text": "Dangling fetch: POST /api/transactions/${viewTx.id}/attachments (src/pages/TransactionsPage.tsx:466)"}, "properties": {"repobilityId": "deb447adf0f1fd9a", "scanner": "scanner-primary", "fingerprint": "a35e337568b1fb81", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1f63d05c61d08a6e", "level": "error", "message": {"text": "Dangling fetch: GET /api/attachments/${attachment.id} (src/pages/TransactionsPage.tsx:496)"}, "properties": {"repobilityId": "a0b578115aaf023a", "scanner": "scanner-primary", "fingerprint": "1f63d05c61d08a6e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-38b26d2a18e590b3", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/attachments/${deleteAttachId} (src/pages/TransactionsPage.tsx:517)"}, "properties": {"repobilityId": "79c81acc62ec568d", "scanner": "scanner-primary", "fingerprint": "38b26d2a18e590b3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ca70a6332ad1eaf5", "level": "error", "message": {"text": "Dangling fetch: GET /api/invitations/${token} (src/pages/InvitationPage.tsx:35)"}, "properties": {"repobilityId": "95ef306966984d4d", "scanner": "scanner-primary", "fingerprint": "ca70a6332ad1eaf5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cc3922e9c4c3cd7e", "level": "error", "message": {"text": "Dangling fetch: POST /api/invitations/${token} (src/pages/InvitationPage.tsx:62)"}, "properties": {"repobilityId": "f633b92d0a9cdb1b", "scanner": "scanner-primary", "fingerprint": "cc3922e9c4c3cd7e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eb7c2d8d2e45427f", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/invitations/${token} (src/pages/InvitationPage.tsx:105)"}, "properties": {"repobilityId": "8c821bfb44c622b5", "scanner": "scanner-primary", "fingerprint": "eb7c2d8d2e45427f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e102724741707ccf", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/invoices?invoice_id=${inv.id}&document=1 (src/pages/admin/AdminInvoicesPage.tsx:168)"}, "properties": {"repobilityId": "068c20f196f6c9f4", "scanner": "scanner-primary", "fingerprint": "e102724741707ccf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-08c001ec5cd81e73", "level": "error", "message": {"text": "Dangling fetch: GET /api/public/blog/${encodeURIComponent(slug)} (src/landing/blog/useBlog.ts:97)"}, "properties": {"repobilityId": "04f7a2d6c51a65b4", "scanner": "scanner-primary", "fingerprint": "08c001ec5cd81e73", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-74d25284019fc63d", "level": "error", "message": {"text": "Dangling fetch: GET /api/public/pricing (src/landing/lib/usePricing.ts:47)"}, "properties": {"repobilityId": "24e3ac0f931479b1", "scanner": "scanner-primary", "fingerprint": "74d25284019fc63d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-00076e898ed5ada7", "level": "error", "message": {"text": "Dangling fetch: POST /api/onboarding (e2e/auth.setup.ts:123)"}, "properties": {"repobilityId": "3818543841451336", "scanner": "scanner-primary", "fingerprint": "00076e898ed5ada7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dde3adb27bf7eebe", "level": "note", "message": {"text": "Unused endpoint: USE /api"}, "properties": {"repobilityId": "ede4bbc6253ae0cd", "scanner": "scanner-primary", "fingerprint": "dde3adb27bf7eebe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-684f0e83ba7e1558", "level": "note", "message": {"text": "Unused endpoint: GET "}, "properties": {"repobilityId": "efa08c6ccdcd5064", "scanner": "scanner-primary", "fingerprint": "684f0e83ba7e1558", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}