{"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-b0654540c82e9ce0", "name": "Stray `console.log` in TS/JS \u2014 _archive/electron/src/renderer/app.js:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 _archive/electron/src/renderer/app.js:32"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f03944f0d64e4d81", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-chunks.ts:56", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-chunks.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-4c3f2397650ac5b0", "name": "Stray `console.log` in TS/JS \u2014 scripts/update-cases.ts:276", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/update-cases.ts:276"}, "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-f5a76d2789229eed", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/CaseTable.tsx:264", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CaseTable.tsx:264"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-79a8ed2945fc5893", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cases/route.ts:77", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cases/route.ts:77"}, "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-5e947cbb461ab36d", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cases/[id]/refresh/route.ts:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cases/[id]/refresh/route.ts:54"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8311c5b467f0d72d", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/webhook/route.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhook/route.ts:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ecf4abbdc280610", "name": "TODO/FIXME marker in shipping code \u2014 src/app/api/search/route.ts:127", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/search/route.ts:127"}, "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-413c2cf0ff48a0eb", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/search/route.ts:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/search/route.ts:89"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a25b6118688d7ce1", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/update-cases/route.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/update-cases/route.ts:44"}, "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-d3d6ba823d78d976", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/aggregate-judgments/route.ts:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/aggregate-judgments/route.ts:57"}, "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-bb35566d9547aee9", "name": "Stray `console.log` in TS/JS \u2014 src/app/search/page.tsx:187", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/search/page.tsx:187"}, "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-46dea1551af5d319", "name": "Stray `console.log` in TS/JS \u2014 src/lib/captcha-free.ts:111", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/captcha-free.ts:111"}, "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-4a5003d180c0336d", "name": "Stray `console.log` in TS/JS \u2014 src/lib/claude-ai.ts:43", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/claude-ai.ts:43"}, "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-955b18c223ff6a22", "name": "Stray `console.log` in TS/JS \u2014 src/lib/news/ingest.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/news/ingest.ts:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-12a5ba1aef25217a", "name": "Stray `console.log` in TS/JS \u2014 src/lib/courts/court-service.ts:74", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/courts/court-service.ts:74"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-99dca2dabd2108af", "name": "Stray `console.log` in TS/JS \u2014 src/lib/courts/sc-scraper.ts:267", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/courts/sc-scraper.ts:267"}, "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-a0a34c84d9f56469", "name": "Stray `console.log` in TS/JS \u2014 src/lib/courts/ecourts-scraper.ts:160", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/courts/ecourts-scraper.ts:160"}, "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-4a81456853e764aa", "name": "Stray `console.log` in TS/JS \u2014 src/lib/courts/cl-ingest.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/courts/cl-ingest.ts:48"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f5fe472da6fe7943", "name": "Stray `console.log` in TS/JS \u2014 src/lib/briefing/build.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/briefing/build.ts:44"}, "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-6ee78b17af175a25", "name": "Insecure pattern 'direct_innerhtml_assignment' in _archive/electron/src/renderer/app.js:108", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in _archive/electron/src/renderer/app.js:108"}, "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-c332f9c6d8ead88e", "name": "Insecure pattern 'debug_true' in _archive/flask/app.py:402", "shortDescription": {"text": "Insecure pattern 'debug_true' in _archive/flask/app.py:402"}, "fullDescription": {"text": "Found a known-risky pattern (debug_true). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-48a9775316593ccd", "name": "Insecure pattern 'node_child_process' in src/lib/captcha-free.ts:15", "shortDescription": {"text": "Insecure pattern 'node_child_process' in src/lib/captcha-free.ts:15"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7efbda965f283c17", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6761ba87f2115511", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "9 test file(s) for 118 source file(s) (ratio 0.08). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 85 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 30 placeholder/mock markers across 13 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-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-462d3fe6359b2455", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/CauseList.tsx:95", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/CauseList.tsx:95"}, "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-741dd152ffbe6f03", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/settings/page.tsx:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/settings/page.tsx:18"}, "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-bc8fd46fa19cc9bb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/cases/[id]/refresh/route.ts:128", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/cases/[id]/refresh/route.ts:128"}, "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-1c689aea714cff36", "name": "Commented-code block (5 lines) in src/app/api/research/[tid]/route.ts:128", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/research/[tid]/route.ts:128"}, "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-2399b88a975764eb", "name": "Commented-code block (5 lines) in src/app/api/search/semantic/route.ts:151", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/search/semantic/route.ts:151"}, "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-0af41e14a9f33db9", "name": "Commented-code block (5 lines) in src/app/search/semantic/page.tsx:90", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/search/semantic/page.tsx:90"}, "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-79e24478c5416145", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/case/[id]/page.tsx:122", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/case/[id]/page.tsx:122"}, "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-54215511a1f3d903", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/saved-searches/page.tsx:119", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/saved-searches/page.tsx:119"}, "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-58e04d799fa3401c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/causelist/ecourtsindia.ts:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/causelist/ecourtsindia.ts:59"}, "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-1affc6f35f0ce14a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/courts/sc-scraper.ts:916", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/courts/sc-scraper.ts:916"}, "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-b0b5e7cb1208a7cd", "name": "13 env vars used in code but missing from .env.example", "shortDescription": {"text": "13 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANTHROPIC_API_KEY`, `ANTHROPIC_MODEL`, `COURTLISTENER_API_KEY`, `ECOURTSINDIA_MCP_URL`, `GEMINI_API_KEY`, `GEMINI_MODEL`, `IK_API_KEY`, `LLM_PROVIDER` + 5 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\n_archive/flask/app.py:api_cases, _archive/flask/app.py:api_case\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ca5f433cd6a7a56d", "name": "Flask mutation route `api_cases` without `@login_required` \u2014 _archive/flask/app.py:142", "shortDescription": {"text": "Flask mutation route `api_cases` without `@login_required` \u2014 _archive/flask/app.py:142"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-32e0e0be0bd83548", "name": "Flask mutation route `api_case` without `@login_required` \u2014 _archive/flask/app.py:192", "shortDescription": {"text": "Flask mutation route `api_case` without `@login_required` \u2014 _archive/flask/app.py:192"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3091c6bc3d90f000", "name": "Flask mutation route `api_hearings` without `@login_required` \u2014 _archive/flask/app.py:269", "shortDescription": {"text": "Flask mutation route `api_hearings` without `@login_required` \u2014 _archive/flask/app.py:269"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4fb115a49fc95b4d", "name": "Flask mutation route `api_hearing` without `@login_required` \u2014 _archive/flask/app.py:332", "shortDescription": {"text": "Flask mutation route `api_hearing` without `@login_required` \u2014 _archive/flask/app.py:332"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-038b5cc7b652dd4e", "name": "Dangling fetch: POST https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage (scripts/update-cases.ts:136)", "shortDescription": {"text": "Dangling fetch: POST https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage (scripts/update-cases.ts:136)"}, "fullDescription": {"text": "`scripts/update-cases.ts:136` calls `POST https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage` 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.telegram.org/bot/<p>/sendmessage`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-de1f9dcb80390d4b", "name": "Dangling fetch: GET /api/displayboard (src/components/DisplayBoard.tsx:74)", "shortDescription": {"text": "Dangling fetch: GET /api/displayboard (src/components/DisplayBoard.tsx:74)"}, "fullDescription": {"text": "`src/components/DisplayBoard.tsx:74` calls `GET /api/displayboard` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/displayboard`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2ccd4d3df03f86af", "name": "Dangling fetch: POST /api/watchlist (src/components/WatchlistPanel.tsx:91)", "shortDescription": {"text": "Dangling fetch: POST /api/watchlist (src/components/WatchlistPanel.tsx:91)"}, "fullDescription": {"text": "`src/components/WatchlistPanel.tsx:91` calls `POST /api/watchlist` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/watchlist`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-45f49274babcccf6", "name": "Dangling fetch: GET /api/watchlist (src/components/WatchlistPanel.tsx:233)", "shortDescription": {"text": "Dangling fetch: GET /api/watchlist (src/components/WatchlistPanel.tsx:233)"}, "fullDescription": {"text": "`src/components/WatchlistPanel.tsx:233` calls `GET /api/watchlist` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/watchlist`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9e3ad9b6d1a35abe", "name": "Dangling fetch: DELETE /api/watchlist/${id} (src/components/WatchlistPanel.tsx:249)", "shortDescription": {"text": "Dangling fetch: DELETE /api/watchlist/${id} (src/components/WatchlistPanel.tsx:249)"}, "fullDescription": {"text": "`src/components/WatchlistPanel.tsx:249` calls `DELETE /api/watchlist/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/watchlist/<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-c769a6949b384aaa", "name": "Dangling fetch: GET /api/sidebar (src/components/SideNav.tsx:97)", "shortDescription": {"text": "Dangling fetch: GET /api/sidebar (src/components/SideNav.tsx:97)"}, "fullDescription": {"text": "`src/components/SideNav.tsx:97` calls `GET /api/sidebar` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sidebar`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c134a759660d82c0", "name": "Dangling fetch: GET /api/briefing (src/components/AIBriefingStrip.tsx:26)", "shortDescription": {"text": "Dangling fetch: GET /api/briefing (src/components/AIBriefingStrip.tsx:26)"}, "fullDescription": {"text": "`src/components/AIBriefingStrip.tsx:26` calls `GET /api/briefing` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/briefing`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d7f4391bf04793e2", "name": "Dangling fetch: GET /api/search/global?q=${encodeURIComponent(q)} (src/components/TopBar.tsx:92)", "shortDescription": {"text": "Dangling fetch: GET /api/search/global?q=${encodeURIComponent(q)} (src/components/TopBar.tsx:92)"}, "fullDescription": {"text": "`src/components/TopBar.tsx:92` calls `GET /api/search/global?q=${encodeURIComponent(q)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/search/global`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a7a5a3fea2a6250c", "name": "Dangling fetch: GET /api/causelist?days=7 (src/components/CauseList.tsx:112)", "shortDescription": {"text": "Dangling fetch: GET /api/causelist?days=7 (src/components/CauseList.tsx:112)"}, "fullDescription": {"text": "`src/components/CauseList.tsx:112` calls `GET /api/causelist?days=7` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/causelist`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f9a8eb677f1035e0", "name": "Dangling fetch: GET /api/health (src/components/DashboardShell.tsx:60)", "shortDescription": {"text": "Dangling fetch: GET /api/health (src/components/DashboardShell.tsx:60)"}, "fullDescription": {"text": "`src/components/DashboardShell.tsx:60` calls `GET /api/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/health`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8acd41601ac67573", "name": "Dangling fetch: GET /api/judgments?limit=${limit} (src/components/LiveDigest.tsx:116)", "shortDescription": {"text": "Dangling fetch: GET /api/judgments?limit=${limit} (src/components/LiveDigest.tsx:116)"}, "fullDescription": {"text": "`src/components/LiveDigest.tsx:116` calls `GET /api/judgments?limit=${limit}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/judgments`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f5841ea50de8eb93", "name": "Dangling fetch: GET /api/news?limit=${limit} (src/components/LiveDigest.tsx:127)", "shortDescription": {"text": "Dangling fetch: GET /api/news?limit=${limit} (src/components/LiveDigest.tsx:127)"}, "fullDescription": {"text": "`src/components/LiveDigest.tsx:127` calls `GET /api/news?limit=${limit}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/news`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4e5a479e141a6443", "name": "Dangling fetch: GET /api/saved-searches (src/components/SavedSearchAlertsStrip.tsx:33)", "shortDescription": {"text": "Dangling fetch: GET /api/saved-searches (src/components/SavedSearchAlertsStrip.tsx:33)"}, "fullDescription": {"text": "`src/components/SavedSearchAlertsStrip.tsx:33` calls `GET /api/saved-searches` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/saved-searches`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2fbaa95ca019445d", "name": "Dangling fetch: GET /api/alerts (src/app/settings/page.tsx:18)", "shortDescription": {"text": "Dangling fetch: GET /api/alerts (src/app/settings/page.tsx:18)"}, "fullDescription": {"text": "`src/app/settings/page.tsx:18` calls `GET /api/alerts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/alerts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fc3ad73538073369", "name": "Dangling fetch: PATCH /api/alerts (src/app/settings/page.tsx:38)", "shortDescription": {"text": "Dangling fetch: PATCH /api/alerts (src/app/settings/page.tsx:38)"}, "fullDescription": {"text": "`src/app/settings/page.tsx:38` calls `PATCH /api/alerts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/alerts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d3e1c178b3d57387", "name": "Dangling fetch: GET /api/us-opinions${qs} (src/app/us-opinions/page.tsx:72)", "shortDescription": {"text": "Dangling fetch: GET /api/us-opinions${qs} (src/app/us-opinions/page.tsx:72)"}, "fullDescription": {"text": "`src/app/us-opinions/page.tsx:72` calls `GET /api/us-opinions${qs}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/us-opinions/<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-2966944767571c65", "name": "Dangling fetch: GET /api/judges/${encodeURIComponent(slug)} (src/app/judges/[slug]/page.tsx:279)", "shortDescription": {"text": "Dangling fetch: GET /api/judges/${encodeURIComponent(slug)} (src/app/judges/[slug]/page.tsx:279)"}, "fullDescription": {"text": "`src/app/judges/[slug]/page.tsx:279` calls `GET /api/judges/${encodeURIComponent(slug)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/judges/<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-26cee28f8786a57d", "name": "Dangling fetch: GET https://www.sci.gov.in/case-status-case-no/ (src/app/api/cases/[id]/refresh/route.ts:504)", "shortDescription": {"text": "Dangling fetch: GET https://www.sci.gov.in/case-status-case-no/ (src/app/api/cases/[id]/refresh/route.ts:504)"}, "fullDescription": {"text": "`src/app/api/cases/[id]/refresh/route.ts:504` calls `GET https://www.sci.gov.in/case-status-case-no/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.sci.gov.in/case-status-case-no`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aecbd734f38acf86", "name": "Dangling fetch: GET /api/research/${tidParam} (src/app/research/[tid]/page.tsx:364)", "shortDescription": {"text": "Dangling fetch: GET /api/research/${tidParam} (src/app/research/[tid]/page.tsx:364)"}, "fullDescription": {"text": "`src/app/research/[tid]/page.tsx:364` calls `GET /api/research/${tidParam}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/research/<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-b7351875b11cdbc5", "name": "Dangling fetch: GET /api/watchlist (src/app/dashboard/page.tsx:47)", "shortDescription": {"text": "Dangling fetch: GET /api/watchlist (src/app/dashboard/page.tsx:47)"}, "fullDescription": {"text": "`src/app/dashboard/page.tsx:47` calls `GET /api/watchlist` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/watchlist`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-30926fc1a18e7175", "name": "Dangling fetch: GET /api/health (src/app/dashboard/page.tsx:51)", "shortDescription": {"text": "Dangling fetch: GET /api/health (src/app/dashboard/page.tsx:51)"}, "fullDescription": {"text": "`src/app/dashboard/page.tsx:51` calls `GET /api/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/health`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-855bf51c7c599058", "name": "Dangling fetch: GET /api/courts?action=districts&state_code=${sc} (src/app/search/page.tsx:95)", "shortDescription": {"text": "Dangling fetch: GET /api/courts?action=districts&state_code=${sc} (src/app/search/page.tsx:95)"}, "fullDescription": {"text": "`src/app/search/page.tsx:95` calls `GET /api/courts?action=districts&state_code=${sc}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/courts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1aacf5ec789c61b7", "name": "Dangling fetch: GET /api/search?${params} (src/app/search/page.tsx:189)", "shortDescription": {"text": "Dangling fetch: GET /api/search?${params} (src/app/search/page.tsx:189)"}, "fullDescription": {"text": "`src/app/search/page.tsx:189` calls `GET /api/search?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\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-14ea36cf9c887041", "name": "Dangling fetch: GET /api/search/semantic?${params} (src/app/search/semantic/page.tsx:144)", "shortDescription": {"text": "Dangling fetch: GET /api/search/semantic?${params} (src/app/search/semantic/page.tsx:144)"}, "fullDescription": {"text": "`src/app/search/semantic/page.tsx:144` calls `GET /api/search/semantic?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/search/semantic`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2157c41406412890", "name": "Dangling fetch: POST /api/saved-searches (src/app/search/semantic/page.tsx:183)", "shortDescription": {"text": "Dangling fetch: POST /api/saved-searches (src/app/search/semantic/page.tsx:183)"}, "fullDescription": {"text": "`src/app/search/semantic/page.tsx:183` calls `POST /api/saved-searches` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/saved-searches`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6b529bc82dbd74a2", "name": "Dangling fetch: GET /api/cases/${id} (src/app/case/[id]/page.tsx:93)", "shortDescription": {"text": "Dangling fetch: GET /api/cases/${id} (src/app/case/[id]/page.tsx:93)"}, "fullDescription": {"text": "`src/app/case/[id]/page.tsx:93` calls `GET /api/cases/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cases/<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-4388b3f5ee5c51da", "name": "Dangling fetch: PATCH /api/cases/${id} (src/app/case/[id]/page.tsx:122)", "shortDescription": {"text": "Dangling fetch: PATCH /api/cases/${id} (src/app/case/[id]/page.tsx:122)"}, "fullDescription": {"text": "`src/app/case/[id]/page.tsx:122` calls `PATCH /api/cases/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cases/<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-4c6c14c840cf6a4f", "name": "Dangling fetch: PATCH /api/cases/${id} (src/app/case/[id]/page.tsx:133)", "shortDescription": {"text": "Dangling fetch: PATCH /api/cases/${id} (src/app/case/[id]/page.tsx:133)"}, "fullDescription": {"text": "`src/app/case/[id]/page.tsx:133` calls `PATCH /api/cases/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cases/<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-264513fad2cd166c", "name": "Dangling fetch: PATCH /api/cases/${id} (src/app/case/[id]/page.tsx:145)", "shortDescription": {"text": "Dangling fetch: PATCH /api/cases/${id} (src/app/case/[id]/page.tsx:145)"}, "fullDescription": {"text": "`src/app/case/[id]/page.tsx:145` calls `PATCH /api/cases/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cases/<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-c0e7651cf7a61c12", "name": "Dangling fetch: DELETE /api/cases/${id} (src/app/case/[id]/page.tsx:155)", "shortDescription": {"text": "Dangling fetch: DELETE /api/cases/${id} (src/app/case/[id]/page.tsx:155)"}, "fullDescription": {"text": "`src/app/case/[id]/page.tsx:155` calls `DELETE /api/cases/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cases/<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-f4e32dc5a126d1f3", "name": "Dangling fetch: POST /api/cases/${id}/refresh (src/app/case/[id]/page.tsx:162)", "shortDescription": {"text": "Dangling fetch: POST /api/cases/${id}/refresh (src/app/case/[id]/page.tsx:162)"}, "fullDescription": {"text": "`src/app/case/[id]/page.tsx:162` calls `POST /api/cases/${id}/refresh` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cases/<p>/refresh`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cbaba19344011293", "name": "Dangling fetch: GET /api/cases/${id} (src/app/case/[id]/page.tsx:164)", "shortDescription": {"text": "Dangling fetch: GET /api/cases/${id} (src/app/case/[id]/page.tsx:164)"}, "fullDescription": {"text": "`src/app/case/[id]/page.tsx:164` calls `GET /api/cases/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cases/<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-b008f304628fdc6e", "name": "Dangling fetch: GET /api/search/semantic?${params} (src/app/case/[id]/page.tsx:198)", "shortDescription": {"text": "Dangling fetch: GET /api/search/semantic?${params} (src/app/case/[id]/page.tsx:198)"}, "fullDescription": {"text": "`src/app/case/[id]/page.tsx:198` calls `GET /api/search/semantic?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/search/semantic`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9a22fb9881db4803", "name": "Dangling fetch: POST /api/cases/${id}/order-summaries (src/app/case/[id]/page.tsx:243)", "shortDescription": {"text": "Dangling fetch: POST /api/cases/${id}/order-summaries (src/app/case/[id]/page.tsx:243)"}, "fullDescription": {"text": "`src/app/case/[id]/page.tsx:243` calls `POST /api/cases/${id}/order-summaries` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cases/<p>/order-summaries`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-82bd17b0c0ddaeae", "name": "Dangling fetch: POST /api/cases/${id}/summarize (src/app/case/[id]/page.tsx:267)", "shortDescription": {"text": "Dangling fetch: POST /api/cases/${id}/summarize (src/app/case/[id]/page.tsx:267)"}, "fullDescription": {"text": "`src/app/case/[id]/page.tsx:267` calls `POST /api/cases/${id}/summarize` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cases/<p>/summarize`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b1cc01cf5b795a7d", "name": "Dangling fetch: GET /api/cases/${id} (src/app/case/[id]/chronology/page.tsx:102)", "shortDescription": {"text": "Dangling fetch: GET /api/cases/${id} (src/app/case/[id]/chronology/page.tsx:102)"}, "fullDescription": {"text": "`src/app/case/[id]/chronology/page.tsx:102` calls `GET /api/cases/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cases/<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-30fb1469a5c225cb", "name": "Dangling fetch: GET /api/saved-searches (src/app/saved-searches/page.tsx:55)", "shortDescription": {"text": "Dangling fetch: GET /api/saved-searches (src/app/saved-searches/page.tsx:55)"}, "fullDescription": {"text": "`src/app/saved-searches/page.tsx:55` calls `GET /api/saved-searches` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/saved-searches`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0b4539494bb267b0", "name": "Dangling fetch: POST /api/saved-searches/${id}/run (src/app/saved-searches/page.tsx:96)", "shortDescription": {"text": "Dangling fetch: POST /api/saved-searches/${id}/run (src/app/saved-searches/page.tsx:96)"}, "fullDescription": {"text": "`src/app/saved-searches/page.tsx:96` calls `POST /api/saved-searches/${id}/run` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/saved-searches/<p>/run`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ca265debca3218b5", "name": "Dangling fetch: POST /api/saved-searches/${s.id}/run (src/app/saved-searches/page.tsx:119)", "shortDescription": {"text": "Dangling fetch: POST /api/saved-searches/${s.id}/run (src/app/saved-searches/page.tsx:119)"}, "fullDescription": {"text": "`src/app/saved-searches/page.tsx:119` calls `POST /api/saved-searches/${s.id}/run` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/saved-searches/<p>/run`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3ee331323eedd2ef", "name": "Dangling fetch: DELETE /api/saved-searches/${id} (src/app/saved-searches/page.tsx:139)", "shortDescription": {"text": "Dangling fetch: DELETE /api/saved-searches/${id} (src/app/saved-searches/page.tsx:139)"}, "fullDescription": {"text": "`src/app/saved-searches/page.tsx:139` calls `DELETE /api/saved-searches/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/saved-searches/<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-7ab8ece0c764a6d8", "name": "Dangling fetch: GET /api/briefing (src/app/briefing/page.tsx:22)", "shortDescription": {"text": "Dangling fetch: GET /api/briefing (src/app/briefing/page.tsx:22)"}, "fullDescription": {"text": "`src/app/briefing/page.tsx:22` calls `GET /api/briefing` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/briefing`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d0dd5ee5fe8f749e", "name": "Dangling fetch: GET https://hcservices.ecourts.gov.in${captchaMatch[0]} (src/lib/courts/ecourts-scraper.ts:895)", "shortDescription": {"text": "Dangling fetch: GET https://hcservices.ecourts.gov.in${captchaMatch[0]} (src/lib/courts/ecourts-scraper.ts:895)"}, "fullDescription": {"text": "`src/lib/courts/ecourts-scraper.ts:895` calls `GET https://hcservices.ecourts.gov.in${captchaMatch[0]}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/hcservices.ecourts.gov.in/<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-1a6d91f2236825bf", "name": "Unused endpoint: ANY /", "shortDescription": {"text": "Unused endpoint: ANY /"}, "fullDescription": {"text": "`_archive/flask/app.py` declares `ANY /` 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-119242d3375db533", "name": "Unused endpoint: ANY /api/dashboard/stats", "shortDescription": {"text": "Unused endpoint: ANY /api/dashboard/stats"}, "fullDescription": {"text": "`_archive/flask/app.py` declares `ANY /api/dashboard/stats` 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-37f37b64b92fbb43", "name": "Unused endpoint: ANY /api/cases", "shortDescription": {"text": "Unused endpoint: ANY /api/cases"}, "fullDescription": {"text": "`_archive/flask/app.py` declares `ANY /api/cases` 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-f47e350bb696dd75", "name": "Unused endpoint: ANY /api/cases/<int:case_id>", "shortDescription": {"text": "Unused endpoint: ANY /api/cases/<int:case_id>"}, "fullDescription": {"text": "`_archive/flask/app.py` declares `ANY /api/cases/<int:case_id>` 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-b6854decde40816b", "name": "Unused endpoint: ANY /hearings", "shortDescription": {"text": "Unused endpoint: ANY /hearings"}, "fullDescription": {"text": "`_archive/flask/app.py` declares `ANY /hearings` 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-4943cdf42a897413", "name": "Unused endpoint: ANY /api/hearings", "shortDescription": {"text": "Unused endpoint: ANY /api/hearings"}, "fullDescription": {"text": "`_archive/flask/app.py` declares `ANY /api/hearings` 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-33b70230641db54a", "name": "Unused endpoint: ANY /api/hearings/<int:hearing_id>", "shortDescription": {"text": "Unused endpoint: ANY /api/hearings/<int:hearing_id>"}, "fullDescription": {"text": "`_archive/flask/app.py` declares `ANY /api/hearings/<int:hearing_id>` 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-648473c031682470", "name": "Unused endpoint: ANY /api/upcoming-hearings", "shortDescription": {"text": "Unused endpoint: ANY /api/upcoming-hearings"}, "fullDescription": {"text": "`_archive/flask/app.py` declares `ANY /api/upcoming-hearings` 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/17621"}, "properties": {"repository": "quantraven93/lexquant", "repoUrl": "https://github.com/quantraven93/lexquant", "branch": "main"}, "results": [{"ruleId": "scanner-b0654540c82e9ce0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 _archive/electron/src/renderer/app.js:32"}, "properties": {"repobilityId": "0d1bffbf53499e66", "scanner": "scanner-primary", "fingerprint": "b0654540c82e9ce0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f03944f0d64e4d81", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-chunks.ts:56"}, "properties": {"repobilityId": "5c92eae856344759", "scanner": "scanner-primary", "fingerprint": "f03944f0d64e4d81", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4c3f2397650ac5b0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/update-cases.ts:276"}, "properties": {"repobilityId": "1b74870c33b3c2f7", "scanner": "scanner-primary", "fingerprint": "4c3f2397650ac5b0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f5a76d2789229eed", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CaseTable.tsx:264"}, "properties": {"repobilityId": "dad0ed8c9f784d6a", "scanner": "scanner-primary", "fingerprint": "f5a76d2789229eed", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-79a8ed2945fc5893", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cases/route.ts:77"}, "properties": {"repobilityId": "29695b2cd2d1fb44", "scanner": "scanner-primary", "fingerprint": "79a8ed2945fc5893", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5e947cbb461ab36d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cases/[id]/refresh/route.ts:54"}, "properties": {"repobilityId": "5f99908a4d267f37", "scanner": "scanner-primary", "fingerprint": "5e947cbb461ab36d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8311c5b467f0d72d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhook/route.ts:10"}, "properties": {"repobilityId": "846c6f4c7ef42c35", "scanner": "scanner-primary", "fingerprint": "8311c5b467f0d72d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3ecf4abbdc280610", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/search/route.ts:127"}, "properties": {"repobilityId": "89745f3824274d7e", "scanner": "scanner-primary", "fingerprint": "3ecf4abbdc280610", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-413c2cf0ff48a0eb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/search/route.ts:89"}, "properties": {"repobilityId": "fc53b778ff5dce44", "scanner": "scanner-primary", "fingerprint": "413c2cf0ff48a0eb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a25b6118688d7ce1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/update-cases/route.ts:44"}, "properties": {"repobilityId": "3b503d8412f0d070", "scanner": "scanner-primary", "fingerprint": "a25b6118688d7ce1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d3d6ba823d78d976", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/aggregate-judgments/route.ts:57"}, "properties": {"repobilityId": "564bab11958adc58", "scanner": "scanner-primary", "fingerprint": "d3d6ba823d78d976", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bb35566d9547aee9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/search/page.tsx:187"}, "properties": {"repobilityId": "a3ff1bf2930a4b7c", "scanner": "scanner-primary", "fingerprint": "bb35566d9547aee9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-46dea1551af5d319", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/captcha-free.ts:111"}, "properties": {"repobilityId": "84f9f71485e8c562", "scanner": "scanner-primary", "fingerprint": "46dea1551af5d319", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4a5003d180c0336d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/claude-ai.ts:43"}, "properties": {"repobilityId": "e91515c363d7708f", "scanner": "scanner-primary", "fingerprint": "4a5003d180c0336d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-955b18c223ff6a22", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/news/ingest.ts:22"}, "properties": {"repobilityId": "b5bcce7809a38b91", "scanner": "scanner-primary", "fingerprint": "955b18c223ff6a22", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-12a5ba1aef25217a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/courts/court-service.ts:74"}, "properties": {"repobilityId": "320d2d1d451b51d4", "scanner": "scanner-primary", "fingerprint": "12a5ba1aef25217a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-99dca2dabd2108af", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/courts/sc-scraper.ts:267"}, "properties": {"repobilityId": "8356992a86cc3df2", "scanner": "scanner-primary", "fingerprint": "99dca2dabd2108af", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a0a34c84d9f56469", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/courts/ecourts-scraper.ts:160"}, "properties": {"repobilityId": "c0667edeb9994269", "scanner": "scanner-primary", "fingerprint": "a0a34c84d9f56469", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4a81456853e764aa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/courts/cl-ingest.ts:48"}, "properties": {"repobilityId": "22cf05912dd5aa9f", "scanner": "scanner-primary", "fingerprint": "4a81456853e764aa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f5fe472da6fe7943", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/briefing/build.ts:44"}, "properties": {"repobilityId": "d8bc0ee176761035", "scanner": "scanner-primary", "fingerprint": "f5fe472da6fe7943", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6ee78b17af175a25", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in _archive/electron/src/renderer/app.js:108"}, "properties": {"repobilityId": "1460a187f83319ad", "scanner": "scanner-primary", "fingerprint": "6ee78b17af175a25", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "_archive/electron/src/renderer/app.js"}, "region": {"startLine": 108}}}]}, {"ruleId": "scanner-c332f9c6d8ead88e", "level": "note", "message": {"text": "Insecure pattern 'debug_true' in _archive/flask/app.py:402"}, "properties": {"repobilityId": "7b3a30f063c190f8", "scanner": "scanner-primary", "fingerprint": "c332f9c6d8ead88e", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "debug_true"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "_archive/flask/app.py"}, "region": {"startLine": 402}}}]}, {"ruleId": "scanner-48a9775316593ccd", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in src/lib/captcha-free.ts:15"}, "properties": {"repobilityId": "4070b3aa413bfb8d", "scanner": "scanner-primary", "fingerprint": "48a9775316593ccd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/captcha-free.ts"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "56929525eac9a554", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "edb2bb8632e63196", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-6761ba87f2115511", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "da44fe97b4b050f7", "scanner": "scanner-primary", "fingerprint": "6761ba87f2115511", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/scraper.yml"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-6761ba87f2115511", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "122bd04a7d849b73", "scanner": "scanner-primary", "fingerprint": "6761ba87f2115511", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/scraper.yml"}, "region": {"startLine": 18}}}]}, {"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": "a5f0947a8f1a1c32", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "189f7ebc01d9daac", "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": "2a23da024f2265fd", "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": "b0cd7ab5999c23f0", "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": "6bbbb396be6915a1", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "9d295d132f811072", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "e8b7f4acbca35c8f", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-462d3fe6359b2455", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/CauseList.tsx:95"}, "properties": {"repobilityId": "48761f0fa558b222", "scanner": "scanner-primary", "fingerprint": "462d3fe6359b2455", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-741dd152ffbe6f03", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/settings/page.tsx:18"}, "properties": {"repobilityId": "a85dd49e663d3905", "scanner": "scanner-primary", "fingerprint": "741dd152ffbe6f03", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bc8fd46fa19cc9bb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/cases/[id]/refresh/route.ts:128"}, "properties": {"repobilityId": "f90e82de96ee7bdd", "scanner": "scanner-primary", "fingerprint": "bc8fd46fa19cc9bb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1c689aea714cff36", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/research/[tid]/route.ts:128"}, "properties": {"repobilityId": "42b055706e59b27c", "scanner": "scanner-primary", "fingerprint": "1c689aea714cff36", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2399b88a975764eb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/search/semantic/route.ts:151"}, "properties": {"repobilityId": "3c1b1b3b98a31ce3", "scanner": "scanner-primary", "fingerprint": "2399b88a975764eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0af41e14a9f33db9", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/search/semantic/page.tsx:90"}, "properties": {"repobilityId": "27e642e6320f176c", "scanner": "scanner-primary", "fingerprint": "0af41e14a9f33db9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-79e24478c5416145", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/case/[id]/page.tsx:122"}, "properties": {"repobilityId": "65f3eeed2477b12a", "scanner": "scanner-primary", "fingerprint": "79e24478c5416145", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-54215511a1f3d903", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/saved-searches/page.tsx:119"}, "properties": {"repobilityId": "48bb36de66fbc3f1", "scanner": "scanner-primary", "fingerprint": "54215511a1f3d903", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-58e04d799fa3401c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/causelist/ecourtsindia.ts:59"}, "properties": {"repobilityId": "05d27bd1deacb9cf", "scanner": "scanner-primary", "fingerprint": "58e04d799fa3401c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1affc6f35f0ce14a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/courts/sc-scraper.ts:916"}, "properties": {"repobilityId": "88640f925213b00e", "scanner": "scanner-primary", "fingerprint": "1affc6f35f0ce14a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b0b5e7cb1208a7cd", "level": "note", "message": {"text": "13 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "2737b8666c1f7eeb", "scanner": "scanner-primary", "fingerprint": "b0b5e7cb1208a7cd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "2a948105211aba58", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "0d090696ca13ad6e", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-ca5f433cd6a7a56d", "level": "error", "message": {"text": "Flask mutation route `api_cases` without `@login_required` \u2014 _archive/flask/app.py:142"}, "properties": {"repobilityId": "69dddf67c48fb4ee", "scanner": "scanner-primary", "fingerprint": "ca5f433cd6a7a56d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "_archive/flask/app.py"}, "region": {"startLine": 142}}}]}, {"ruleId": "scanner-32e0e0be0bd83548", "level": "error", "message": {"text": "Flask mutation route `api_case` without `@login_required` \u2014 _archive/flask/app.py:192"}, "properties": {"repobilityId": "2ee937f6c1466db4", "scanner": "scanner-primary", "fingerprint": "32e0e0be0bd83548", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "_archive/flask/app.py"}, "region": {"startLine": 192}}}]}, {"ruleId": "scanner-3091c6bc3d90f000", "level": "error", "message": {"text": "Flask mutation route `api_hearings` without `@login_required` \u2014 _archive/flask/app.py:269"}, "properties": {"repobilityId": "2a1432d2610f2e7e", "scanner": "scanner-primary", "fingerprint": "3091c6bc3d90f000", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "_archive/flask/app.py"}, "region": {"startLine": 269}}}]}, {"ruleId": "scanner-4fb115a49fc95b4d", "level": "error", "message": {"text": "Flask mutation route `api_hearing` without `@login_required` \u2014 _archive/flask/app.py:332"}, "properties": {"repobilityId": "3aaeb33433e0ed5a", "scanner": "scanner-primary", "fingerprint": "4fb115a49fc95b4d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "_archive/flask/app.py"}, "region": {"startLine": 332}}}]}, {"ruleId": "scanner-038b5cc7b652dd4e", "level": "error", "message": {"text": "Dangling fetch: POST https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage (scripts/update-cases.ts:136)"}, "properties": {"repobilityId": "4dbbf60fa6cbab6a", "scanner": "scanner-primary", "fingerprint": "038b5cc7b652dd4e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-de1f9dcb80390d4b", "level": "error", "message": {"text": "Dangling fetch: GET /api/displayboard (src/components/DisplayBoard.tsx:74)"}, "properties": {"repobilityId": "b351e158aceef647", "scanner": "scanner-primary", "fingerprint": "de1f9dcb80390d4b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2ccd4d3df03f86af", "level": "error", "message": {"text": "Dangling fetch: POST /api/watchlist (src/components/WatchlistPanel.tsx:91)"}, "properties": {"repobilityId": "4419405d822b5d04", "scanner": "scanner-primary", "fingerprint": "2ccd4d3df03f86af", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-45f49274babcccf6", "level": "error", "message": {"text": "Dangling fetch: GET /api/watchlist (src/components/WatchlistPanel.tsx:233)"}, "properties": {"repobilityId": "146b982ddfec79ff", "scanner": "scanner-primary", "fingerprint": "45f49274babcccf6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9e3ad9b6d1a35abe", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/watchlist/${id} (src/components/WatchlistPanel.tsx:249)"}, "properties": {"repobilityId": "d0a25997491ac511", "scanner": "scanner-primary", "fingerprint": "9e3ad9b6d1a35abe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c769a6949b384aaa", "level": "error", "message": {"text": "Dangling fetch: GET /api/sidebar (src/components/SideNav.tsx:97)"}, "properties": {"repobilityId": "becf0ccde11acf64", "scanner": "scanner-primary", "fingerprint": "c769a6949b384aaa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c134a759660d82c0", "level": "error", "message": {"text": "Dangling fetch: GET /api/briefing (src/components/AIBriefingStrip.tsx:26)"}, "properties": {"repobilityId": "864b8d1b741b6b3f", "scanner": "scanner-primary", "fingerprint": "c134a759660d82c0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d7f4391bf04793e2", "level": "error", "message": {"text": "Dangling fetch: GET /api/search/global?q=${encodeURIComponent(q)} (src/components/TopBar.tsx:92)"}, "properties": {"repobilityId": "f49c356d9933d26b", "scanner": "scanner-primary", "fingerprint": "d7f4391bf04793e2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a7a5a3fea2a6250c", "level": "error", "message": {"text": "Dangling fetch: GET /api/causelist?days=7 (src/components/CauseList.tsx:112)"}, "properties": {"repobilityId": "e2f48b32c484cf51", "scanner": "scanner-primary", "fingerprint": "a7a5a3fea2a6250c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f9a8eb677f1035e0", "level": "error", "message": {"text": "Dangling fetch: GET /api/health (src/components/DashboardShell.tsx:60)"}, "properties": {"repobilityId": "db50273fe742ae0a", "scanner": "scanner-primary", "fingerprint": "f9a8eb677f1035e0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8acd41601ac67573", "level": "error", "message": {"text": "Dangling fetch: GET /api/judgments?limit=${limit} (src/components/LiveDigest.tsx:116)"}, "properties": {"repobilityId": "bae6fc3d45976b36", "scanner": "scanner-primary", "fingerprint": "8acd41601ac67573", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f5841ea50de8eb93", "level": "error", "message": {"text": "Dangling fetch: GET /api/news?limit=${limit} (src/components/LiveDigest.tsx:127)"}, "properties": {"repobilityId": "a378746b5a93df48", "scanner": "scanner-primary", "fingerprint": "f5841ea50de8eb93", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4e5a479e141a6443", "level": "error", "message": {"text": "Dangling fetch: GET /api/saved-searches (src/components/SavedSearchAlertsStrip.tsx:33)"}, "properties": {"repobilityId": "d9445cac874de552", "scanner": "scanner-primary", "fingerprint": "4e5a479e141a6443", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2fbaa95ca019445d", "level": "error", "message": {"text": "Dangling fetch: GET /api/alerts (src/app/settings/page.tsx:18)"}, "properties": {"repobilityId": "bc808082134d993f", "scanner": "scanner-primary", "fingerprint": "2fbaa95ca019445d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fc3ad73538073369", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/alerts (src/app/settings/page.tsx:38)"}, "properties": {"repobilityId": "3a7589b2c2d70412", "scanner": "scanner-primary", "fingerprint": "fc3ad73538073369", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d3e1c178b3d57387", "level": "error", "message": {"text": "Dangling fetch: GET /api/us-opinions${qs} (src/app/us-opinions/page.tsx:72)"}, "properties": {"repobilityId": "eecd27c8353ebe0d", "scanner": "scanner-primary", "fingerprint": "d3e1c178b3d57387", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2966944767571c65", "level": "error", "message": {"text": "Dangling fetch: GET /api/judges/${encodeURIComponent(slug)} (src/app/judges/[slug]/page.tsx:279)"}, "properties": {"repobilityId": "8b3e5dbe67458cc2", "scanner": "scanner-primary", "fingerprint": "2966944767571c65", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-26cee28f8786a57d", "level": "error", "message": {"text": "Dangling fetch: GET https://www.sci.gov.in/case-status-case-no/ (src/app/api/cases/[id]/refresh/route.ts:504)"}, "properties": {"repobilityId": "e40cfc1573ed0619", "scanner": "scanner-primary", "fingerprint": "26cee28f8786a57d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-aecbd734f38acf86", "level": "error", "message": {"text": "Dangling fetch: GET /api/research/${tidParam} (src/app/research/[tid]/page.tsx:364)"}, "properties": {"repobilityId": "cb1ec3b37b87f725", "scanner": "scanner-primary", "fingerprint": "aecbd734f38acf86", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b7351875b11cdbc5", "level": "error", "message": {"text": "Dangling fetch: GET /api/watchlist (src/app/dashboard/page.tsx:47)"}, "properties": {"repobilityId": "22e4b53864832755", "scanner": "scanner-primary", "fingerprint": "b7351875b11cdbc5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-30926fc1a18e7175", "level": "error", "message": {"text": "Dangling fetch: GET /api/health (src/app/dashboard/page.tsx:51)"}, "properties": {"repobilityId": "76f5846704fcde3e", "scanner": "scanner-primary", "fingerprint": "30926fc1a18e7175", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-855bf51c7c599058", "level": "error", "message": {"text": "Dangling fetch: GET /api/courts?action=districts&state_code=${sc} (src/app/search/page.tsx:95)"}, "properties": {"repobilityId": "3668d6a9c57359ef", "scanner": "scanner-primary", "fingerprint": "855bf51c7c599058", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1aacf5ec789c61b7", "level": "error", "message": {"text": "Dangling fetch: GET /api/search?${params} (src/app/search/page.tsx:189)"}, "properties": {"repobilityId": "7c9290edaa9e0103", "scanner": "scanner-primary", "fingerprint": "1aacf5ec789c61b7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-14ea36cf9c887041", "level": "error", "message": {"text": "Dangling fetch: GET /api/search/semantic?${params} (src/app/search/semantic/page.tsx:144)"}, "properties": {"repobilityId": "26a44aa13ea7e28c", "scanner": "scanner-primary", "fingerprint": "14ea36cf9c887041", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2157c41406412890", "level": "error", "message": {"text": "Dangling fetch: POST /api/saved-searches (src/app/search/semantic/page.tsx:183)"}, "properties": {"repobilityId": "033c047ec40aad93", "scanner": "scanner-primary", "fingerprint": "2157c41406412890", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6b529bc82dbd74a2", "level": "error", "message": {"text": "Dangling fetch: GET /api/cases/${id} (src/app/case/[id]/page.tsx:93)"}, "properties": {"repobilityId": "876fa85596d848d2", "scanner": "scanner-primary", "fingerprint": "6b529bc82dbd74a2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4388b3f5ee5c51da", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/cases/${id} (src/app/case/[id]/page.tsx:122)"}, "properties": {"repobilityId": "79ffe9e2b8b6abe2", "scanner": "scanner-primary", "fingerprint": "4388b3f5ee5c51da", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4c6c14c840cf6a4f", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/cases/${id} (src/app/case/[id]/page.tsx:133)"}, "properties": {"repobilityId": "2b5375851ac6fd62", "scanner": "scanner-primary", "fingerprint": "4c6c14c840cf6a4f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-264513fad2cd166c", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/cases/${id} (src/app/case/[id]/page.tsx:145)"}, "properties": {"repobilityId": "63999b0bc0fe7dda", "scanner": "scanner-primary", "fingerprint": "264513fad2cd166c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c0e7651cf7a61c12", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/cases/${id} (src/app/case/[id]/page.tsx:155)"}, "properties": {"repobilityId": "a2e9aeba15384a9d", "scanner": "scanner-primary", "fingerprint": "c0e7651cf7a61c12", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f4e32dc5a126d1f3", "level": "error", "message": {"text": "Dangling fetch: POST /api/cases/${id}/refresh (src/app/case/[id]/page.tsx:162)"}, "properties": {"repobilityId": "e05598498fe850af", "scanner": "scanner-primary", "fingerprint": "f4e32dc5a126d1f3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cbaba19344011293", "level": "error", "message": {"text": "Dangling fetch: GET /api/cases/${id} (src/app/case/[id]/page.tsx:164)"}, "properties": {"repobilityId": "d7533b9312f798d7", "scanner": "scanner-primary", "fingerprint": "cbaba19344011293", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b008f304628fdc6e", "level": "error", "message": {"text": "Dangling fetch: GET /api/search/semantic?${params} (src/app/case/[id]/page.tsx:198)"}, "properties": {"repobilityId": "809135a4778ad101", "scanner": "scanner-primary", "fingerprint": "b008f304628fdc6e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9a22fb9881db4803", "level": "error", "message": {"text": "Dangling fetch: POST /api/cases/${id}/order-summaries (src/app/case/[id]/page.tsx:243)"}, "properties": {"repobilityId": "56257825d91a685a", "scanner": "scanner-primary", "fingerprint": "9a22fb9881db4803", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-82bd17b0c0ddaeae", "level": "error", "message": {"text": "Dangling fetch: POST /api/cases/${id}/summarize (src/app/case/[id]/page.tsx:267)"}, "properties": {"repobilityId": "e4a46cc5cc6b091b", "scanner": "scanner-primary", "fingerprint": "82bd17b0c0ddaeae", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b1cc01cf5b795a7d", "level": "error", "message": {"text": "Dangling fetch: GET /api/cases/${id} (src/app/case/[id]/chronology/page.tsx:102)"}, "properties": {"repobilityId": "f552cd1de667276e", "scanner": "scanner-primary", "fingerprint": "b1cc01cf5b795a7d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-30fb1469a5c225cb", "level": "error", "message": {"text": "Dangling fetch: GET /api/saved-searches (src/app/saved-searches/page.tsx:55)"}, "properties": {"repobilityId": "1cc63ba123024810", "scanner": "scanner-primary", "fingerprint": "30fb1469a5c225cb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0b4539494bb267b0", "level": "error", "message": {"text": "Dangling fetch: POST /api/saved-searches/${id}/run (src/app/saved-searches/page.tsx:96)"}, "properties": {"repobilityId": "fb867ea8e4d547cd", "scanner": "scanner-primary", "fingerprint": "0b4539494bb267b0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ca265debca3218b5", "level": "error", "message": {"text": "Dangling fetch: POST /api/saved-searches/${s.id}/run (src/app/saved-searches/page.tsx:119)"}, "properties": {"repobilityId": "ede8982e296b2aff", "scanner": "scanner-primary", "fingerprint": "ca265debca3218b5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3ee331323eedd2ef", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/saved-searches/${id} (src/app/saved-searches/page.tsx:139)"}, "properties": {"repobilityId": "13bc75c7b9c1ac78", "scanner": "scanner-primary", "fingerprint": "3ee331323eedd2ef", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7ab8ece0c764a6d8", "level": "error", "message": {"text": "Dangling fetch: GET /api/briefing (src/app/briefing/page.tsx:22)"}, "properties": {"repobilityId": "0b7b38e2532977da", "scanner": "scanner-primary", "fingerprint": "7ab8ece0c764a6d8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d0dd5ee5fe8f749e", "level": "error", "message": {"text": "Dangling fetch: GET https://hcservices.ecourts.gov.in${captchaMatch[0]} (src/lib/courts/ecourts-scraper.ts:895)"}, "properties": {"repobilityId": "09d5e841cf17dd4e", "scanner": "scanner-primary", "fingerprint": "d0dd5ee5fe8f749e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1a6d91f2236825bf", "level": "note", "message": {"text": "Unused endpoint: ANY /"}, "properties": {"repobilityId": "f0e50c42a875b0db", "scanner": "scanner-primary", "fingerprint": "1a6d91f2236825bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-119242d3375db533", "level": "note", "message": {"text": "Unused endpoint: ANY /api/dashboard/stats"}, "properties": {"repobilityId": "a43b74e062302305", "scanner": "scanner-primary", "fingerprint": "119242d3375db533", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-37f37b64b92fbb43", "level": "note", "message": {"text": "Unused endpoint: ANY /api/cases"}, "properties": {"repobilityId": "85c9a609f8fbed8a", "scanner": "scanner-primary", "fingerprint": "37f37b64b92fbb43", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f47e350bb696dd75", "level": "note", "message": {"text": "Unused endpoint: ANY /api/cases/<int:case_id>"}, "properties": {"repobilityId": "00753e0f676c87a6", "scanner": "scanner-primary", "fingerprint": "f47e350bb696dd75", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b6854decde40816b", "level": "note", "message": {"text": "Unused endpoint: ANY /hearings"}, "properties": {"repobilityId": "cd01a127cc9be77b", "scanner": "scanner-primary", "fingerprint": "b6854decde40816b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4943cdf42a897413", "level": "note", "message": {"text": "Unused endpoint: ANY /api/hearings"}, "properties": {"repobilityId": "a69a81898d7f442e", "scanner": "scanner-primary", "fingerprint": "4943cdf42a897413", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-33b70230641db54a", "level": "note", "message": {"text": "Unused endpoint: ANY /api/hearings/<int:hearing_id>"}, "properties": {"repobilityId": "565e08e3259bf575", "scanner": "scanner-primary", "fingerprint": "33b70230641db54a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-648473c031682470", "level": "note", "message": {"text": "Unused endpoint: ANY /api/upcoming-hearings"}, "properties": {"repobilityId": "21c6c5e4de30a269", "scanner": "scanner-primary", "fingerprint": "648473c031682470", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}