{"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-065afc4ebece0fc6", "name": "Stray `console.log` in TS/JS \u2014 seed-deals.js:215", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 seed-deals.js:215"}, "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-6acb5d3ae91bf4a2", "name": "`truncate` class without `title=` for hover reveal \u2014 AddDealModal.tsx:368", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 AddDealModal.tsx:368"}, "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-7145366baa82fa90", "name": "Stray `console.log` in TS/JS \u2014 packages/database/prisma/seed.ts:4", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/database/prisma/seed.ts:4"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b136342abd013233", "name": "Stray `console.log` in TS/JS \u2014 packages/database/prisma/seed-demo-account.ts:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/database/prisma/seed-demo-account.ts:6"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d35a1a9ad0199e1d", "name": "Stray `console.log` in TS/JS \u2014 dispo-platform/apps/web/src/app/(dashboard)/dashboard/deals/[id]/page.tsx:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 dispo-platform/apps/web/src/app/(dashboard)/dashboard/deals/[id]/page.tsx:45"}, "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-008ea427478ba0f2", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/app.module.ts:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/app.module.ts:67"}, "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-a6ecc07025c5ce87", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/modules/deals/deals-ai-analyze.service.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/modules/deals/deals-ai-analyze.service.ts:12"}, "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-cf6259a2cc64a335", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/modules/deals/deals.service.ts:252", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/modules/deals/deals.service.ts:252"}, "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-7d8d129672bd2916", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/modules/deals/arv-engine.service.ts:168", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/modules/deals/arv-engine.service.ts:168"}, "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-81ba64fb52aff924", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/axesso/market-competition/route.ts:440", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/axesso/market-competition/route.ts:440"}, "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-3ec57c39931d345e", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/axesso/market-competition/enrich/route.ts:56", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/axesso/market-competition/enrich/route.ts:56"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b72f3b13460f4e46", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/axesso/investor-price/route.ts:834", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/axesso/investor-price/route.ts:834"}, "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-e35a43f9332b4d98", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/axesso/comp-review/route.ts:2314", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/axesso/comp-review/route.ts:2314"}, "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-340c9a99bd3f4879", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/axesso/comp-review-v2/route.ts:772", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/axesso/comp-review-v2/route.ts:772"}, "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-f8c5f34c2f3fe89e", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/deals/market-competition/brain/route.ts:624", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/deals/market-competition/brain/route.ts:624"}, "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-0e53ed342fe8df5a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(dashboard)/dashboard/messages/page.tsx:728", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(dashboard)/dashboard/messages/page.tsx:728"}, "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-b6cb2e8da40ef583", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(dashboard)/dashboard/deals/page.tsx:454", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(dashboard)/dashboard/deals/page.tsx:454"}, "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-0853005ac1d1c6e1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(dashboard)/dashboard/deals/[id]/page.tsx:725", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(dashboard)/dashboard/deals/[id]/page.tsx:725"}, "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-890a2925089da875", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(dashboard)/dashboard/buyers/page.tsx:1136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(dashboard)/dashboard/buyers/page.tsx:1136"}, "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-58bbc86e8ca9b510", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(dashboard)/dashboard/buyers/[id]/page.tsx:948", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(dashboard)/dashboard/buyers/[id]/page.tsx:948"}, "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-90fe7646792c4a79", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(dashboard)/dashboard/campaigns/page.tsx:794", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(dashboard)/dashboard/campaigns/page.tsx:794"}, "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-5451d637d8bb743c", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/deals/DealRedesignPage.tsx:770", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/deals/DealRedesignPage.tsx:770"}, "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-8527a558b0f24740", "name": "Icon-only button without accessible name \u2014 apps/web/src/components/deals/CompReviewBoard.tsx:1880", "shortDescription": {"text": "Icon-only button without accessible name \u2014 apps/web/src/components/deals/CompReviewBoard.tsx:1880"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a388322529a44a3c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/deals/CompReviewBoard.tsx:2235", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/deals/CompReviewBoard.tsx:2235"}, "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-9e855d85d7417a7d", "name": "TODO/FIXME marker in shipping code \u2014 apps/web/src/components/deals/CompReviewBoard.tsx:1807", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/src/components/deals/CompReviewBoard.tsx:1807"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a5a1f9a66eb39e8a", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/deals/CompReviewBoard.tsx:1111", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/deals/CompReviewBoard.tsx:1111"}, "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-ee670aaca62441ff", "name": "Icon-only button without accessible name \u2014 apps/web/src/components/deals/InvestorPriceEvidence.tsx:1626", "shortDescription": {"text": "Icon-only button without accessible name \u2014 apps/web/src/components/deals/InvestorPriceEvidence.tsx:1626"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-42b46b4599c3b558", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/deals/InvestorPriceEvidence.tsx:1795", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/deals/InvestorPriceEvidence.tsx:1795"}, "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-9bf9fb763d9681d4", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/analytics/index.tsx:83", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/analytics/index.tsx:83"}, "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-4fd88ff910f3dd7e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/deal/AddDealModal.tsx:503", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/deal/AddDealModal.tsx:503"}, "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-d9980d9104825b19", "name": "Dockerfile runs as root: apps/api/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: apps/api/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ee70e6ba5833b0cd", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-834248a4229855e2", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/components/deals/DealRedesignPage.tsx:603", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/components/deals/DealRedesignPage.tsx:603"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3aba3c43a377aa0d", "name": "Very large file: apps/web/src/app/api/axesso/investor-price/route.ts (1323 lines)", "shortDescription": {"text": "Very large file: apps/web/src/app/api/axesso/investor-price/route.ts (1323 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-1cc19a90cf06fc6c", "name": "Very large file: apps/web/src/app/api/axesso/comp-review/route.ts (2611 lines)", "shortDescription": {"text": "Very large file: apps/web/src/app/api/axesso/comp-review/route.ts (2611 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-1f5351a624180ec0", "name": "Very large file: apps/web/src/app/api/axesso/comp-review-v2/route.ts (1398 lines)", "shortDescription": {"text": "Very large file: apps/web/src/app/api/axesso/comp-review-v2/route.ts (1398 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-a756e59caec9ed26", "name": "Very large file: apps/web/src/app/(dashboard)/dashboard/messages/page.tsx (1117 lines)", "shortDescription": {"text": "Very large file: apps/web/src/app/(dashboard)/dashboard/messages/page.tsx (1117 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-ee552a41e873912c", "name": "Very large file: apps/web/src/app/(dashboard)/dashboard/deals/[id]/page.tsx (2088 lines)", "shortDescription": {"text": "Very large file: apps/web/src/app/(dashboard)/dashboard/deals/[id]/page.tsx (2088 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-c37fb8c04bcfe295", "name": "Very large file: apps/web/src/app/(dashboard)/dashboard/buyers/page.tsx (2327 lines)", "shortDescription": {"text": "Very large file: apps/web/src/app/(dashboard)/dashboard/buyers/page.tsx (2327 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-ca94489a85bb288a", "name": "Very large file: apps/web/src/app/(dashboard)/dashboard/buyers/[id]/page.tsx (1907 lines)", "shortDescription": {"text": "Very large file: apps/web/src/app/(dashboard)/dashboard/buyers/[id]/page.tsx (1907 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-a8596ba60ba6a329", "name": "Very large file: apps/web/src/components/deals/DealRedesignPage.tsx (1562 lines)", "shortDescription": {"text": "Very large file: apps/web/src/components/deals/DealRedesignPage.tsx (1562 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-fcfa4e70225a7b0a", "name": "Very large file: apps/web/src/components/deals/CompReviewBoard.tsx (8344 lines)", "shortDescription": {"text": "Very large file: apps/web/src/components/deals/CompReviewBoard.tsx (8344 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-af16cb72b0f91e2e", "name": "Very large file: apps/web/src/components/deals/InvestorPriceEvidence.tsx (2850 lines)", "shortDescription": {"text": "Very large file: apps/web/src/components/deals/InvestorPriceEvidence.tsx (2850 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": "1 test file(s) for 172 source file(s) (ratio 0.01). 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-b06b8d86f24c77f9", "name": "Node manifest has dependencies but no lockfile: apps/api/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/api/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4a9eb7dc7c6e3880", "name": "Node manifest has dependencies but no lockfile: apps/web/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 192 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 257 placeholder/mock markers across 24 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ebb0e6e7c3e8836f", "name": "Commented-code block (7 lines) in apps/api/src/modules/street-view/street-view-scrape.processor.ts:175", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/modules/street-view/street-view-scrape.processor.ts:175"}, "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-542cdbd9b56407b2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/rentcast/rentcast.service.ts:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/rentcast/rentcast.service.ts:39"}, "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-a40bf9d83fc5c0b3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/anthropic/route.ts:6", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/anthropic/route.ts:6"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-eb2ea27ea10609f8", "name": "Commented-code block (8 lines) in apps/web/src/app/api/axesso/market-competition/route.ts:282", "shortDescription": {"text": "Commented-code block (8 lines) in apps/web/src/app/api/axesso/market-competition/route.ts:282"}, "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-b314779d48be549f", "name": "Commented-code block (5 lines) in apps/web/src/app/api/axesso/investor-price/route.ts:1007", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/app/api/axesso/investor-price/route.ts:1007"}, "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-7ca2aff0eb60c5ce", "name": "Commented-code block (6 lines) in apps/web/src/app/api/axesso/comp-review/route.ts:1428", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/app/api/axesso/comp-review/route.ts:1428"}, "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-ed027748989282bf", "name": "Legacy-named symbol `investor_v2` in apps/web/src/app/api/axesso/comp-review-v2/route.ts:768", "shortDescription": {"text": "Legacy-named symbol `investor_v2` in apps/web/src/app/api/axesso/comp-review-v2/route.ts:768"}, "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-0c9a5ed8a560272a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/deals/market-competition/brain/route.ts:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/deals/market-competition/brain/route.ts:48"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d8aec875c229de5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/intake/[token]/page.tsx:105", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/intake/[token]/page.tsx:105"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-51ea16ea030394c1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(dashboard)/dashboard/messages/page.tsx:439", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(dashboard)/dashboard/messages/page.tsx:439"}, "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-c9112ca4eeae5c5b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(dashboard)/dashboard/deals/page.tsx:708", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(dashboard)/dashboard/deals/page.tsx:708"}, "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-46512bee8d05e233", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(dashboard)/dashboard/deals/ExportDealsButton.tsx:111", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(dashboard)/dashboard/deals/ExportDealsButton.tsx:111"}, "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-2265812eeda9a853", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(dashboard)/dashboard/deals/[id]/page.tsx:1459", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(dashboard)/dashboard/deals/[id]/page.tsx:1459"}, "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-aa3c01ef343ecb26", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(dashboard)/dashboard/buyers/page.tsx:777", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(dashboard)/dashboard/buyers/page.tsx:777"}, "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-145e3cc38d0fc2a9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(dashboard)/dashboard/buyers/[id]/page.tsx:190", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(dashboard)/dashboard/buyers/[id]/page.tsx:190"}, "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-343b3bd65e7423a1", "name": "Legacy-named symbol `HASH_cc_ft1440_v2` in apps/web/src/components/deals/CompReviewBoard.tsx:951", "shortDescription": {"text": "Legacy-named symbol `HASH_cc_ft1440_v2` in apps/web/src/components/deals/CompReviewBoard.tsx:951"}, "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-a9ff55beac749475", "name": "Commented-code block (5 lines) in apps/web/src/components/deals/CompReviewBoard.tsx:992", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/components/deals/CompReviewBoard.tsx:992"}, "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-42e2915bd0821df8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/deals/CompReviewBoard.tsx:1454", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/deals/CompReviewBoard.tsx:1454"}, "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-a548fd2b83c77e2b", "name": "Commented-code block (5 lines) in apps/web/src/components/deals/InvestorPriceEvidence.tsx:176", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/components/deals/InvestorPriceEvidence.tsx:176"}, "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-4b7c97378acd212b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/deals/InvestorPriceEvidence.tsx:1536", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/deals/InvestorPriceEvidence.tsx:1536"}, "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-dc561dd05aba3a17", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/deals/StreetViewTimeline.tsx:183", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/deals/StreetViewTimeline.tsx:183"}, "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-ee6568033a1f43b6", "name": "Dangling fetch: POST https://places.googleapis.com/v1/places:autocomplete?key=${GKEY} (apps/api/src/modules/places/place", "shortDescription": {"text": "Dangling fetch: POST https://places.googleapis.com/v1/places:autocomplete?key=${GKEY} (apps/api/src/modules/places/places.controller.ts:12)"}, "fullDescription": {"text": "`apps/api/src/modules/places/places.controller.ts:12` calls `POST https://places.googleapis.com/v1/places:autocomplete?key=${GKEY}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/places.googleapis.com/v1/places/<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-b52e15a9b4c892b3", "name": "Dangling fetch: GET https://places.googleapis.com/v1/places/${placeId}?key=${GKEY}&fields=addressComponents (apps/api/sr", "shortDescription": {"text": "Dangling fetch: GET https://places.googleapis.com/v1/places/${placeId}?key=${GKEY}&fields=addressComponents (apps/api/src/modules/places/places.controller.ts:34)"}, "fullDescription": {"text": "`apps/api/src/modules/places/places.controller.ts:34` calls `GET https://places.googleapis.com/v1/places/${placeId}?key=${GKEY}&fields=addressComponents` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/places.googleapis.com/v1/places/<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-1252aad93c74f413", "name": "Dangling fetch: GET /search-by-address (apps/api/src/modules/axesso/axesso.service.ts:114)", "shortDescription": {"text": "Dangling fetch: GET /search-by-address (apps/api/src/modules/axesso/axesso.service.ts:114)"}, "fullDescription": {"text": "`apps/api/src/modules/axesso/axesso.service.ts:114` calls `GET /search-by-address` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/search-by-address`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-30acf170115604ce", "name": "Dangling fetch: GET /search (apps/api/src/modules/axesso/axesso.service.ts:118)", "shortDescription": {"text": "Dangling fetch: GET /search (apps/api/src/modules/axesso/axesso.service.ts:118)"}, "fullDescription": {"text": "`apps/api/src/modules/axesso/axesso.service.ts:118` calls `GET /search` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/search`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-90f1fc27c7991eb2", "name": "Dangling fetch: GET /property-v2 (apps/api/src/modules/axesso/axesso.service.ts:127)", "shortDescription": {"text": "Dangling fetch: GET /property-v2 (apps/api/src/modules/axesso/axesso.service.ts:127)"}, "fullDescription": {"text": "`apps/api/src/modules/axesso/axesso.service.ts:127` calls `GET /property-v2` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/property-v2`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-879c6f7546c41fd3", "name": "Dangling fetch: GET /similar-sold (apps/api/src/modules/axesso/axesso.service.ts:131)", "shortDescription": {"text": "Dangling fetch: GET /similar-sold (apps/api/src/modules/axesso/axesso.service.ts:131)"}, "fullDescription": {"text": "`apps/api/src/modules/axesso/axesso.service.ts:131` calls `GET /similar-sold` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/similar-sold`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ffc6b10d1b8f3527", "name": "Dangling fetch: GET /price-tax-history (apps/api/src/modules/axesso/axesso.service.ts:135)", "shortDescription": {"text": "Dangling fetch: GET /price-tax-history (apps/api/src/modules/axesso/axesso.service.ts:135)"}, "fullDescription": {"text": "`apps/api/src/modules/axesso/axesso.service.ts:135` calls `GET /price-tax-history` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/price-tax-history`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1138eb3bd41ebfb1", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/api/src/modules/deals/deals.service.ts:277)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/api/src/modules/deals/deals.service.ts:277)"}, "fullDescription": {"text": "`apps/api/src/modules/deals/deals.service.ts:277` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-273d1657333eca52", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/api/src/modules/deals/deals.service.ts:295)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/api/src/modules/deals/deals.service.ts:295)"}, "fullDescription": {"text": "`apps/api/src/modules/deals/deals.service.ts:295` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7330bb2862184609", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/api/src/modules/deals/arv-engine.service.ts:153)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/api/src/modules/deals/arv-engine.service.ts:153)"}, "fullDescription": {"text": "`apps/api/src/modules/deals/arv-engine.service.ts:153` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-878ff284ab0a271a", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/api/src/modules/deals/arv-engine.service.ts:194)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/api/src/modules/deals/arv-engine.service.ts:194)"}, "fullDescription": {"text": "`apps/api/src/modules/deals/arv-engine.service.ts:194` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e2735d995b0ad02b", "name": "Dangling fetch: GET /api/deal-page-tokens/${token} (apps/web/src/app/d/[token]/page.tsx:386)", "shortDescription": {"text": "Dangling fetch: GET /api/deal-page-tokens/${token} (apps/web/src/app/d/[token]/page.tsx:386)"}, "fullDescription": {"text": "`apps/web/src/app/d/[token]/page.tsx:386` calls `GET /api/deal-page-tokens/${token}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/deal-page-tokens/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-51de1dc3ea30a7c9", "name": "Dangling fetch: POST /api/deal-page-tokens/${token}/event (apps/web/src/app/d/[token]/page.tsx:417)", "shortDescription": {"text": "Dangling fetch: POST /api/deal-page-tokens/${token}/event (apps/web/src/app/d/[token]/page.tsx:417)"}, "fullDescription": {"text": "`apps/web/src/app/d/[token]/page.tsx:417` calls `POST /api/deal-page-tokens/${token}/event` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/deal-page-tokens/<p>/event`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-43c02eff22bd33df", "name": "Dangling fetch: POST /api/deal-page-tokens/${token}/event (apps/web/src/app/d/[token]/page.tsx:446)", "shortDescription": {"text": "Dangling fetch: POST /api/deal-page-tokens/${token}/event (apps/web/src/app/d/[token]/page.tsx:446)"}, "fullDescription": {"text": "`apps/web/src/app/d/[token]/page.tsx:446` calls `POST /api/deal-page-tokens/${token}/event` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/deal-page-tokens/<p>/event`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-754f03eeed947a6d", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/web/src/app/api/anthropic/route.ts:6)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/web/src/app/api/anthropic/route.ts:6)"}, "fullDescription": {"text": "`apps/web/src/app/api/anthropic/route.ts:6` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-918e6408173ef3ef", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/web/src/app/api/deals/market-competition/brain/route.ts", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/web/src/app/api/deals/market-competition/brain/route.ts:48)"}, "fullDescription": {"text": "`apps/web/src/app/api/deals/market-competition/brain/route.ts:48` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-90e36190c7b0d8f3", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/web/src/app/api/deals/market-competition/brain/rou", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/web/src/app/api/deals/market-competition/brain/route.ts:80)"}, "fullDescription": {"text": "`apps/web/src/app/api/deals/market-competition/brain/route.ts:80` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-83771e554bec6eb6", "name": "Dangling fetch: POST /api/anthropic (apps/web/src/app/(dashboard)/dashboard/messages/page.tsx:439)", "shortDescription": {"text": "Dangling fetch: POST /api/anthropic (apps/web/src/app/(dashboard)/dashboard/messages/page.tsx:439)"}, "fullDescription": {"text": "`apps/web/src/app/(dashboard)/dashboard/messages/page.tsx:439` calls `POST /api/anthropic` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/anthropic`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1234980007f4a823", "name": "Dangling fetch: POST /api/anthropic (apps/web/src/app/(dashboard)/dashboard/messages/page.tsx:457)", "shortDescription": {"text": "Dangling fetch: POST /api/anthropic (apps/web/src/app/(dashboard)/dashboard/messages/page.tsx:457)"}, "fullDescription": {"text": "`apps/web/src/app/(dashboard)/dashboard/messages/page.tsx:457` calls `POST /api/anthropic` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/anthropic`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-75446f2c64370ca8", "name": "Dangling fetch: POST https://api.cloudinary.com/v1_1/dhueussrm/image/upload (apps/web/src/app/(dashboard)/dashboard/deal", "shortDescription": {"text": "Dangling fetch: POST https://api.cloudinary.com/v1_1/dhueussrm/image/upload (apps/web/src/app/(dashboard)/dashboard/deals/[id]/page.tsx:121)"}, "fullDescription": {"text": "`apps/web/src/app/(dashboard)/dashboard/deals/[id]/page.tsx:121` calls `POST https://api.cloudinary.com/v1_1/dhueussrm/image/upload` 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.cloudinary.com/v1_1/dhueussrm/image/upload`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6d313e58809961be", "name": "Dangling fetch: POST https://api.cloudinary.com/v1_1/dhueussrm/auto/upload (apps/web/src/app/(dashboard)/dashboard/buyer", "shortDescription": {"text": "Dangling fetch: POST https://api.cloudinary.com/v1_1/dhueussrm/auto/upload (apps/web/src/app/(dashboard)/dashboard/buyers/[id]/page.tsx:465)"}, "fullDescription": {"text": "`apps/web/src/app/(dashboard)/dashboard/buyers/[id]/page.tsx:465` calls `POST https://api.cloudinary.com/v1_1/dhueussrm/auto/upload` 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.cloudinary.com/v1_1/dhueussrm/auto/upload`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e580111731e58933", "name": "Dangling fetch: POST /api/anthropic (apps/web/src/app/(dashboard)/dashboard/buyers/[id]/page.tsx:469)", "shortDescription": {"text": "Dangling fetch: POST /api/anthropic (apps/web/src/app/(dashboard)/dashboard/buyers/[id]/page.tsx:469)"}, "fullDescription": {"text": "`apps/web/src/app/(dashboard)/dashboard/buyers/[id]/page.tsx:469` calls `POST /api/anthropic` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/anthropic`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ed41299ea7c1170f", "name": "Dangling fetch: POST /api/anthropic (apps/web/src/app/(dashboard)/dashboard/buyers/[id]/page.tsx:477)", "shortDescription": {"text": "Dangling fetch: POST /api/anthropic (apps/web/src/app/(dashboard)/dashboard/buyers/[id]/page.tsx:477)"}, "fullDescription": {"text": "`apps/web/src/app/(dashboard)/dashboard/buyers/[id]/page.tsx:477` calls `POST /api/anthropic` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/anthropic`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4d1990467ac09c93", "name": "Dangling fetch: POST /api/anthropic (apps/web/src/components/deals/CompReviewBoard.tsx:1659)", "shortDescription": {"text": "Dangling fetch: POST /api/anthropic (apps/web/src/components/deals/CompReviewBoard.tsx:1659)"}, "fullDescription": {"text": "`apps/web/src/components/deals/CompReviewBoard.tsx:1659` calls `POST /api/anthropic` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/anthropic`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-84b9be7754f5f683", "name": "Dangling fetch: POST /api/axesso/investor-price (apps/web/src/components/deals/CompReviewBoard.tsx:5466)", "shortDescription": {"text": "Dangling fetch: POST /api/axesso/investor-price (apps/web/src/components/deals/CompReviewBoard.tsx:5466)"}, "fullDescription": {"text": "`apps/web/src/components/deals/CompReviewBoard.tsx:5466` calls `POST /api/axesso/investor-price` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/axesso/investor-price`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-71e759faa8e199f4", "name": "Dangling fetch: POST /api/axesso/market-competition/enrich (apps/web/src/components/deals/CompReviewBoard.tsx:5528)", "shortDescription": {"text": "Dangling fetch: POST /api/axesso/market-competition/enrich (apps/web/src/components/deals/CompReviewBoard.tsx:5528)"}, "fullDescription": {"text": "`apps/web/src/components/deals/CompReviewBoard.tsx:5528` calls `POST /api/axesso/market-competition/enrich` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/axesso/market-competition/enrich`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ca2be2e26d07056e", "name": "Dangling fetch: POST /api/axesso/market-competition (apps/web/src/components/deals/CompReviewBoard.tsx:5600)", "shortDescription": {"text": "Dangling fetch: POST /api/axesso/market-competition (apps/web/src/components/deals/CompReviewBoard.tsx:5600)"}, "fullDescription": {"text": "`apps/web/src/components/deals/CompReviewBoard.tsx:5600` calls `POST /api/axesso/market-competition` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/axesso/market-competition`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d20e96d40db5b123", "name": "Dangling fetch: POST /api/axesso/comp-review-v2 (apps/web/src/components/deals/CompReviewBoard.tsx:5650)", "shortDescription": {"text": "Dangling fetch: POST /api/axesso/comp-review-v2 (apps/web/src/components/deals/CompReviewBoard.tsx:5650)"}, "fullDescription": {"text": "`apps/web/src/components/deals/CompReviewBoard.tsx:5650` calls `POST /api/axesso/comp-review-v2` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/axesso/comp-review-v2`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-37fd51c65188ab85", "name": "Dangling fetch: POST /api/deals/market-competition/brain (apps/web/src/components/deals/CompReviewBoard.tsx:6399)", "shortDescription": {"text": "Dangling fetch: POST /api/deals/market-competition/brain (apps/web/src/components/deals/CompReviewBoard.tsx:6399)"}, "fullDescription": {"text": "`apps/web/src/components/deals/CompReviewBoard.tsx:6399` calls `POST /api/deals/market-competition/brain` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/deals/market-competition/brain`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b809d556cf4582e3", "name": "Dangling fetch: POST /api/axesso/comp-review-v2 (apps/web/src/components/deals/CompReviewBoard.tsx:6538)", "shortDescription": {"text": "Dangling fetch: POST /api/axesso/comp-review-v2 (apps/web/src/components/deals/CompReviewBoard.tsx:6538)"}, "fullDescription": {"text": "`apps/web/src/components/deals/CompReviewBoard.tsx:6538` calls `POST /api/axesso/comp-review-v2` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/axesso/comp-review-v2`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c62e78a68b4e5e38", "name": "Dangling fetch: POST /api/zillow/manual-comp (apps/web/src/components/deals/CompReviewBoard.tsx:6832)", "shortDescription": {"text": "Dangling fetch: POST /api/zillow/manual-comp (apps/web/src/components/deals/CompReviewBoard.tsx:6832)"}, "fullDescription": {"text": "`apps/web/src/components/deals/CompReviewBoard.tsx:6832` calls `POST /api/zillow/manual-comp` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/zillow/manual-comp`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c93951a4c27906e4", "name": "Dangling fetch: POST /api/anthropic (apps/web/src/components/deals/CompReviewBoard.tsx:7199)", "shortDescription": {"text": "Dangling fetch: POST /api/anthropic (apps/web/src/components/deals/CompReviewBoard.tsx:7199)"}, "fullDescription": {"text": "`apps/web/src/components/deals/CompReviewBoard.tsx:7199` calls `POST /api/anthropic` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/anthropic`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0e7726bacb09b877", "name": "Dangling fetch: GET /api/street-view/metadata?lat=${lat}&lng=${lng} (apps/web/src/components/deals/StreetViewTimeline.ts", "shortDescription": {"text": "Dangling fetch: GET /api/street-view/metadata?lat=${lat}&lng=${lng} (apps/web/src/components/deals/StreetViewTimeline.tsx:183)"}, "fullDescription": {"text": "`apps/web/src/components/deals/StreetViewTimeline.tsx:183` calls `GET /api/street-view/metadata?lat=${lat}&lng=${lng}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/street-view/metadata`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f9b23f926bef75b5", "name": "Unused endpoint: POST /deals/import/raw", "shortDescription": {"text": "Unused endpoint: POST /deals/import/raw"}, "fullDescription": {"text": "`AddDealModal.tsx` declares `POST /deals/import/raw` 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-7dd559e732df1227", "name": "Unused endpoint: POST /deals", "shortDescription": {"text": "Unused endpoint: POST /deals"}, "fullDescription": {"text": "`AddDealModal.tsx` declares `POST /deals` 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-b22b0ddda467f51e", "name": "Unused endpoint: GET /analytics/overview", "shortDescription": {"text": "Unused endpoint: GET /analytics/overview"}, "fullDescription": {"text": "`dispo-platform/apps/web/src/app/(dashboard)/dashboard/page.tsx` declares `GET /analytics/overview` 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-14ed472e1411d559", "name": "Unused endpoint: GET /marketplace", "shortDescription": {"text": "Unused endpoint: GET /marketplace"}, "fullDescription": {"text": "`dispo-platform/apps/web/src/app/(dashboard)/dashboard/marketplace/page.tsx` declares `GET /marketplace` 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-d0f253034e0113c2", "name": "Unused endpoint: GET /deals", "shortDescription": {"text": "Unused endpoint: GET /deals"}, "fullDescription": {"text": "`dispo-platform/apps/web/src/app/(dashboard)/dashboard/deals/page.tsx` declares `GET /deals` 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-2bb66bd74d286a97", "name": "Unused endpoint: GET /buyers", "shortDescription": {"text": "Unused endpoint: GET /buyers"}, "fullDescription": {"text": "`dispo-platform/apps/web/src/app/(dashboard)/dashboard/buyers/page.tsx` declares `GET /buyers` 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-5029885582ac804f", "name": "Unused endpoint: GET /analytics/deal-velocity", "shortDescription": {"text": "Unused endpoint: GET /analytics/deal-velocity"}, "fullDescription": {"text": "`dispo-platform/apps/web/src/app/(dashboard)/dashboard/analytics/page.tsx` declares `GET /analytics/deal-velocity` 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-291243e88171da67", "name": "Unused endpoint: GET /analytics/assignment-fees", "shortDescription": {"text": "Unused endpoint: GET /analytics/assignment-fees"}, "fullDescription": {"text": "`dispo-platform/apps/web/src/app/(dashboard)/dashboard/analytics/page.tsx` declares `GET /analytics/assignment-fees` 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-52c5c4eadbd476fd", "name": "Unused endpoint: GET /analytics/rep-performance", "shortDescription": {"text": "Unused endpoint: GET /analytics/rep-performance"}, "fullDescription": {"text": "`dispo-platform/apps/web/src/app/(dashboard)/dashboard/analytics/page.tsx` declares `GET /analytics/rep-performance` 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-cb390396a0cddc2f", "name": "Unused endpoint: GET /dispo/campaigns", "shortDescription": {"text": "Unused endpoint: GET /dispo/campaigns"}, "fullDescription": {"text": "`dispo-platform/apps/web/src/app/(dashboard)/dashboard/dispo/page.tsx` declares `GET /dispo/campaigns` 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-4d65d54440cfeab5", "name": "Unused endpoint: POST /deal-page-tokens/create", "shortDescription": {"text": "Unused endpoint: POST /deal-page-tokens/create"}, "fullDescription": {"text": "`apps/api/src/modules/deal-page-tokens/deal-page-tokens.controller.ts` declares `POST /deal-page-tokens/create` 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-83225696b0dd95ec", "name": "Unused endpoint: GET /deal-page-tokens/token/:token", "shortDescription": {"text": "Unused endpoint: GET /deal-page-tokens/token/:token"}, "fullDescription": {"text": "`apps/api/src/modules/deal-page-tokens/deal-page-tokens.controller.ts` declares `GET /deal-page-tokens/token/:token` 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-0a0001c0a7f6db5c", "name": "Unused endpoint: GET /deal-page-tokens/deal/:dealId/engagement", "shortDescription": {"text": "Unused endpoint: GET /deal-page-tokens/deal/:dealId/engagement"}, "fullDescription": {"text": "`apps/api/src/modules/deal-page-tokens/deal-page-tokens.controller.ts` declares `GET /deal-page-tokens/deal/:dealId/engagement` 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-23e8dd657dceac55", "name": "Unused endpoint: POST /deal-page-tokens/token/:token/opened", "shortDescription": {"text": "Unused endpoint: POST /deal-page-tokens/token/:token/opened"}, "fullDescription": {"text": "`apps/api/src/modules/deal-page-tokens/deal-page-tokens.controller.ts` declares `POST /deal-page-tokens/token/:token/opened` 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-4f1eeecc04337e00", "name": "Unused endpoint: POST /deal-page-tokens/token/:token/event", "shortDescription": {"text": "Unused endpoint: POST /deal-page-tokens/token/:token/event"}, "fullDescription": {"text": "`apps/api/src/modules/deal-page-tokens/deal-page-tokens.controller.ts` declares `POST /deal-page-tokens/token/:token/event` 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-747d120f647f5364", "name": "Unused endpoint: POST /billing/checkout", "shortDescription": {"text": "Unused endpoint: POST /billing/checkout"}, "fullDescription": {"text": "`apps/api/src/modules/billing/billing.controller.ts` declares `POST /billing/checkout` 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-589634278f2427b7", "name": "Unused endpoint: POST /billing/portal", "shortDescription": {"text": "Unused endpoint: POST /billing/portal"}, "fullDescription": {"text": "`apps/api/src/modules/billing/billing.controller.ts` declares `POST /billing/portal` 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-830485b269c3c94d", "name": "Unused endpoint: POST /billing/webhooks/stripe", "shortDescription": {"text": "Unused endpoint: POST /billing/webhooks/stripe"}, "fullDescription": {"text": "`apps/api/src/modules/billing/billing.controller.ts` declares `POST /billing/webhooks/stripe` 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-4040ff398397b18e", "name": "Unused endpoint: POST /marketplace/deals/:id/publish", "shortDescription": {"text": "Unused endpoint: POST /marketplace/deals/:id/publish"}, "fullDescription": {"text": "`apps/api/src/modules/marketplace/marketplace.controller.ts` declares `POST /marketplace/deals/:id/publish` 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-c2fe523eec364455", "name": "Unused endpoint: POST /marketplace/deals/:id/save", "shortDescription": {"text": "Unused endpoint: POST /marketplace/deals/:id/save"}, "fullDescription": {"text": "`apps/api/src/modules/marketplace/marketplace.controller.ts` declares `POST /marketplace/deals/:id/save` 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-b470571c46e4b9e1", "name": "Unused endpoint: GET /marketplace/saved", "shortDescription": {"text": "Unused endpoint: GET /marketplace/saved"}, "fullDescription": {"text": "`apps/api/src/modules/marketplace/marketplace.controller.ts` declares `GET /marketplace/saved` 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-6bf08ba599fa9e51", "name": "Unused endpoint: GET /intake/token/:token", "shortDescription": {"text": "Unused endpoint: GET /intake/token/:token"}, "fullDescription": {"text": "`apps/api/src/modules/intake/intake.controller.ts` declares `GET /intake/token/:token` 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-54ae653ba7d8bd0a", "name": "Unused endpoint: POST /intake/token/:token/opened", "shortDescription": {"text": "Unused endpoint: POST /intake/token/:token/opened"}, "fullDescription": {"text": "`apps/api/src/modules/intake/intake.controller.ts` declares `POST /intake/token/:token/opened` 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-0a87c88153ea36c2", "name": "Unused endpoint: POST /intake/token/:token/started", "shortDescription": {"text": "Unused endpoint: POST /intake/token/:token/started"}, "fullDescription": {"text": "`apps/api/src/modules/intake/intake.controller.ts` declares `POST /intake/token/:token/started` 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-d390484121e2ea9f", "name": "Unused endpoint: POST /intake/token/:token/sent", "shortDescription": {"text": "Unused endpoint: POST /intake/token/:token/sent"}, "fullDescription": {"text": "`apps/api/src/modules/intake/intake.controller.ts` declares `POST /intake/token/:token/sent` 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-ce4ee197d91176b0", "name": "Unused endpoint: POST /intake/token/:token/submit", "shortDescription": {"text": "Unused endpoint: POST /intake/token/:token/submit"}, "fullDescription": {"text": "`apps/api/src/modules/intake/intake.controller.ts` declares `POST /intake/token/:token/submit` 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-f33c36ab3d5fd6da", "name": "Unused endpoint: POST /intake/generate/:buyerId", "shortDescription": {"text": "Unused endpoint: POST /intake/generate/:buyerId"}, "fullDescription": {"text": "`apps/api/src/modules/intake/intake.controller.ts` declares `POST /intake/generate/:buyerId` 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-f27d066530044dd6", "name": "Unused endpoint: POST /intake/generate-bulk", "shortDescription": {"text": "Unused endpoint: POST /intake/generate-bulk"}, "fullDescription": {"text": "`apps/api/src/modules/intake/intake.controller.ts` declares `POST /intake/generate-bulk` 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-0589dc56179dd2a4", "name": "Unused endpoint: GET /intake/submissions", "shortDescription": {"text": "Unused endpoint: GET /intake/submissions"}, "fullDescription": {"text": "`apps/api/src/modules/intake/intake.controller.ts` declares `GET /intake/submissions` 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-e266721ec607d5e9", "name": "Unused endpoint: POST /intake/submissions/:id/approve", "shortDescription": {"text": "Unused endpoint: POST /intake/submissions/:id/approve"}, "fullDescription": {"text": "`apps/api/src/modules/intake/intake.controller.ts` declares `POST /intake/submissions/:id/approve` 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-fe135b17bd0a70c8", "name": "Unused endpoint: POST /intake/token/:token/track", "shortDescription": {"text": "Unused endpoint: POST /intake/token/:token/track"}, "fullDescription": {"text": "`apps/api/src/modules/intake/intake.controller.ts` declares `POST /intake/token/:token/track` 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-4d42f1a8fb1ab9a7", "name": "Unused endpoint: GET /intake/buyers/:buyerId/events", "shortDescription": {"text": "Unused endpoint: GET /intake/buyers/:buyerId/events"}, "fullDescription": {"text": "`apps/api/src/modules/intake/intake.controller.ts` declares `GET /intake/buyers/:buyerId/events` 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-35cfc0009efc12be", "name": "Unused endpoint: POST /intake/submissions/:id/reject", "shortDescription": {"text": "Unused endpoint: POST /intake/submissions/:id/reject"}, "fullDescription": {"text": "`apps/api/src/modules/intake/intake.controller.ts` declares `POST /intake/submissions/:id/reject` 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-0557bb7e0f044b4b", "name": "Unused endpoint: GET /places/autocomplete", "shortDescription": {"text": "Unused endpoint: GET /places/autocomplete"}, "fullDescription": {"text": "`apps/api/src/modules/places/places.controller.ts` declares `GET /places/autocomplete` 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-49052a01392ff2eb", "name": "Unused endpoint: GET /places/details", "shortDescription": {"text": "Unused endpoint: GET /places/details"}, "fullDescription": {"text": "`apps/api/src/modules/places/places.controller.ts` declares `GET /places/details` 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-36aa5c58f14e2e25", "name": "Unused endpoint: GET /axesso/usage", "shortDescription": {"text": "Unused endpoint: GET /axesso/usage"}, "fullDescription": {"text": "`apps/api/src/modules/axesso/axesso.controller.ts` declares `GET /axesso/usage` 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-7bb2ae9a074f7d26", "name": "Unused endpoint: POST /axesso/search-by-address", "shortDescription": {"text": "Unused endpoint: POST /axesso/search-by-address"}, "fullDescription": {"text": "`apps/api/src/modules/axesso/axesso.controller.ts` declares `POST /axesso/search-by-address` 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-ca59ed619167c2a3", "name": "Unused endpoint: POST /axesso/recently-sold", "shortDescription": {"text": "Unused endpoint: POST /axesso/recently-sold"}, "fullDescription": {"text": "`apps/api/src/modules/axesso/axesso.controller.ts` declares `POST /axesso/recently-sold` 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-f341c8390e25502c", "name": "Unused endpoint: POST /axesso/property-v2", "shortDescription": {"text": "Unused endpoint: POST /axesso/property-v2"}, "fullDescription": {"text": "`apps/api/src/modules/axesso/axesso.controller.ts` declares `POST /axesso/property-v2` 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-228c56b583db896a", "name": "Unused endpoint: POST /axesso/similar-sold", "shortDescription": {"text": "Unused endpoint: POST /axesso/similar-sold"}, "fullDescription": {"text": "`apps/api/src/modules/axesso/axesso.controller.ts` declares `POST /axesso/similar-sold` 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-9d401478d16297bf", "name": "Unused endpoint: POST /axesso/price-tax-history", "shortDescription": {"text": "Unused endpoint: POST /axesso/price-tax-history"}, "fullDescription": {"text": "`apps/api/src/modules/axesso/axesso.controller.ts` declares `POST /axesso/price-tax-history` 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-fb3a4e4a08e66edf", "name": "Unused endpoint: POST /axesso/proof", "shortDescription": {"text": "Unused endpoint: POST /axesso/proof"}, "fullDescription": {"text": "`apps/api/src/modules/axesso/axesso.controller.ts` declares `POST /axesso/proof` 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-10e024214672dade", "name": "Unused endpoint: GET /street-view/playwright-check", "shortDescription": {"text": "Unused endpoint: GET /street-view/playwright-check"}, "fullDescription": {"text": "`apps/api/src/modules/street-view/street-view-timeline.controller.ts` declares `GET /street-view/playwright-check` 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-0d7c55c59ba51683", "name": "Unused endpoint: POST /street-view/timeline", "shortDescription": {"text": "Unused endpoint: POST /street-view/timeline"}, "fullDescription": {"text": "`apps/api/src/modules/street-view/street-view-timeline.controller.ts` declares `POST /street-view/timeline` 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-3aaa358293ffbb0f", "name": "Unused endpoint: GET /api/v1/rentcast/usage", "shortDescription": {"text": "Unused endpoint: GET /api/v1/rentcast/usage"}, "fullDescription": {"text": "`apps/api/src/modules/rentcast/rentcast.controller.ts` declares `GET /api/v1/rentcast/usage` 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-ae88f74bc97e3637", "name": "Unused endpoint: POST /api/v1/rentcast/estimate", "shortDescription": {"text": "Unused endpoint: POST /api/v1/rentcast/estimate"}, "fullDescription": {"text": "`apps/api/src/modules/rentcast/rentcast.controller.ts` declares `POST /api/v1/rentcast/estimate` 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-b119bb52041e0c8d", "name": "Unused endpoint: GET /auth/profile", "shortDescription": {"text": "Unused endpoint: GET /auth/profile"}, "fullDescription": {"text": "`apps/api/src/modules/auth/auth.controller.ts` declares `GET /auth/profile` 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-a754d7e6dc144263", "name": "Unused endpoint: POST /auth/webhooks/clerk", "shortDescription": {"text": "Unused endpoint: POST /auth/webhooks/clerk"}, "fullDescription": {"text": "`apps/api/src/modules/auth/auth.controller.ts` declares `POST /auth/webhooks/clerk` 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-3653231b15cfe77d", "name": "Unused endpoint: POST /teams/invite", "shortDescription": {"text": "Unused endpoint: POST /teams/invite"}, "fullDescription": {"text": "`apps/api/src/modules/teams/teams.controller.ts` declares `POST /teams/invite` 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-4c0eb9d9a4a4e6a8", "name": "Unused endpoint: PATCH /teams/:id/role", "shortDescription": {"text": "Unused endpoint: PATCH /teams/:id/role"}, "fullDescription": {"text": "`apps/api/src/modules/teams/teams.controller.ts` declares `PATCH /teams/:id/role` 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/24585"}, "properties": {"repository": "bigbuckoffers/dispo-platform", "repoUrl": "https://github.com/bigbuckoffers/dispo-platform", "branch": "main"}, "results": [{"ruleId": "scanner-065afc4ebece0fc6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 seed-deals.js:215"}, "properties": {"repobilityId": "2afef0162b4aa4a0", "scanner": "scanner-primary", "fingerprint": "065afc4ebece0fc6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6acb5d3ae91bf4a2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 AddDealModal.tsx:368"}, "properties": {"repobilityId": "14043002392e702a", "scanner": "scanner-primary", "fingerprint": "6acb5d3ae91bf4a2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7145366baa82fa90", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/database/prisma/seed.ts:4"}, "properties": {"repobilityId": "7d02f3de957c4f8e", "scanner": "scanner-primary", "fingerprint": "7145366baa82fa90", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b136342abd013233", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/database/prisma/seed-demo-account.ts:6"}, "properties": {"repobilityId": "da2c24b8d4a73c39", "scanner": "scanner-primary", "fingerprint": "b136342abd013233", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d35a1a9ad0199e1d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 dispo-platform/apps/web/src/app/(dashboard)/dashboard/deals/[id]/page.tsx:45"}, "properties": {"repobilityId": "68a402b47d4082cb", "scanner": "scanner-primary", "fingerprint": "d35a1a9ad0199e1d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-008ea427478ba0f2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/app.module.ts:67"}, "properties": {"repobilityId": "cd636cee75cfd61c", "scanner": "scanner-primary", "fingerprint": "008ea427478ba0f2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a6ecc07025c5ce87", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/modules/deals/deals-ai-analyze.service.ts:12"}, "properties": {"repobilityId": "e01088067d472fe3", "scanner": "scanner-primary", "fingerprint": "a6ecc07025c5ce87", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cf6259a2cc64a335", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/modules/deals/deals.service.ts:252"}, "properties": {"repobilityId": "d884995b702cf4fe", "scanner": "scanner-primary", "fingerprint": "cf6259a2cc64a335", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7d8d129672bd2916", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/modules/deals/arv-engine.service.ts:168"}, "properties": {"repobilityId": "b386273db7bf4040", "scanner": "scanner-primary", "fingerprint": "7d8d129672bd2916", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-81ba64fb52aff924", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/axesso/market-competition/route.ts:440"}, "properties": {"repobilityId": "75ea12698941d8c8", "scanner": "scanner-primary", "fingerprint": "81ba64fb52aff924", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3ec57c39931d345e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/axesso/market-competition/enrich/route.ts:56"}, "properties": {"repobilityId": "dd3478d90c6eefa0", "scanner": "scanner-primary", "fingerprint": "3ec57c39931d345e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b72f3b13460f4e46", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/axesso/investor-price/route.ts:834"}, "properties": {"repobilityId": "3681cb9e8edd004c", "scanner": "scanner-primary", "fingerprint": "b72f3b13460f4e46", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e35a43f9332b4d98", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/axesso/comp-review/route.ts:2314"}, "properties": {"repobilityId": "42f17c84fa13daf1", "scanner": "scanner-primary", "fingerprint": "e35a43f9332b4d98", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-340c9a99bd3f4879", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/axesso/comp-review-v2/route.ts:772"}, "properties": {"repobilityId": "37f1cd25f74e7e66", "scanner": "scanner-primary", "fingerprint": "340c9a99bd3f4879", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f8c5f34c2f3fe89e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/app/api/deals/market-competition/brain/route.ts:624"}, "properties": {"repobilityId": "b36b9263897bed81", "scanner": "scanner-primary", "fingerprint": "f8c5f34c2f3fe89e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0e53ed342fe8df5a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(dashboard)/dashboard/messages/page.tsx:728"}, "properties": {"repobilityId": "bda54b9fd543ee67", "scanner": "scanner-primary", "fingerprint": "0e53ed342fe8df5a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b6cb2e8da40ef583", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(dashboard)/dashboard/deals/page.tsx:454"}, "properties": {"repobilityId": "51f7127f7958424b", "scanner": "scanner-primary", "fingerprint": "b6cb2e8da40ef583", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0853005ac1d1c6e1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(dashboard)/dashboard/deals/[id]/page.tsx:725"}, "properties": {"repobilityId": "e54d87328fccd302", "scanner": "scanner-primary", "fingerprint": "0853005ac1d1c6e1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-890a2925089da875", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(dashboard)/dashboard/buyers/page.tsx:1136"}, "properties": {"repobilityId": "70605b0742b6c0c7", "scanner": "scanner-primary", "fingerprint": "890a2925089da875", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-58bbc86e8ca9b510", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(dashboard)/dashboard/buyers/[id]/page.tsx:948"}, "properties": {"repobilityId": "1932a3939f3e88ce", "scanner": "scanner-primary", "fingerprint": "58bbc86e8ca9b510", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-90fe7646792c4a79", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/(dashboard)/dashboard/campaigns/page.tsx:794"}, "properties": {"repobilityId": "103b82b0eebf87e5", "scanner": "scanner-primary", "fingerprint": "90fe7646792c4a79", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5451d637d8bb743c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/deals/DealRedesignPage.tsx:770"}, "properties": {"repobilityId": "63260110f729e4a1", "scanner": "scanner-primary", "fingerprint": "5451d637d8bb743c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8527a558b0f24740", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 apps/web/src/components/deals/CompReviewBoard.tsx:1880"}, "properties": {"repobilityId": "68ae24b1bd40fd73", "scanner": "scanner-primary", "fingerprint": "8527a558b0f24740", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-a388322529a44a3c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/deals/CompReviewBoard.tsx:2235"}, "properties": {"repobilityId": "9a248eaa331be977", "scanner": "scanner-primary", "fingerprint": "a388322529a44a3c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9e855d85d7417a7d", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/src/components/deals/CompReviewBoard.tsx:1807"}, "properties": {"repobilityId": "fabb35fcd1f4175f", "scanner": "scanner-primary", "fingerprint": "9e855d85d7417a7d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-a5a1f9a66eb39e8a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/deals/CompReviewBoard.tsx:1111"}, "properties": {"repobilityId": "e4f823fb0f027a3d", "scanner": "scanner-primary", "fingerprint": "a5a1f9a66eb39e8a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ee670aaca62441ff", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 apps/web/src/components/deals/InvestorPriceEvidence.tsx:1626"}, "properties": {"repobilityId": "6fe88f63228b97b2", "scanner": "scanner-primary", "fingerprint": "ee670aaca62441ff", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-42b46b4599c3b558", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/deals/InvestorPriceEvidence.tsx:1795"}, "properties": {"repobilityId": "8e9b3061ff0f9c2e", "scanner": "scanner-primary", "fingerprint": "42b46b4599c3b558", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9bf9fb763d9681d4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/analytics/index.tsx:83"}, "properties": {"repobilityId": "876bee3fe9b66607", "scanner": "scanner-primary", "fingerprint": "9bf9fb763d9681d4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4fd88ff910f3dd7e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/deal/AddDealModal.tsx:503"}, "properties": {"repobilityId": "b2557db727f1ea89", "scanner": "scanner-primary", "fingerprint": "4fd88ff910f3dd7e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d9980d9104825b19", "level": "warning", "message": {"text": "Dockerfile runs as root: apps/api/Dockerfile"}, "properties": {"repobilityId": "e591b11d8a0c1fe7", "scanner": "scanner-primary", "fingerprint": "d9980d9104825b19", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-ee70e6ba5833b0cd", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm-slim"}, "properties": {"repobilityId": "7bd6314b611bee84", "scanner": "scanner-primary", "fingerprint": "ee70e6ba5833b0cd", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-834248a4229855e2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/components/deals/DealRedesignPage.tsx:603"}, "properties": {"repobilityId": "a2251958eacad82c", "scanner": "scanner-primary", "fingerprint": "834248a4229855e2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/components/deals/DealRedesignPage.tsx"}, "region": {"startLine": 603}}}]}, {"ruleId": "scanner-3aba3c43a377aa0d", "level": "note", "message": {"text": "Very large file: apps/web/src/app/api/axesso/investor-price/route.ts (1323 lines)"}, "properties": {"repobilityId": "1b6d5d12f4f9f33b", "scanner": "scanner-primary", "fingerprint": "3aba3c43a377aa0d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1cc19a90cf06fc6c", "level": "note", "message": {"text": "Very large file: apps/web/src/app/api/axesso/comp-review/route.ts (2611 lines)"}, "properties": {"repobilityId": "ff16b139f3962eff", "scanner": "scanner-primary", "fingerprint": "1cc19a90cf06fc6c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1f5351a624180ec0", "level": "note", "message": {"text": "Very large file: apps/web/src/app/api/axesso/comp-review-v2/route.ts (1398 lines)"}, "properties": {"repobilityId": "8817cb8f8229b9dd", "scanner": "scanner-primary", "fingerprint": "1f5351a624180ec0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a756e59caec9ed26", "level": "note", "message": {"text": "Very large file: apps/web/src/app/(dashboard)/dashboard/messages/page.tsx (1117 lines)"}, "properties": {"repobilityId": "a360d52d1e086068", "scanner": "scanner-primary", "fingerprint": "a756e59caec9ed26", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ee552a41e873912c", "level": "note", "message": {"text": "Very large file: apps/web/src/app/(dashboard)/dashboard/deals/[id]/page.tsx (2088 lines)"}, "properties": {"repobilityId": "36bb181f4e5931b8", "scanner": "scanner-primary", "fingerprint": "ee552a41e873912c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c37fb8c04bcfe295", "level": "note", "message": {"text": "Very large file: apps/web/src/app/(dashboard)/dashboard/buyers/page.tsx (2327 lines)"}, "properties": {"repobilityId": "16064076df37fe49", "scanner": "scanner-primary", "fingerprint": "c37fb8c04bcfe295", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ca94489a85bb288a", "level": "note", "message": {"text": "Very large file: apps/web/src/app/(dashboard)/dashboard/buyers/[id]/page.tsx (1907 lines)"}, "properties": {"repobilityId": "3f174cf8d4ccf724", "scanner": "scanner-primary", "fingerprint": "ca94489a85bb288a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a8596ba60ba6a329", "level": "note", "message": {"text": "Very large file: apps/web/src/components/deals/DealRedesignPage.tsx (1562 lines)"}, "properties": {"repobilityId": "ca43b35b32ebaab4", "scanner": "scanner-primary", "fingerprint": "a8596ba60ba6a329", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fcfa4e70225a7b0a", "level": "note", "message": {"text": "Very large file: apps/web/src/components/deals/CompReviewBoard.tsx (8344 lines)"}, "properties": {"repobilityId": "45ff662da1f6b53f", "scanner": "scanner-primary", "fingerprint": "fcfa4e70225a7b0a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-af16cb72b0f91e2e", "level": "note", "message": {"text": "Very large file: apps/web/src/components/deals/InvestorPriceEvidence.tsx (2850 lines)"}, "properties": {"repobilityId": "f6002e2f7c97dbbd", "scanner": "scanner-primary", "fingerprint": "af16cb72b0f91e2e", "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": "c4c5eab9cb6f0f51", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b06b8d86f24c77f9", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/api/package.json"}, "properties": {"repobilityId": "ce77cd34ed0306d4", "scanner": "scanner-primary", "fingerprint": "b06b8d86f24c77f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4a9eb7dc7c6e3880", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "properties": {"repobilityId": "6c1704bf24cf19ac", "scanner": "scanner-primary", "fingerprint": "4a9eb7dc7c6e3880", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "8d5e2d9b303cd7cf", "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": "f85712bdbe1c9dcb", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "c75dc906159f7246", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "d29215e4a8745424", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "3963377bcc9e44af", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ebb0e6e7c3e8836f", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/modules/street-view/street-view-scrape.processor.ts:175"}, "properties": {"repobilityId": "fbaef789a34e34f7", "scanner": "scanner-primary", "fingerprint": "ebb0e6e7c3e8836f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-542cdbd9b56407b2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/modules/rentcast/rentcast.service.ts:39"}, "properties": {"repobilityId": "1ad0b8741e37750b", "scanner": "scanner-primary", "fingerprint": "542cdbd9b56407b2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a40bf9d83fc5c0b3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/anthropic/route.ts:6"}, "properties": {"repobilityId": "3c8bcf39c8024521", "scanner": "scanner-primary", "fingerprint": "a40bf9d83fc5c0b3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eb2ea27ea10609f8", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/web/src/app/api/axesso/market-competition/route.ts:282"}, "properties": {"repobilityId": "f8fdea8b2f7689ff", "scanner": "scanner-primary", "fingerprint": "eb2ea27ea10609f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b314779d48be549f", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/app/api/axesso/investor-price/route.ts:1007"}, "properties": {"repobilityId": "f4815e203067b4bf", "scanner": "scanner-primary", "fingerprint": "b314779d48be549f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7ca2aff0eb60c5ce", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/app/api/axesso/comp-review/route.ts:1428"}, "properties": {"repobilityId": "ae74852c740b8362", "scanner": "scanner-primary", "fingerprint": "7ca2aff0eb60c5ce", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ed027748989282bf", "level": "note", "message": {"text": "Legacy-named symbol `investor_v2` in apps/web/src/app/api/axesso/comp-review-v2/route.ts:768"}, "properties": {"repobilityId": "8ce90e5bf38fc7e3", "scanner": "scanner-primary", "fingerprint": "ed027748989282bf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0c9a5ed8a560272a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/deals/market-competition/brain/route.ts:48"}, "properties": {"repobilityId": "04406c8941e80d4f", "scanner": "scanner-primary", "fingerprint": "0c9a5ed8a560272a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2d8aec875c229de5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/intake/[token]/page.tsx:105"}, "properties": {"repobilityId": "033ba0fcab6a231f", "scanner": "scanner-primary", "fingerprint": "2d8aec875c229de5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-51ea16ea030394c1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(dashboard)/dashboard/messages/page.tsx:439"}, "properties": {"repobilityId": "9482a545f80c5ca0", "scanner": "scanner-primary", "fingerprint": "51ea16ea030394c1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c9112ca4eeae5c5b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(dashboard)/dashboard/deals/page.tsx:708"}, "properties": {"repobilityId": "0dd2058c64b8c43e", "scanner": "scanner-primary", "fingerprint": "c9112ca4eeae5c5b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-46512bee8d05e233", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(dashboard)/dashboard/deals/ExportDealsButton.tsx:111"}, "properties": {"repobilityId": "db4e9a583a5d4445", "scanner": "scanner-primary", "fingerprint": "46512bee8d05e233", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2265812eeda9a853", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(dashboard)/dashboard/deals/[id]/page.tsx:1459"}, "properties": {"repobilityId": "c0cb8717f4237355", "scanner": "scanner-primary", "fingerprint": "2265812eeda9a853", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aa3c01ef343ecb26", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(dashboard)/dashboard/buyers/page.tsx:777"}, "properties": {"repobilityId": "83e094ea8c0a19e7", "scanner": "scanner-primary", "fingerprint": "aa3c01ef343ecb26", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-145e3cc38d0fc2a9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/(dashboard)/dashboard/buyers/[id]/page.tsx:190"}, "properties": {"repobilityId": "53af10f3fbb2ff62", "scanner": "scanner-primary", "fingerprint": "145e3cc38d0fc2a9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-343b3bd65e7423a1", "level": "note", "message": {"text": "Legacy-named symbol `HASH_cc_ft1440_v2` in apps/web/src/components/deals/CompReviewBoard.tsx:951"}, "properties": {"repobilityId": "00d8a384e030f1e3", "scanner": "scanner-primary", "fingerprint": "343b3bd65e7423a1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a9ff55beac749475", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/components/deals/CompReviewBoard.tsx:992"}, "properties": {"repobilityId": "cd434ffbd5a333d7", "scanner": "scanner-primary", "fingerprint": "a9ff55beac749475", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-42e2915bd0821df8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/deals/CompReviewBoard.tsx:1454"}, "properties": {"repobilityId": "77a0788a5700e989", "scanner": "scanner-primary", "fingerprint": "42e2915bd0821df8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a548fd2b83c77e2b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/components/deals/InvestorPriceEvidence.tsx:176"}, "properties": {"repobilityId": "36c700b9b2514136", "scanner": "scanner-primary", "fingerprint": "a548fd2b83c77e2b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4b7c97378acd212b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/deals/InvestorPriceEvidence.tsx:1536"}, "properties": {"repobilityId": "97e0ea4de4a04b82", "scanner": "scanner-primary", "fingerprint": "4b7c97378acd212b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dc561dd05aba3a17", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/deals/StreetViewTimeline.tsx:183"}, "properties": {"repobilityId": "fddadc9792efab98", "scanner": "scanner-primary", "fingerprint": "dc561dd05aba3a17", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ee6568033a1f43b6", "level": "error", "message": {"text": "Dangling fetch: POST https://places.googleapis.com/v1/places:autocomplete?key=${GKEY} (apps/api/src/modules/places/places.controller.ts:12)"}, "properties": {"repobilityId": "2d73ea0ea6ccd4cc", "scanner": "scanner-primary", "fingerprint": "ee6568033a1f43b6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-b52e15a9b4c892b3", "level": "error", "message": {"text": "Dangling fetch: GET https://places.googleapis.com/v1/places/${placeId}?key=${GKEY}&fields=addressComponents (apps/api/src/modules/places/places.controller.ts:34)"}, "properties": {"repobilityId": "0e7752812dc6c6d2", "scanner": "scanner-primary", "fingerprint": "b52e15a9b4c892b3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-1252aad93c74f413", "level": "error", "message": {"text": "Dangling fetch: GET /search-by-address (apps/api/src/modules/axesso/axesso.service.ts:114)"}, "properties": {"repobilityId": "d45e59244666d89b", "scanner": "scanner-primary", "fingerprint": "1252aad93c74f413", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-30acf170115604ce", "level": "error", "message": {"text": "Dangling fetch: GET /search (apps/api/src/modules/axesso/axesso.service.ts:118)"}, "properties": {"repobilityId": "118e86a4a83a10b8", "scanner": "scanner-primary", "fingerprint": "30acf170115604ce", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-90f1fc27c7991eb2", "level": "error", "message": {"text": "Dangling fetch: GET /property-v2 (apps/api/src/modules/axesso/axesso.service.ts:127)"}, "properties": {"repobilityId": "776a7ede80d76d87", "scanner": "scanner-primary", "fingerprint": "90f1fc27c7991eb2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-879c6f7546c41fd3", "level": "error", "message": {"text": "Dangling fetch: GET /similar-sold (apps/api/src/modules/axesso/axesso.service.ts:131)"}, "properties": {"repobilityId": "05248d37ab5293e1", "scanner": "scanner-primary", "fingerprint": "879c6f7546c41fd3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-ffc6b10d1b8f3527", "level": "error", "message": {"text": "Dangling fetch: GET /price-tax-history (apps/api/src/modules/axesso/axesso.service.ts:135)"}, "properties": {"repobilityId": "8b3ac21e9a8eafa0", "scanner": "scanner-primary", "fingerprint": "ffc6b10d1b8f3527", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-1138eb3bd41ebfb1", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/api/src/modules/deals/deals.service.ts:277)"}, "properties": {"repobilityId": "62a8cdc9906dbb43", "scanner": "scanner-primary", "fingerprint": "1138eb3bd41ebfb1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-273d1657333eca52", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/api/src/modules/deals/deals.service.ts:295)"}, "properties": {"repobilityId": "9779764178874ecf", "scanner": "scanner-primary", "fingerprint": "273d1657333eca52", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7330bb2862184609", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/api/src/modules/deals/arv-engine.service.ts:153)"}, "properties": {"repobilityId": "1b8a645db048d60c", "scanner": "scanner-primary", "fingerprint": "7330bb2862184609", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-878ff284ab0a271a", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/api/src/modules/deals/arv-engine.service.ts:194)"}, "properties": {"repobilityId": "990b28c6c1dbcf6c", "scanner": "scanner-primary", "fingerprint": "878ff284ab0a271a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e2735d995b0ad02b", "level": "error", "message": {"text": "Dangling fetch: GET /api/deal-page-tokens/${token} (apps/web/src/app/d/[token]/page.tsx:386)"}, "properties": {"repobilityId": "98f0f8b10dd7b37b", "scanner": "scanner-primary", "fingerprint": "e2735d995b0ad02b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-51de1dc3ea30a7c9", "level": "error", "message": {"text": "Dangling fetch: POST /api/deal-page-tokens/${token}/event (apps/web/src/app/d/[token]/page.tsx:417)"}, "properties": {"repobilityId": "8dd31e61eafca803", "scanner": "scanner-primary", "fingerprint": "51de1dc3ea30a7c9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-43c02eff22bd33df", "level": "error", "message": {"text": "Dangling fetch: POST /api/deal-page-tokens/${token}/event (apps/web/src/app/d/[token]/page.tsx:446)"}, "properties": {"repobilityId": "d7a1f7c09cb25b60", "scanner": "scanner-primary", "fingerprint": "43c02eff22bd33df", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-754f03eeed947a6d", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/web/src/app/api/anthropic/route.ts:6)"}, "properties": {"repobilityId": "1f7403b6b5a1df4f", "scanner": "scanner-primary", "fingerprint": "754f03eeed947a6d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-918e6408173ef3ef", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/web/src/app/api/deals/market-competition/brain/route.ts:48)"}, "properties": {"repobilityId": "4a48766949711592", "scanner": "scanner-primary", "fingerprint": "918e6408173ef3ef", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-90e36190c7b0d8f3", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (apps/web/src/app/api/deals/market-competition/brain/route.ts:80)"}, "properties": {"repobilityId": "b89cd35f505b50bb", "scanner": "scanner-primary", "fingerprint": "90e36190c7b0d8f3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-83771e554bec6eb6", "level": "error", "message": {"text": "Dangling fetch: POST /api/anthropic (apps/web/src/app/(dashboard)/dashboard/messages/page.tsx:439)"}, "properties": {"repobilityId": "fa45d68dade9ce3a", "scanner": "scanner-primary", "fingerprint": "83771e554bec6eb6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1234980007f4a823", "level": "error", "message": {"text": "Dangling fetch: POST /api/anthropic (apps/web/src/app/(dashboard)/dashboard/messages/page.tsx:457)"}, "properties": {"repobilityId": "164dc6c1f93ea810", "scanner": "scanner-primary", "fingerprint": "1234980007f4a823", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-75446f2c64370ca8", "level": "error", "message": {"text": "Dangling fetch: POST https://api.cloudinary.com/v1_1/dhueussrm/image/upload (apps/web/src/app/(dashboard)/dashboard/deals/[id]/page.tsx:121)"}, "properties": {"repobilityId": "414b95c84e591213", "scanner": "scanner-primary", "fingerprint": "75446f2c64370ca8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6d313e58809961be", "level": "error", "message": {"text": "Dangling fetch: POST https://api.cloudinary.com/v1_1/dhueussrm/auto/upload (apps/web/src/app/(dashboard)/dashboard/buyers/[id]/page.tsx:465)"}, "properties": {"repobilityId": "5eba6e0f0d6f2fc2", "scanner": "scanner-primary", "fingerprint": "6d313e58809961be", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e580111731e58933", "level": "error", "message": {"text": "Dangling fetch: POST /api/anthropic (apps/web/src/app/(dashboard)/dashboard/buyers/[id]/page.tsx:469)"}, "properties": {"repobilityId": "c5bfe297c598ccd4", "scanner": "scanner-primary", "fingerprint": "e580111731e58933", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ed41299ea7c1170f", "level": "error", "message": {"text": "Dangling fetch: POST /api/anthropic (apps/web/src/app/(dashboard)/dashboard/buyers/[id]/page.tsx:477)"}, "properties": {"repobilityId": "678bf4459c2efb34", "scanner": "scanner-primary", "fingerprint": "ed41299ea7c1170f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4d1990467ac09c93", "level": "error", "message": {"text": "Dangling fetch: POST /api/anthropic (apps/web/src/components/deals/CompReviewBoard.tsx:1659)"}, "properties": {"repobilityId": "b8351c9d3c3cd4dd", "scanner": "scanner-primary", "fingerprint": "4d1990467ac09c93", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-84b9be7754f5f683", "level": "error", "message": {"text": "Dangling fetch: POST /api/axesso/investor-price (apps/web/src/components/deals/CompReviewBoard.tsx:5466)"}, "properties": {"repobilityId": "5f069d574c49b70b", "scanner": "scanner-primary", "fingerprint": "84b9be7754f5f683", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-71e759faa8e199f4", "level": "error", "message": {"text": "Dangling fetch: POST /api/axesso/market-competition/enrich (apps/web/src/components/deals/CompReviewBoard.tsx:5528)"}, "properties": {"repobilityId": "ff0926816dc6ea90", "scanner": "scanner-primary", "fingerprint": "71e759faa8e199f4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ca2be2e26d07056e", "level": "error", "message": {"text": "Dangling fetch: POST /api/axesso/market-competition (apps/web/src/components/deals/CompReviewBoard.tsx:5600)"}, "properties": {"repobilityId": "8ad58e261c56ad21", "scanner": "scanner-primary", "fingerprint": "ca2be2e26d07056e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d20e96d40db5b123", "level": "error", "message": {"text": "Dangling fetch: POST /api/axesso/comp-review-v2 (apps/web/src/components/deals/CompReviewBoard.tsx:5650)"}, "properties": {"repobilityId": "77c243945fc1abef", "scanner": "scanner-primary", "fingerprint": "d20e96d40db5b123", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-37fd51c65188ab85", "level": "error", "message": {"text": "Dangling fetch: POST /api/deals/market-competition/brain (apps/web/src/components/deals/CompReviewBoard.tsx:6399)"}, "properties": {"repobilityId": "dcf14d4b0b60de5a", "scanner": "scanner-primary", "fingerprint": "37fd51c65188ab85", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b809d556cf4582e3", "level": "error", "message": {"text": "Dangling fetch: POST /api/axesso/comp-review-v2 (apps/web/src/components/deals/CompReviewBoard.tsx:6538)"}, "properties": {"repobilityId": "149955bd7764302f", "scanner": "scanner-primary", "fingerprint": "b809d556cf4582e3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c62e78a68b4e5e38", "level": "error", "message": {"text": "Dangling fetch: POST /api/zillow/manual-comp (apps/web/src/components/deals/CompReviewBoard.tsx:6832)"}, "properties": {"repobilityId": "6c4443311ceaf5d7", "scanner": "scanner-primary", "fingerprint": "c62e78a68b4e5e38", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c93951a4c27906e4", "level": "error", "message": {"text": "Dangling fetch: POST /api/anthropic (apps/web/src/components/deals/CompReviewBoard.tsx:7199)"}, "properties": {"repobilityId": "0619d48469ef25c6", "scanner": "scanner-primary", "fingerprint": "c93951a4c27906e4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0e7726bacb09b877", "level": "error", "message": {"text": "Dangling fetch: GET /api/street-view/metadata?lat=${lat}&lng=${lng} (apps/web/src/components/deals/StreetViewTimeline.tsx:183)"}, "properties": {"repobilityId": "7675804883301805", "scanner": "scanner-primary", "fingerprint": "0e7726bacb09b877", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f9b23f926bef75b5", "level": "note", "message": {"text": "Unused endpoint: POST /deals/import/raw"}, "properties": {"repobilityId": "3a16a687923ab6a2", "scanner": "scanner-primary", "fingerprint": "f9b23f926bef75b5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7dd559e732df1227", "level": "note", "message": {"text": "Unused endpoint: POST /deals"}, "properties": {"repobilityId": "4ad043f6be1265ae", "scanner": "scanner-primary", "fingerprint": "7dd559e732df1227", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b22b0ddda467f51e", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/overview"}, "properties": {"repobilityId": "65c51269322abba3", "scanner": "scanner-primary", "fingerprint": "b22b0ddda467f51e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-14ed472e1411d559", "level": "note", "message": {"text": "Unused endpoint: GET /marketplace"}, "properties": {"repobilityId": "d836600d8d6cca54", "scanner": "scanner-primary", "fingerprint": "14ed472e1411d559", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d0f253034e0113c2", "level": "note", "message": {"text": "Unused endpoint: GET /deals"}, "properties": {"repobilityId": "47b09af0492e6230", "scanner": "scanner-primary", "fingerprint": "d0f253034e0113c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2bb66bd74d286a97", "level": "note", "message": {"text": "Unused endpoint: GET /buyers"}, "properties": {"repobilityId": "303516bd490f0f72", "scanner": "scanner-primary", "fingerprint": "2bb66bd74d286a97", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5029885582ac804f", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/deal-velocity"}, "properties": {"repobilityId": "df5c890e3094165c", "scanner": "scanner-primary", "fingerprint": "5029885582ac804f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-291243e88171da67", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/assignment-fees"}, "properties": {"repobilityId": "974222b680df5227", "scanner": "scanner-primary", "fingerprint": "291243e88171da67", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-52c5c4eadbd476fd", "level": "note", "message": {"text": "Unused endpoint: GET /analytics/rep-performance"}, "properties": {"repobilityId": "96aedcba88cd0772", "scanner": "scanner-primary", "fingerprint": "52c5c4eadbd476fd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cb390396a0cddc2f", "level": "note", "message": {"text": "Unused endpoint: GET /dispo/campaigns"}, "properties": {"repobilityId": "bf06fc597ae1b044", "scanner": "scanner-primary", "fingerprint": "cb390396a0cddc2f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4d65d54440cfeab5", "level": "note", "message": {"text": "Unused endpoint: POST /deal-page-tokens/create"}, "properties": {"repobilityId": "9e87ac9325428526", "scanner": "scanner-primary", "fingerprint": "4d65d54440cfeab5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-83225696b0dd95ec", "level": "note", "message": {"text": "Unused endpoint: GET /deal-page-tokens/token/:token"}, "properties": {"repobilityId": "8067eb3b5c7a74e8", "scanner": "scanner-primary", "fingerprint": "83225696b0dd95ec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0a0001c0a7f6db5c", "level": "note", "message": {"text": "Unused endpoint: GET /deal-page-tokens/deal/:dealId/engagement"}, "properties": {"repobilityId": "7d168a946bae9ff7", "scanner": "scanner-primary", "fingerprint": "0a0001c0a7f6db5c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-23e8dd657dceac55", "level": "note", "message": {"text": "Unused endpoint: POST /deal-page-tokens/token/:token/opened"}, "properties": {"repobilityId": "440c643caf49b7b3", "scanner": "scanner-primary", "fingerprint": "23e8dd657dceac55", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4f1eeecc04337e00", "level": "note", "message": {"text": "Unused endpoint: POST /deal-page-tokens/token/:token/event"}, "properties": {"repobilityId": "cfea0621e9f79d5b", "scanner": "scanner-primary", "fingerprint": "4f1eeecc04337e00", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-747d120f647f5364", "level": "note", "message": {"text": "Unused endpoint: POST /billing/checkout"}, "properties": {"repobilityId": "5166ef4bb518d6f3", "scanner": "scanner-primary", "fingerprint": "747d120f647f5364", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-589634278f2427b7", "level": "note", "message": {"text": "Unused endpoint: POST /billing/portal"}, "properties": {"repobilityId": "38c124a3fd0407a3", "scanner": "scanner-primary", "fingerprint": "589634278f2427b7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-830485b269c3c94d", "level": "note", "message": {"text": "Unused endpoint: POST /billing/webhooks/stripe"}, "properties": {"repobilityId": "c59ba2bdc58448ec", "scanner": "scanner-primary", "fingerprint": "830485b269c3c94d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4040ff398397b18e", "level": "note", "message": {"text": "Unused endpoint: POST /marketplace/deals/:id/publish"}, "properties": {"repobilityId": "325f180a7b149684", "scanner": "scanner-primary", "fingerprint": "4040ff398397b18e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c2fe523eec364455", "level": "note", "message": {"text": "Unused endpoint: POST /marketplace/deals/:id/save"}, "properties": {"repobilityId": "0268a657e7312a6f", "scanner": "scanner-primary", "fingerprint": "c2fe523eec364455", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b470571c46e4b9e1", "level": "note", "message": {"text": "Unused endpoint: GET /marketplace/saved"}, "properties": {"repobilityId": "9f688eda7da44d46", "scanner": "scanner-primary", "fingerprint": "b470571c46e4b9e1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6bf08ba599fa9e51", "level": "note", "message": {"text": "Unused endpoint: GET /intake/token/:token"}, "properties": {"repobilityId": "99ad3a4b8ef7e74a", "scanner": "scanner-primary", "fingerprint": "6bf08ba599fa9e51", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-54ae653ba7d8bd0a", "level": "note", "message": {"text": "Unused endpoint: POST /intake/token/:token/opened"}, "properties": {"repobilityId": "48882299adf7bfe1", "scanner": "scanner-primary", "fingerprint": "54ae653ba7d8bd0a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0a87c88153ea36c2", "level": "note", "message": {"text": "Unused endpoint: POST /intake/token/:token/started"}, "properties": {"repobilityId": "55ea46a8d3a9808c", "scanner": "scanner-primary", "fingerprint": "0a87c88153ea36c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d390484121e2ea9f", "level": "note", "message": {"text": "Unused endpoint: POST /intake/token/:token/sent"}, "properties": {"repobilityId": "366464eceaad50dd", "scanner": "scanner-primary", "fingerprint": "d390484121e2ea9f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ce4ee197d91176b0", "level": "note", "message": {"text": "Unused endpoint: POST /intake/token/:token/submit"}, "properties": {"repobilityId": "da20ddec98219f58", "scanner": "scanner-primary", "fingerprint": "ce4ee197d91176b0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f33c36ab3d5fd6da", "level": "note", "message": {"text": "Unused endpoint: POST /intake/generate/:buyerId"}, "properties": {"repobilityId": "47be6da7959c6409", "scanner": "scanner-primary", "fingerprint": "f33c36ab3d5fd6da", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f27d066530044dd6", "level": "note", "message": {"text": "Unused endpoint: POST /intake/generate-bulk"}, "properties": {"repobilityId": "093c8c3a06b558d5", "scanner": "scanner-primary", "fingerprint": "f27d066530044dd6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0589dc56179dd2a4", "level": "note", "message": {"text": "Unused endpoint: GET /intake/submissions"}, "properties": {"repobilityId": "cea95f823a588af2", "scanner": "scanner-primary", "fingerprint": "0589dc56179dd2a4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e266721ec607d5e9", "level": "note", "message": {"text": "Unused endpoint: POST /intake/submissions/:id/approve"}, "properties": {"repobilityId": "f5e2dff1b8ef591b", "scanner": "scanner-primary", "fingerprint": "e266721ec607d5e9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fe135b17bd0a70c8", "level": "note", "message": {"text": "Unused endpoint: POST /intake/token/:token/track"}, "properties": {"repobilityId": "0d67ea0fbe50ba9d", "scanner": "scanner-primary", "fingerprint": "fe135b17bd0a70c8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4d42f1a8fb1ab9a7", "level": "note", "message": {"text": "Unused endpoint: GET /intake/buyers/:buyerId/events"}, "properties": {"repobilityId": "2dd39ba74a907a7c", "scanner": "scanner-primary", "fingerprint": "4d42f1a8fb1ab9a7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-35cfc0009efc12be", "level": "note", "message": {"text": "Unused endpoint: POST /intake/submissions/:id/reject"}, "properties": {"repobilityId": "da4f269c9e74e9b4", "scanner": "scanner-primary", "fingerprint": "35cfc0009efc12be", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0557bb7e0f044b4b", "level": "note", "message": {"text": "Unused endpoint: GET /places/autocomplete"}, "properties": {"repobilityId": "9c8be561d5ca3e4d", "scanner": "scanner-primary", "fingerprint": "0557bb7e0f044b4b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-49052a01392ff2eb", "level": "note", "message": {"text": "Unused endpoint: GET /places/details"}, "properties": {"repobilityId": "6db40b6e0ca6134b", "scanner": "scanner-primary", "fingerprint": "49052a01392ff2eb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-36aa5c58f14e2e25", "level": "note", "message": {"text": "Unused endpoint: GET /axesso/usage"}, "properties": {"repobilityId": "ffa313b22e9a22a1", "scanner": "scanner-primary", "fingerprint": "36aa5c58f14e2e25", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7bb2ae9a074f7d26", "level": "note", "message": {"text": "Unused endpoint: POST /axesso/search-by-address"}, "properties": {"repobilityId": "e6fd54bafbc49801", "scanner": "scanner-primary", "fingerprint": "7bb2ae9a074f7d26", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca59ed619167c2a3", "level": "note", "message": {"text": "Unused endpoint: POST /axesso/recently-sold"}, "properties": {"repobilityId": "2ec65cf2b5100d41", "scanner": "scanner-primary", "fingerprint": "ca59ed619167c2a3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f341c8390e25502c", "level": "note", "message": {"text": "Unused endpoint: POST /axesso/property-v2"}, "properties": {"repobilityId": "dc796cf67458322b", "scanner": "scanner-primary", "fingerprint": "f341c8390e25502c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-228c56b583db896a", "level": "note", "message": {"text": "Unused endpoint: POST /axesso/similar-sold"}, "properties": {"repobilityId": "f616d262de01a836", "scanner": "scanner-primary", "fingerprint": "228c56b583db896a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9d401478d16297bf", "level": "note", "message": {"text": "Unused endpoint: POST /axesso/price-tax-history"}, "properties": {"repobilityId": "44e18da01b04c07c", "scanner": "scanner-primary", "fingerprint": "9d401478d16297bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fb3a4e4a08e66edf", "level": "note", "message": {"text": "Unused endpoint: POST /axesso/proof"}, "properties": {"repobilityId": "c6d68d93d9d3a0e9", "scanner": "scanner-primary", "fingerprint": "fb3a4e4a08e66edf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-10e024214672dade", "level": "note", "message": {"text": "Unused endpoint: GET /street-view/playwright-check"}, "properties": {"repobilityId": "0af3efe448413336", "scanner": "scanner-primary", "fingerprint": "10e024214672dade", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0d7c55c59ba51683", "level": "note", "message": {"text": "Unused endpoint: POST /street-view/timeline"}, "properties": {"repobilityId": "894e2703767b741c", "scanner": "scanner-primary", "fingerprint": "0d7c55c59ba51683", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3aaa358293ffbb0f", "level": "note", "message": {"text": "Unused endpoint: GET /api/v1/rentcast/usage"}, "properties": {"repobilityId": "ee078ebadd8946d8", "scanner": "scanner-primary", "fingerprint": "3aaa358293ffbb0f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ae88f74bc97e3637", "level": "note", "message": {"text": "Unused endpoint: POST /api/v1/rentcast/estimate"}, "properties": {"repobilityId": "0df9d2a248d46728", "scanner": "scanner-primary", "fingerprint": "ae88f74bc97e3637", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b119bb52041e0c8d", "level": "note", "message": {"text": "Unused endpoint: GET /auth/profile"}, "properties": {"repobilityId": "7dd6bbee84472c04", "scanner": "scanner-primary", "fingerprint": "b119bb52041e0c8d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a754d7e6dc144263", "level": "note", "message": {"text": "Unused endpoint: POST /auth/webhooks/clerk"}, "properties": {"repobilityId": "fa5e2090566c20f7", "scanner": "scanner-primary", "fingerprint": "a754d7e6dc144263", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3653231b15cfe77d", "level": "note", "message": {"text": "Unused endpoint: POST /teams/invite"}, "properties": {"repobilityId": "02bb0cd34dc9c66d", "scanner": "scanner-primary", "fingerprint": "3653231b15cfe77d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4c0eb9d9a4a4e6a8", "level": "note", "message": {"text": "Unused endpoint: PATCH /teams/:id/role"}, "properties": {"repobilityId": "0fe7bd3437297a82", "scanner": "scanner-primary", "fingerprint": "4c0eb9d9a4a4e6a8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}