{"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-ee3c938e3506d6ce", "name": "`truncate` class without `title=` for hover reveal \u2014 components/Stage3HeroFlow.tsx:440", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/Stage3HeroFlow.tsx:440"}, "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-b4986c996c6ea779", "name": "`truncate` class without `title=` for hover reveal \u2014 app/HomeV2.tsx:97", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/HomeV2.tsx:97"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bb3f4e91265620d4", "name": "`truncate` class without `title=` for hover reveal \u2014 app/settings/page.tsx:279", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/settings/page.tsx:279"}, "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-84380ac94a198d44", "name": "`truncate` class without `title=` for hover reveal \u2014 app/stage3/page.tsx:620", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/stage3/page.tsx:620"}, "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-cb6b1e5f2fc74f21", "name": "`truncate` class without `title=` for hover reveal \u2014 app/runs/[id]/page.tsx:192", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/runs/[id]/page.tsx:192"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4e29c61c2052adb6", "name": "`truncate` class without `title=` for hover reveal \u2014 public/pipeline-ui/screens.jsx:306", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 public/pipeline-ui/screens.jsx:306"}, "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-0d7c47bd24a29c93", "name": "`truncate` class without `title=` for hover reveal \u2014 public/pipeline-ui/rundetail.jsx:281", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 public/pipeline-ui/rundetail.jsx:281"}, "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-5ce594090b5c4c54", "name": "`truncate` class without `title=` for hover reveal \u2014 public/pipeline-ui/stage3.jsx:151", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 public/pipeline-ui/stage3.jsx:151"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-59174ce8d54cf836", "name": "`truncate` class without `title=` for hover reveal \u2014 public/pipeline-ui/app.jsx:163", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 public/pipeline-ui/app.jsx:163"}, "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-432b4b2f0c4b20be", "name": "`truncate` class without `title=` for hover reveal \u2014 public/pipeline-ui/v2/home2.jsx:67", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 public/pipeline-ui/v2/home2.jsx:67"}, "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-dac60b9b3a5d58cd", "name": "`truncate` class without `title=` for hover reveal \u2014 public/pipeline-ui/v2/run2.jsx:56", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 public/pipeline-ui/v2/run2.jsx:56"}, "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-c476fcc5bc72aece", "name": "Dockerfile runs as root: scripts/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: scripts/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-71751c857d4d9a6a", "name": "Docker base image is tag-pinned but not digest-pinned: mcr.microsoft.com/playwright/python:v1.49.0-jammy", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: mcr.microsoft.com/playwright/python:v1.49.0-jammy"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-16532113c0fd7586", "name": "Insecure pattern 'cors_wildcard' in scripts/scraper_service.py:25", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in scripts/scraper_service.py:25"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-76a861f3af9a0ba7", "name": "Very large file: components/Stage3HeroFlow.tsx (1253 lines)", "shortDescription": {"text": "Very large file: components/Stage3HeroFlow.tsx (1253 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bb67ab979f916a69", "name": "Very large file: app/stage3/page.tsx (1991 lines)", "shortDescription": {"text": "Very large file: app/stage3/page.tsx (1991 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 104 source file(s) (ratio 0.00). 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 46 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 51 placeholder/mock markers across 17 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, tests. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9777672d4bf1a7d6", "name": "Commented-code block (5 lines) in components/Stage3HeroFlow.tsx:617", "shortDescription": {"text": "Commented-code block (5 lines) in components/Stage3HeroFlow.tsx:617"}, "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-97d8a796d0a86cf9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/Stage3HeroFlow.tsx:340", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/Stage3HeroFlow.tsx:340"}, "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-070aeb4767868dd4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/settings/page.tsx:46", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/settings/page.tsx:46"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-240675f3799258fd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/stage3/page.tsx:1369", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/stage3/page.tsx:1369"}, "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-f5c4642087c59a43", "name": "Commented-code block (5 lines) in app/api/stage3/prompts/route.ts:31", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/stage3/prompts/route.ts:31"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ae4f1b0e1fbd365e", "name": "Legacy-named symbol `stage2_copy` in app/api/runs/[id]/route.ts:50", "shortDescription": {"text": "Legacy-named symbol `stage2_copy` in app/api/runs/[id]/route.ts:50"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-67d66d2b851fa698", "name": "Commented-code block (5 lines) in app/api/runs/[id]/route.ts:118", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/runs/[id]/route.ts:118"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5c5e3e604241ead6", "name": "Legacy-named symbol `stage2_copy` in app/api/regenerate/[stage]/route.ts:13", "shortDescription": {"text": "Legacy-named symbol `stage2_copy` in app/api/regenerate/[stage]/route.ts:13"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9997f11740426c20", "name": "Commented-code block (5 lines) in app/preview/page.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in app/preview/page.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-545df1b4a00f1b4f", "name": "Legacy-named symbol `stage2_copy` in app/runs/[id]/page.tsx:628", "shortDescription": {"text": "Legacy-named symbol `stage2_copy` in app/runs/[id]/page.tsx:628"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-306513d3f6698f36", "name": "Commented-code block (6 lines) in app/history/[id]/page.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in app/history/[id]/page.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e1e05c4e456ec57a", "name": "Commented-code block (5 lines) in lib/ssrf.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in lib/ssrf.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-431c866f8706ec98", "name": "Commented-code block (6 lines) in lib/higgsfield.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in lib/higgsfield.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6e6e0677da0002dc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/higgsfield.ts:76", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/higgsfield.ts:76"}, "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-dfbc11e6dfdb4e16", "name": "Commented-code block (5 lines) in lib/higgsfield-mcp.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in lib/higgsfield-mcp.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dab178cfee2baa4b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/higgsfield-mcp.ts:52", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/higgsfield-mcp.ts:52"}, "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-d47e98d59ff40721", "name": "Commented-code block (6 lines) in lib/pipeline-runner.ts:29", "shortDescription": {"text": "Commented-code block (6 lines) in lib/pipeline-runner.ts:29"}, "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-9e632f440222b026", "name": "Commented-code block (6 lines) in lib/models.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in lib/models.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-49a6327840215969", "name": "Legacy-named symbol `migrateLegacy` in lib/prompts-store.ts:40", "shortDescription": {"text": "Legacy-named symbol `migrateLegacy` in lib/prompts-store.ts:40"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-da75247095c5b00c", "name": "Commented-code block (6 lines) in lib/stage3/higgsfield.ts:5", "shortDescription": {"text": "Commented-code block (6 lines) in lib/stage3/higgsfield.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3faa2cbabac3e12b", "name": "Commented-code block (5 lines) in lib/research/runner.ts:119", "shortDescription": {"text": "Commented-code block (5 lines) in lib/research/runner.ts:119"}, "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-e32179dd4a8766ba", "name": "Commented-code block (7 lines) in public/pipeline-ui/tweaks-panel.jsx:16", "shortDescription": {"text": "Commented-code block (7 lines) in public/pipeline-ui/tweaks-panel.jsx:16"}, "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-e048b8c6f904a9e2", "name": "FastAPI POST `scrape` without auth dependency \u2014 scripts/scraper_service.py:46", "shortDescription": {"text": "FastAPI POST `scrape` without auth dependency \u2014 scripts/scraper_service.py:46"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e0769c75ce515110", "name": "Dangling fetch: PATCH /api/runs/${runId} (components/Stage3ReferenceImages.tsx:20)", "shortDescription": {"text": "Dangling fetch: PATCH /api/runs/${runId} (components/Stage3ReferenceImages.tsx:20)"}, "fullDescription": {"text": "`components/Stage3ReferenceImages.tsx:20` calls `PATCH /api/runs/${runId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<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-156ab58e6bbc3446", "name": "Dangling fetch: POST /api/upload-source-images (components/Stage3ReferenceImages.tsx:38)", "shortDescription": {"text": "Dangling fetch: POST /api/upload-source-images (components/Stage3ReferenceImages.tsx:38)"}, "fullDescription": {"text": "`components/Stage3ReferenceImages.tsx:38` calls `POST /api/upload-source-images` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/upload-source-images`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9151aa3d4e222d24", "name": "Dangling fetch: PATCH /api/runs/${runId} (components/FeedbackButtons.tsx:44)", "shortDescription": {"text": "Dangling fetch: PATCH /api/runs/${runId} (components/FeedbackButtons.tsx:44)"}, "fullDescription": {"text": "`components/FeedbackButtons.tsx:44` calls `PATCH /api/runs/${runId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<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-5e5a9fbb7b51e831", "name": "Dangling fetch: GET /api/runs/${runId} (components/RunProductCode.tsx:16)", "shortDescription": {"text": "Dangling fetch: GET /api/runs/${runId} (components/RunProductCode.tsx:16)"}, "fullDescription": {"text": "`components/RunProductCode.tsx:16` calls `GET /api/runs/${runId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<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-69f0ae8d13599d3d", "name": "Dangling fetch: PATCH /api/runs/${runId} (components/RunProductCode.tsx:30)", "shortDescription": {"text": "Dangling fetch: PATCH /api/runs/${runId} (components/RunProductCode.tsx:30)"}, "fullDescription": {"text": "`components/RunProductCode.tsx:30` calls `PATCH /api/runs/${runId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<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-d31a8b472ee8fd98", "name": "Dangling fetch: GET /api/feedback/recent?stage=${stage} (components/FeedbackAppliedChip.tsx:31)", "shortDescription": {"text": "Dangling fetch: GET /api/feedback/recent?stage=${stage} (components/FeedbackAppliedChip.tsx:31)"}, "fullDescription": {"text": "`components/FeedbackAppliedChip.tsx:31` calls `GET /api/feedback/recent?stage=${stage}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/feedback/recent`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b2925a424795e381", "name": "Dangling fetch: GET /api/runs/counts (components/TopBar.tsx:36)", "shortDescription": {"text": "Dangling fetch: GET /api/runs/counts (components/TopBar.tsx:36)"}, "fullDescription": {"text": "`components/TopBar.tsx:36` calls `GET /api/runs/counts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/counts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f62a32492a3b2645", "name": "Dangling fetch: GET /api/settings/models (components/ModelSettings.tsx:38)", "shortDescription": {"text": "Dangling fetch: GET /api/settings/models (components/ModelSettings.tsx:38)"}, "fullDescription": {"text": "`components/ModelSettings.tsx:38` calls `GET /api/settings/models` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings/models`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1936bac6c7e7533a", "name": "Dangling fetch: POST /api/settings/models (components/ModelSettings.tsx:51)", "shortDescription": {"text": "Dangling fetch: POST /api/settings/models (components/ModelSettings.tsx:51)"}, "fullDescription": {"text": "`components/ModelSettings.tsx:51` calls `POST /api/settings/models` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings/models`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aef68d9888843916", "name": "Dangling fetch: PATCH /api/runs/${runId} (components/EditableOutput.tsx:126)", "shortDescription": {"text": "Dangling fetch: PATCH /api/runs/${runId} (components/EditableOutput.tsx:126)"}, "fullDescription": {"text": "`components/EditableOutput.tsx:126` calls `PATCH /api/runs/${runId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<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-ed6e8ffa44167b45", "name": "Dangling fetch: POST /api/stage3/edit-prompt (components/Stage3HeroFlow.tsx:113)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/edit-prompt (components/Stage3HeroFlow.tsx:113)"}, "fullDescription": {"text": "`components/Stage3HeroFlow.tsx:113` calls `POST /api/stage3/edit-prompt` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/edit-prompt`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-be8c56b61c2b0c8a", "name": "Dangling fetch: GET /api/runs/${runId} (components/Stage3HeroFlow.tsx:139)", "shortDescription": {"text": "Dangling fetch: GET /api/runs/${runId} (components/Stage3HeroFlow.tsx:139)"}, "fullDescription": {"text": "`components/Stage3HeroFlow.tsx:139` calls `GET /api/runs/${runId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<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-d94a5a6b44d018d8", "name": "Dangling fetch: PATCH /api/runs/${runId} (components/Stage3HeroFlow.tsx:324)", "shortDescription": {"text": "Dangling fetch: PATCH /api/runs/${runId} (components/Stage3HeroFlow.tsx:324)"}, "fullDescription": {"text": "`components/Stage3HeroFlow.tsx:324` calls `PATCH /api/runs/${runId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<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-1a4ae5d7e8d51fbc", "name": "Dangling fetch: POST /api/stage3/generate (components/Stage3HeroFlow.tsx:340)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/generate (components/Stage3HeroFlow.tsx:340)"}, "fullDescription": {"text": "`components/Stage3HeroFlow.tsx:340` calls `POST /api/stage3/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/generate`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8a68f1a8ae8e5b19", "name": "Dangling fetch: POST /api/stage3/audit (components/Stage3HeroFlow.tsx:349)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/audit (components/Stage3HeroFlow.tsx:349)"}, "fullDescription": {"text": "`components/Stage3HeroFlow.tsx:349` calls `POST /api/stage3/audit` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/audit`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-57c505524ff6dc95", "name": "Dangling fetch: PATCH /api/runs/${runId} (components/Stage3HeroFlow.tsx:373)", "shortDescription": {"text": "Dangling fetch: PATCH /api/runs/${runId} (components/Stage3HeroFlow.tsx:373)"}, "fullDescription": {"text": "`components/Stage3HeroFlow.tsx:373` calls `PATCH /api/runs/${runId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<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-8167c4065a8d7697", "name": "Dangling fetch: PATCH /api/runs/${runId} (components/Stage3HeroFlow.tsx:397)", "shortDescription": {"text": "Dangling fetch: PATCH /api/runs/${runId} (components/Stage3HeroFlow.tsx:397)"}, "fullDescription": {"text": "`components/Stage3HeroFlow.tsx:397` calls `PATCH /api/runs/${runId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<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-ed423e5e20cb2d1e", "name": "Dangling fetch: POST /api/runs/${runId}/restart-stage (components/Stage3HeroFlow.tsx:523)", "shortDescription": {"text": "Dangling fetch: POST /api/runs/${runId}/restart-stage (components/Stage3HeroFlow.tsx:523)"}, "fullDescription": {"text": "`components/Stage3HeroFlow.tsx:523` calls `POST /api/runs/${runId}/restart-stage` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<p>/restart-stage`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-933a7f241f066a22", "name": "Dangling fetch: POST /api/stage3/placement (components/Stage3HeroFlow.tsx:596)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/placement (components/Stage3HeroFlow.tsx:596)"}, "fullDescription": {"text": "`components/Stage3HeroFlow.tsx:596` calls `POST /api/stage3/placement` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/placement`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1b91029c1fdcac1d", "name": "Dangling fetch: PATCH /api/runs/${runId} (components/Stage3HeroFlow.tsx:628)", "shortDescription": {"text": "Dangling fetch: PATCH /api/runs/${runId} (components/Stage3HeroFlow.tsx:628)"}, "fullDescription": {"text": "`components/Stage3HeroFlow.tsx:628` calls `PATCH /api/runs/${runId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<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-2ec107be1de16c14", "name": "Dangling fetch: POST /api/stage3/generate (components/Stage3HeroFlow.tsx:671)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/generate (components/Stage3HeroFlow.tsx:671)"}, "fullDescription": {"text": "`components/Stage3HeroFlow.tsx:671` calls `POST /api/stage3/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/generate`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f328bae2861e62ec", "name": "Dangling fetch: POST /api/stage3/audit (components/Stage3HeroFlow.tsx:680)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/audit (components/Stage3HeroFlow.tsx:680)"}, "fullDescription": {"text": "`components/Stage3HeroFlow.tsx:680` calls `POST /api/stage3/audit` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/audit`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4cc29dda46e45c31", "name": "Dangling fetch: POST /api/stage3/edit-prompt (components/Stage3HeroFlow.tsx:1020)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/edit-prompt (components/Stage3HeroFlow.tsx:1020)"}, "fullDescription": {"text": "`components/Stage3HeroFlow.tsx:1020` calls `POST /api/stage3/edit-prompt` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/edit-prompt`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fa75bc58288ff3d8", "name": "Dangling fetch: POST /api/stage3/edit-prompt (components/Stage3HeroFlow.tsx:1124)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/edit-prompt (components/Stage3HeroFlow.tsx:1124)"}, "fullDescription": {"text": "`components/Stage3HeroFlow.tsx:1124` calls `POST /api/stage3/edit-prompt` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/edit-prompt`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b9cb910c8331e306", "name": "Dangling fetch: POST /api/regenerate/${stage} (components/AIRegenerate.tsx:55)", "shortDescription": {"text": "Dangling fetch: POST /api/regenerate/${stage} (components/AIRegenerate.tsx:55)"}, "fullDescription": {"text": "`components/AIRegenerate.tsx:55` calls `POST /api/regenerate/${stage}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/regenerate/<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-d4118e3bd640059e", "name": "Dangling fetch: DELETE /api/runs/${r.id} (app/HomeV2.tsx:42)", "shortDescription": {"text": "Dangling fetch: DELETE /api/runs/${r.id} (app/HomeV2.tsx:42)"}, "fullDescription": {"text": "`app/HomeV2.tsx:42` calls `DELETE /api/runs/${r.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<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-c6e5864cec209640", "name": "Dangling fetch: GET /api/prompts (app/settings/page.tsx:46)", "shortDescription": {"text": "Dangling fetch: GET /api/prompts (app/settings/page.tsx:46)"}, "fullDescription": {"text": "`app/settings/page.tsx:46` calls `GET /api/prompts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/prompts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aaba36548c6ab869", "name": "Dangling fetch: PUT /api/prompts (app/settings/page.tsx:84)", "shortDescription": {"text": "Dangling fetch: PUT /api/prompts (app/settings/page.tsx:84)"}, "fullDescription": {"text": "`app/settings/page.tsx:84` calls `PUT /api/prompts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/prompts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-20b74d7b43ad241b", "name": "Dangling fetch: DELETE /api/prompts (app/settings/page.tsx:103)", "shortDescription": {"text": "Dangling fetch: DELETE /api/prompts (app/settings/page.tsx:103)"}, "fullDescription": {"text": "`app/settings/page.tsx:103` calls `DELETE /api/prompts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/prompts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6b032d5a9dbf6eac", "name": "Dangling fetch: POST /api/prompts/restore (app/settings/page.tsx:119)", "shortDescription": {"text": "Dangling fetch: POST /api/prompts/restore (app/settings/page.tsx:119)"}, "fullDescription": {"text": "`app/settings/page.tsx:119` calls `POST /api/prompts/restore` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/prompts/restore`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6f6cd9cd2d0a1925", "name": "Dangling fetch: POST /api/stage3/feedback (app/stage3/page.tsx:180)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/feedback (app/stage3/page.tsx:180)"}, "fullDescription": {"text": "`app/stage3/page.tsx:180` calls `POST /api/stage3/feedback` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/feedback`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8116dbf0cf44f6b8", "name": "Dangling fetch: POST /api/stage3/edit-prompt (app/stage3/page.tsx:482)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/edit-prompt (app/stage3/page.tsx:482)"}, "fullDescription": {"text": "`app/stage3/page.tsx:482` calls `POST /api/stage3/edit-prompt` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/edit-prompt`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-76498fb2932ed52d", "name": "Dangling fetch: POST /api/stage3/edit-prompt (app/stage3/page.tsx:698)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/edit-prompt (app/stage3/page.tsx:698)"}, "fullDescription": {"text": "`app/stage3/page.tsx:698` calls `POST /api/stage3/edit-prompt` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/edit-prompt`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e30e9e585865a280", "name": "Dangling fetch: POST /api/stage3/edit-prompt (app/stage3/page.tsx:1192)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/edit-prompt (app/stage3/page.tsx:1192)"}, "fullDescription": {"text": "`app/stage3/page.tsx:1192` calls `POST /api/stage3/edit-prompt` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/edit-prompt`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d52aee1fea9889e0", "name": "Dangling fetch: GET /api/runs/${runId} (app/stage3/page.tsx:1369)", "shortDescription": {"text": "Dangling fetch: GET /api/runs/${runId} (app/stage3/page.tsx:1369)"}, "fullDescription": {"text": "`app/stage3/page.tsx:1369` calls `GET /api/runs/${runId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<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-a1a72994bbbab85e", "name": "Dangling fetch: POST /api/stage3/prompts (app/stage3/page.tsx:1439)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/prompts (app/stage3/page.tsx:1439)"}, "fullDescription": {"text": "`app/stage3/page.tsx:1439` calls `POST /api/stage3/prompts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/prompts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fee4ff4f240c0903", "name": "Dangling fetch: POST /api/stage3/feedback (app/stage3/page.tsx:1506)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/feedback (app/stage3/page.tsx:1506)"}, "fullDescription": {"text": "`app/stage3/page.tsx:1506` calls `POST /api/stage3/feedback` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/feedback`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5515874519d6751f", "name": "Dangling fetch: POST /api/stage3/generate (app/stage3/page.tsx:1528)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/generate (app/stage3/page.tsx:1528)"}, "fullDescription": {"text": "`app/stage3/page.tsx:1528` calls `POST /api/stage3/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/generate`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9b4e776cc5c7bc0f", "name": "Dangling fetch: POST /api/stage3/audit (app/stage3/page.tsx:1574)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/audit (app/stage3/page.tsx:1574)"}, "fullDescription": {"text": "`app/stage3/page.tsx:1574` calls `POST /api/stage3/audit` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/audit`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ed9dcf1e53c1a137", "name": "Dangling fetch: POST /api/stage3/feedback (app/stage3/page.tsx:1590)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/feedback (app/stage3/page.tsx:1590)"}, "fullDescription": {"text": "`app/stage3/page.tsx:1590` calls `POST /api/stage3/feedback` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/feedback`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-66c54ae89a388b1a", "name": "Dangling fetch: PATCH /api/runs/${run.id} (app/stage3/page.tsx:1607)", "shortDescription": {"text": "Dangling fetch: PATCH /api/runs/${run.id} (app/stage3/page.tsx:1607)"}, "fullDescription": {"text": "`app/stage3/page.tsx:1607` calls `PATCH /api/runs/${run.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<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-0ced84bf9e81116e", "name": "Dangling fetch: POST /api/stage3/generate (app/stage3/page.tsx:1658)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/generate (app/stage3/page.tsx:1658)"}, "fullDescription": {"text": "`app/stage3/page.tsx:1658` calls `POST /api/stage3/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/generate`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6b02afc83b200c04", "name": "Dangling fetch: POST /api/stage3/audit (app/stage3/page.tsx:1669)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/audit (app/stage3/page.tsx:1669)"}, "fullDescription": {"text": "`app/stage3/page.tsx:1669` calls `POST /api/stage3/audit` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/audit`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-62fd7b83fe461619", "name": "Dangling fetch: POST /api/stage3/feedback (app/stage3/page.tsx:1679)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/feedback (app/stage3/page.tsx:1679)"}, "fullDescription": {"text": "`app/stage3/page.tsx:1679` calls `POST /api/stage3/feedback` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/feedback`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d99325bedaef40e6", "name": "Dangling fetch: POST /api/stage3/edit-prompt (app/stage3/page.tsx:1741)", "shortDescription": {"text": "Dangling fetch: POST /api/stage3/edit-prompt (app/stage3/page.tsx:1741)"}, "fullDescription": {"text": "`app/stage3/page.tsx:1741` calls `POST /api/stage3/edit-prompt` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stage3/edit-prompt`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9b7e73792699e224", "name": "Dangling fetch: PATCH /api/runs/${run.id} (app/stage3/page.tsx:1807)", "shortDescription": {"text": "Dangling fetch: PATCH /api/runs/${run.id} (app/stage3/page.tsx:1807)"}, "fullDescription": {"text": "`app/stage3/page.tsx:1807` calls `PATCH /api/runs/${run.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<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-d69f12af21cee807", "name": "Dangling fetch: PATCH /api/runs/${run.id} (app/stage3/page.tsx:1828)", "shortDescription": {"text": "Dangling fetch: PATCH /api/runs/${run.id} (app/stage3/page.tsx:1828)"}, "fullDescription": {"text": "`app/stage3/page.tsx:1828` calls `PATCH /api/runs/${run.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<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-e79ed4f0a68240d4", "name": "Dangling fetch: POST https://api.firecrawl.dev/v1/scrape (app/api/scrape/route.ts:104)", "shortDescription": {"text": "Dangling fetch: POST https://api.firecrawl.dev/v1/scrape (app/api/scrape/route.ts:104)"}, "fullDescription": {"text": "`app/api/scrape/route.ts:104` calls `POST https://api.firecrawl.dev/v1/scrape` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/api.firecrawl.dev/v1/scrape`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-551dbde131f5c82f", "name": "Dangling fetch: POST /api/upload-source-images (app/new/page.tsx:66)", "shortDescription": {"text": "Dangling fetch: POST /api/upload-source-images (app/new/page.tsx:66)"}, "fullDescription": {"text": "`app/new/page.tsx:66` calls `POST /api/upload-source-images` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/upload-source-images`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-33c96cf3d03c90ed", "name": "Dangling fetch: POST /api/runs/start (app/new/page.tsx:90)", "shortDescription": {"text": "Dangling fetch: POST /api/runs/start (app/new/page.tsx:90)"}, "fullDescription": {"text": "`app/new/page.tsx:90` calls `POST /api/runs/start` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/start`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9cab83f6c4111472", "name": "Dangling fetch: POST /api/runs/${runId}/cancel (app/runs/[id]/page.tsx:285)", "shortDescription": {"text": "Dangling fetch: POST /api/runs/${runId}/cancel (app/runs/[id]/page.tsx:285)"}, "fullDescription": {"text": "`app/runs/[id]/page.tsx:285` calls `POST /api/runs/${runId}/cancel` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<p>/cancel`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-07937d0a236bb2e2", "name": "Dangling fetch: POST /api/runs/${runId}/resume (app/runs/[id]/page.tsx:293)", "shortDescription": {"text": "Dangling fetch: POST /api/runs/${runId}/resume (app/runs/[id]/page.tsx:293)"}, "fullDescription": {"text": "`app/runs/[id]/page.tsx:293` calls `POST /api/runs/${runId}/resume` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<p>/resume`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b773a4f7ba574ed3", "name": "Dangling fetch: POST /api/runs/${runId}/start-stage2 (app/runs/[id]/page.tsx:313)", "shortDescription": {"text": "Dangling fetch: POST /api/runs/${runId}/start-stage2 (app/runs/[id]/page.tsx:313)"}, "fullDescription": {"text": "`app/runs/[id]/page.tsx:313` calls `POST /api/runs/${runId}/start-stage2` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<p>/start-stage2`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d690b1679617880b", "name": "Dangling fetch: POST /api/runs/${runId}/restart-stage (app/runs/[id]/page.tsx:329)", "shortDescription": {"text": "Dangling fetch: POST /api/runs/${runId}/restart-stage (app/runs/[id]/page.tsx:329)"}, "fullDescription": {"text": "`app/runs/[id]/page.tsx:329` calls `POST /api/runs/${runId}/restart-stage` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<p>/restart-stage`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b85ac0cc0c57bfad", "name": "Dangling fetch: PATCH /api/runs/${runId} (app/runs/[id]/page.tsx:348)", "shortDescription": {"text": "Dangling fetch: PATCH /api/runs/${runId} (app/runs/[id]/page.tsx:348)"}, "fullDescription": {"text": "`app/runs/[id]/page.tsx:348` calls `PATCH /api/runs/${runId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<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-0ece2fe5bc37d2bc", "name": "Dangling fetch: GET /api/runs/${runId} (app/runs/[id]/page.tsx:387)", "shortDescription": {"text": "Dangling fetch: GET /api/runs/${runId} (app/runs/[id]/page.tsx:387)"}, "fullDescription": {"text": "`app/runs/[id]/page.tsx:387` calls `GET /api/runs/${runId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<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-add1c6ad39e888ea", "name": "Dangling fetch: GET /api/runs/${runId}/status (hooks/useRunPolling.ts:70)", "shortDescription": {"text": "Dangling fetch: GET /api/runs/${runId}/status (hooks/useRunPolling.ts:70)"}, "fullDescription": {"text": "`hooks/useRunPolling.ts:70` calls `GET /api/runs/${runId}/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<p>/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d2e04646e9cae6ea", "name": "Dangling fetch: GET /api/runs/${runId}/status (hooks/useRunPolling.ts:106)", "shortDescription": {"text": "Dangling fetch: GET /api/runs/${runId}/status (hooks/useRunPolling.ts:106)"}, "fullDescription": {"text": "`hooks/useRunPolling.ts:106` calls `GET /api/runs/${runId}/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/runs/<p>/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`scripts/scraper_service.py` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ab8b3c68308c92da", "name": "Unused endpoint: POST /scrape", "shortDescription": {"text": "Unused endpoint: POST /scrape"}, "fullDescription": {"text": "`scripts/scraper_service.py` declares `POST /scrape` 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/18110"}, "properties": {"repository": "ricardsraksa/pipeline-app", "repoUrl": "https://github.com/ricardsraksa/pipeline-app", "branch": "main"}, "results": [{"ruleId": "scanner-ee3c938e3506d6ce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/Stage3HeroFlow.tsx:440"}, "properties": {"repobilityId": "8df5c507dcd2ae69", "scanner": "scanner-primary", "fingerprint": "ee3c938e3506d6ce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b4986c996c6ea779", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/HomeV2.tsx:97"}, "properties": {"repobilityId": "afe2f97f2494ebe9", "scanner": "scanner-primary", "fingerprint": "b4986c996c6ea779", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bb3f4e91265620d4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/settings/page.tsx:279"}, "properties": {"repobilityId": "a007395f5fe452fc", "scanner": "scanner-primary", "fingerprint": "bb3f4e91265620d4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84380ac94a198d44", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/stage3/page.tsx:620"}, "properties": {"repobilityId": "6c3587ea8bf1e298", "scanner": "scanner-primary", "fingerprint": "84380ac94a198d44", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cb6b1e5f2fc74f21", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/runs/[id]/page.tsx:192"}, "properties": {"repobilityId": "7bad0700c130a27c", "scanner": "scanner-primary", "fingerprint": "cb6b1e5f2fc74f21", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4e29c61c2052adb6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 public/pipeline-ui/screens.jsx:306"}, "properties": {"repobilityId": "127360b92cfb3389", "scanner": "scanner-primary", "fingerprint": "4e29c61c2052adb6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0d7c47bd24a29c93", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 public/pipeline-ui/rundetail.jsx:281"}, "properties": {"repobilityId": "a59074887f940eb7", "scanner": "scanner-primary", "fingerprint": "0d7c47bd24a29c93", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5ce594090b5c4c54", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 public/pipeline-ui/stage3.jsx:151"}, "properties": {"repobilityId": "40d50717501844a1", "scanner": "scanner-primary", "fingerprint": "5ce594090b5c4c54", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-59174ce8d54cf836", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 public/pipeline-ui/app.jsx:163"}, "properties": {"repobilityId": "399e3828241dcd32", "scanner": "scanner-primary", "fingerprint": "59174ce8d54cf836", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-432b4b2f0c4b20be", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 public/pipeline-ui/v2/home2.jsx:67"}, "properties": {"repobilityId": "6fb94a5c35091749", "scanner": "scanner-primary", "fingerprint": "432b4b2f0c4b20be", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dac60b9b3a5d58cd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 public/pipeline-ui/v2/run2.jsx:56"}, "properties": {"repobilityId": "5e144e3c54a7dc75", "scanner": "scanner-primary", "fingerprint": "dac60b9b3a5d58cd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c476fcc5bc72aece", "level": "warning", "message": {"text": "Dockerfile runs as root: scripts/Dockerfile"}, "properties": {"repobilityId": "7ec88485c9eb8565", "scanner": "scanner-primary", "fingerprint": "c476fcc5bc72aece", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-71751c857d4d9a6a", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: mcr.microsoft.com/playwright/python:v1.49.0-jammy"}, "properties": {"repobilityId": "f395f582aa051ddc", "scanner": "scanner-primary", "fingerprint": "71751c857d4d9a6a", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/Dockerfile"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-16532113c0fd7586", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in scripts/scraper_service.py:25"}, "properties": {"repobilityId": "35a3e2b2fa14ddda", "scanner": "scanner-primary", "fingerprint": "16532113c0fd7586", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/scraper_service.py"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-76a861f3af9a0ba7", "level": "note", "message": {"text": "Very large file: components/Stage3HeroFlow.tsx (1253 lines)"}, "properties": {"repobilityId": "19862d25e14e8572", "scanner": "scanner-primary", "fingerprint": "76a861f3af9a0ba7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bb67ab979f916a69", "level": "note", "message": {"text": "Very large file: app/stage3/page.tsx (1991 lines)"}, "properties": {"repobilityId": "32b8111d48fa03cc", "scanner": "scanner-primary", "fingerprint": "bb67ab979f916a69", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "43534a4f0b17ff2d", "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": "ec149259b331bd7b", "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": "f20239c770a7ced8", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "a21313654e917fc7", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "5e129105260c37f1", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "fa12eeaf60019e62", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "f694cb7900a3d433", "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": "2018477b232de4a2", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-9777672d4bf1a7d6", "level": "none", "message": {"text": "Commented-code block (5 lines) in components/Stage3HeroFlow.tsx:617"}, "properties": {"repobilityId": "e6096c38ffd92044", "scanner": "scanner-primary", "fingerprint": "9777672d4bf1a7d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-97d8a796d0a86cf9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/Stage3HeroFlow.tsx:340"}, "properties": {"repobilityId": "accadf2085090ad3", "scanner": "scanner-primary", "fingerprint": "97d8a796d0a86cf9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-070aeb4767868dd4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/settings/page.tsx:46"}, "properties": {"repobilityId": "d02f2275bfba72bb", "scanner": "scanner-primary", "fingerprint": "070aeb4767868dd4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-240675f3799258fd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/stage3/page.tsx:1369"}, "properties": {"repobilityId": "a91f2f14283b16e5", "scanner": "scanner-primary", "fingerprint": "240675f3799258fd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f5c4642087c59a43", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/stage3/prompts/route.ts:31"}, "properties": {"repobilityId": "a0623fcf45b699bb", "scanner": "scanner-primary", "fingerprint": "f5c4642087c59a43", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ae4f1b0e1fbd365e", "level": "note", "message": {"text": "Legacy-named symbol `stage2_copy` in app/api/runs/[id]/route.ts:50"}, "properties": {"repobilityId": "bde9fb341c4b536a", "scanner": "scanner-primary", "fingerprint": "ae4f1b0e1fbd365e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-67d66d2b851fa698", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/runs/[id]/route.ts:118"}, "properties": {"repobilityId": "5bcdf4f7aee3dcce", "scanner": "scanner-primary", "fingerprint": "67d66d2b851fa698", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5c5e3e604241ead6", "level": "note", "message": {"text": "Legacy-named symbol `stage2_copy` in app/api/regenerate/[stage]/route.ts:13"}, "properties": {"repobilityId": "bd09d89dabced6f3", "scanner": "scanner-primary", "fingerprint": "5c5e3e604241ead6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9997f11740426c20", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/preview/page.tsx:3"}, "properties": {"repobilityId": "78c3992962be03ac", "scanner": "scanner-primary", "fingerprint": "9997f11740426c20", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-545df1b4a00f1b4f", "level": "note", "message": {"text": "Legacy-named symbol `stage2_copy` in app/runs/[id]/page.tsx:628"}, "properties": {"repobilityId": "a4be325a60f21e95", "scanner": "scanner-primary", "fingerprint": "545df1b4a00f1b4f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-306513d3f6698f36", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/history/[id]/page.tsx:3"}, "properties": {"repobilityId": "16b284e993cb5150", "scanner": "scanner-primary", "fingerprint": "306513d3f6698f36", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e1e05c4e456ec57a", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/ssrf.ts:1"}, "properties": {"repobilityId": "5cbba3cf78ce0fb1", "scanner": "scanner-primary", "fingerprint": "e1e05c4e456ec57a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-431c866f8706ec98", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/higgsfield.ts:3"}, "properties": {"repobilityId": "f02635361e06579b", "scanner": "scanner-primary", "fingerprint": "431c866f8706ec98", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6e6e0677da0002dc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/higgsfield.ts:76"}, "properties": {"repobilityId": "5661f9a4baaa1dff", "scanner": "scanner-primary", "fingerprint": "6e6e0677da0002dc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dfbc11e6dfdb4e16", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/higgsfield-mcp.ts:8"}, "properties": {"repobilityId": "5946957ebff7043b", "scanner": "scanner-primary", "fingerprint": "dfbc11e6dfdb4e16", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dab178cfee2baa4b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/higgsfield-mcp.ts:52"}, "properties": {"repobilityId": "460d60278274f186", "scanner": "scanner-primary", "fingerprint": "dab178cfee2baa4b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d47e98d59ff40721", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/pipeline-runner.ts:29"}, "properties": {"repobilityId": "c2ede635ac70c7ab", "scanner": "scanner-primary", "fingerprint": "d47e98d59ff40721", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e632f440222b026", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/models.ts:3"}, "properties": {"repobilityId": "6203146009903291", "scanner": "scanner-primary", "fingerprint": "9e632f440222b026", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-49a6327840215969", "level": "note", "message": {"text": "Legacy-named symbol `migrateLegacy` in lib/prompts-store.ts:40"}, "properties": {"repobilityId": "5b6a8e4aac0780dc", "scanner": "scanner-primary", "fingerprint": "49a6327840215969", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-da75247095c5b00c", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/stage3/higgsfield.ts:5"}, "properties": {"repobilityId": "480b0bf8747cf062", "scanner": "scanner-primary", "fingerprint": "da75247095c5b00c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3faa2cbabac3e12b", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/research/runner.ts:119"}, "properties": {"repobilityId": "5de515e5f444be47", "scanner": "scanner-primary", "fingerprint": "3faa2cbabac3e12b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e32179dd4a8766ba", "level": "none", "message": {"text": "Commented-code block (7 lines) in public/pipeline-ui/tweaks-panel.jsx:16"}, "properties": {"repobilityId": "b9a24b8e41e845a6", "scanner": "scanner-primary", "fingerprint": "e32179dd4a8766ba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e048b8c6f904a9e2", "level": "error", "message": {"text": "FastAPI POST `scrape` without auth dependency \u2014 scripts/scraper_service.py:46"}, "properties": {"repobilityId": "96d4859e0b048629", "scanner": "scanner-primary", "fingerprint": "e048b8c6f904a9e2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/scraper_service.py"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-e0769c75ce515110", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/runs/${runId} (components/Stage3ReferenceImages.tsx:20)"}, "properties": {"repobilityId": "731ff62e3c2763ae", "scanner": "scanner-primary", "fingerprint": "e0769c75ce515110", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-156ab58e6bbc3446", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload-source-images (components/Stage3ReferenceImages.tsx:38)"}, "properties": {"repobilityId": "4ba69ac2cbc0200a", "scanner": "scanner-primary", "fingerprint": "156ab58e6bbc3446", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9151aa3d4e222d24", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/runs/${runId} (components/FeedbackButtons.tsx:44)"}, "properties": {"repobilityId": "b272a47cf7e6901c", "scanner": "scanner-primary", "fingerprint": "9151aa3d4e222d24", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5e5a9fbb7b51e831", "level": "error", "message": {"text": "Dangling fetch: GET /api/runs/${runId} (components/RunProductCode.tsx:16)"}, "properties": {"repobilityId": "0042a4e27a06b1d9", "scanner": "scanner-primary", "fingerprint": "5e5a9fbb7b51e831", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-69f0ae8d13599d3d", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/runs/${runId} (components/RunProductCode.tsx:30)"}, "properties": {"repobilityId": "b4c198b7333ee7f4", "scanner": "scanner-primary", "fingerprint": "69f0ae8d13599d3d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d31a8b472ee8fd98", "level": "error", "message": {"text": "Dangling fetch: GET /api/feedback/recent?stage=${stage} (components/FeedbackAppliedChip.tsx:31)"}, "properties": {"repobilityId": "b4ba652f5318a90f", "scanner": "scanner-primary", "fingerprint": "d31a8b472ee8fd98", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b2925a424795e381", "level": "error", "message": {"text": "Dangling fetch: GET /api/runs/counts (components/TopBar.tsx:36)"}, "properties": {"repobilityId": "2abb591a2211e327", "scanner": "scanner-primary", "fingerprint": "b2925a424795e381", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f62a32492a3b2645", "level": "error", "message": {"text": "Dangling fetch: GET /api/settings/models (components/ModelSettings.tsx:38)"}, "properties": {"repobilityId": "859b7c9961c8970b", "scanner": "scanner-primary", "fingerprint": "f62a32492a3b2645", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1936bac6c7e7533a", "level": "error", "message": {"text": "Dangling fetch: POST /api/settings/models (components/ModelSettings.tsx:51)"}, "properties": {"repobilityId": "2506b99e182a1e4b", "scanner": "scanner-primary", "fingerprint": "1936bac6c7e7533a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-aef68d9888843916", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/runs/${runId} (components/EditableOutput.tsx:126)"}, "properties": {"repobilityId": "6b9c9db79048d453", "scanner": "scanner-primary", "fingerprint": "aef68d9888843916", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ed6e8ffa44167b45", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/edit-prompt (components/Stage3HeroFlow.tsx:113)"}, "properties": {"repobilityId": "d3060e12c03a73c6", "scanner": "scanner-primary", "fingerprint": "ed6e8ffa44167b45", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-be8c56b61c2b0c8a", "level": "error", "message": {"text": "Dangling fetch: GET /api/runs/${runId} (components/Stage3HeroFlow.tsx:139)"}, "properties": {"repobilityId": "60b61caa395fd882", "scanner": "scanner-primary", "fingerprint": "be8c56b61c2b0c8a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d94a5a6b44d018d8", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/runs/${runId} (components/Stage3HeroFlow.tsx:324)"}, "properties": {"repobilityId": "171fa4a0d189840f", "scanner": "scanner-primary", "fingerprint": "d94a5a6b44d018d8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1a4ae5d7e8d51fbc", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/generate (components/Stage3HeroFlow.tsx:340)"}, "properties": {"repobilityId": "cf4d9f5e81d95b35", "scanner": "scanner-primary", "fingerprint": "1a4ae5d7e8d51fbc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8a68f1a8ae8e5b19", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/audit (components/Stage3HeroFlow.tsx:349)"}, "properties": {"repobilityId": "91f29c0de65fcab5", "scanner": "scanner-primary", "fingerprint": "8a68f1a8ae8e5b19", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-57c505524ff6dc95", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/runs/${runId} (components/Stage3HeroFlow.tsx:373)"}, "properties": {"repobilityId": "993ca0eef0195803", "scanner": "scanner-primary", "fingerprint": "57c505524ff6dc95", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8167c4065a8d7697", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/runs/${runId} (components/Stage3HeroFlow.tsx:397)"}, "properties": {"repobilityId": "6e0b6c8b2ee7fc8a", "scanner": "scanner-primary", "fingerprint": "8167c4065a8d7697", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ed423e5e20cb2d1e", "level": "error", "message": {"text": "Dangling fetch: POST /api/runs/${runId}/restart-stage (components/Stage3HeroFlow.tsx:523)"}, "properties": {"repobilityId": "9fcf723c319d3e1b", "scanner": "scanner-primary", "fingerprint": "ed423e5e20cb2d1e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-933a7f241f066a22", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/placement (components/Stage3HeroFlow.tsx:596)"}, "properties": {"repobilityId": "70256968dc4a8f6b", "scanner": "scanner-primary", "fingerprint": "933a7f241f066a22", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1b91029c1fdcac1d", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/runs/${runId} (components/Stage3HeroFlow.tsx:628)"}, "properties": {"repobilityId": "dc9c8cdfdf86fff3", "scanner": "scanner-primary", "fingerprint": "1b91029c1fdcac1d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2ec107be1de16c14", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/generate (components/Stage3HeroFlow.tsx:671)"}, "properties": {"repobilityId": "0d8350b3521afae7", "scanner": "scanner-primary", "fingerprint": "2ec107be1de16c14", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f328bae2861e62ec", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/audit (components/Stage3HeroFlow.tsx:680)"}, "properties": {"repobilityId": "284c0189c1676384", "scanner": "scanner-primary", "fingerprint": "f328bae2861e62ec", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4cc29dda46e45c31", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/edit-prompt (components/Stage3HeroFlow.tsx:1020)"}, "properties": {"repobilityId": "0b1a6d8a6805ed9d", "scanner": "scanner-primary", "fingerprint": "4cc29dda46e45c31", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fa75bc58288ff3d8", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/edit-prompt (components/Stage3HeroFlow.tsx:1124)"}, "properties": {"repobilityId": "e7eb27cae4045972", "scanner": "scanner-primary", "fingerprint": "fa75bc58288ff3d8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b9cb910c8331e306", "level": "error", "message": {"text": "Dangling fetch: POST /api/regenerate/${stage} (components/AIRegenerate.tsx:55)"}, "properties": {"repobilityId": "004d8eb1e35dbbaa", "scanner": "scanner-primary", "fingerprint": "b9cb910c8331e306", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d4118e3bd640059e", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/runs/${r.id} (app/HomeV2.tsx:42)"}, "properties": {"repobilityId": "c802351eb072a69e", "scanner": "scanner-primary", "fingerprint": "d4118e3bd640059e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c6e5864cec209640", "level": "error", "message": {"text": "Dangling fetch: GET /api/prompts (app/settings/page.tsx:46)"}, "properties": {"repobilityId": "9435403f3895858c", "scanner": "scanner-primary", "fingerprint": "c6e5864cec209640", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-aaba36548c6ab869", "level": "error", "message": {"text": "Dangling fetch: PUT /api/prompts (app/settings/page.tsx:84)"}, "properties": {"repobilityId": "6d7d499ab18d13cf", "scanner": "scanner-primary", "fingerprint": "aaba36548c6ab869", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-20b74d7b43ad241b", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/prompts (app/settings/page.tsx:103)"}, "properties": {"repobilityId": "3684ffb5c4cacd88", "scanner": "scanner-primary", "fingerprint": "20b74d7b43ad241b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6b032d5a9dbf6eac", "level": "error", "message": {"text": "Dangling fetch: POST /api/prompts/restore (app/settings/page.tsx:119)"}, "properties": {"repobilityId": "fddad17b5e2b9d21", "scanner": "scanner-primary", "fingerprint": "6b032d5a9dbf6eac", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6f6cd9cd2d0a1925", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/feedback (app/stage3/page.tsx:180)"}, "properties": {"repobilityId": "0c6f8e0f1aa2f12c", "scanner": "scanner-primary", "fingerprint": "6f6cd9cd2d0a1925", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8116dbf0cf44f6b8", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/edit-prompt (app/stage3/page.tsx:482)"}, "properties": {"repobilityId": "4332ee8a13ad2f8e", "scanner": "scanner-primary", "fingerprint": "8116dbf0cf44f6b8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-76498fb2932ed52d", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/edit-prompt (app/stage3/page.tsx:698)"}, "properties": {"repobilityId": "b9c355e552b992f0", "scanner": "scanner-primary", "fingerprint": "76498fb2932ed52d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e30e9e585865a280", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/edit-prompt (app/stage3/page.tsx:1192)"}, "properties": {"repobilityId": "59f516a5eae70d07", "scanner": "scanner-primary", "fingerprint": "e30e9e585865a280", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d52aee1fea9889e0", "level": "error", "message": {"text": "Dangling fetch: GET /api/runs/${runId} (app/stage3/page.tsx:1369)"}, "properties": {"repobilityId": "eb7b1d86a0538fe4", "scanner": "scanner-primary", "fingerprint": "d52aee1fea9889e0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a1a72994bbbab85e", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/prompts (app/stage3/page.tsx:1439)"}, "properties": {"repobilityId": "450af8d18a28a2d4", "scanner": "scanner-primary", "fingerprint": "a1a72994bbbab85e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fee4ff4f240c0903", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/feedback (app/stage3/page.tsx:1506)"}, "properties": {"repobilityId": "db25a776b2153375", "scanner": "scanner-primary", "fingerprint": "fee4ff4f240c0903", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5515874519d6751f", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/generate (app/stage3/page.tsx:1528)"}, "properties": {"repobilityId": "a716196f06fa662c", "scanner": "scanner-primary", "fingerprint": "5515874519d6751f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9b4e776cc5c7bc0f", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/audit (app/stage3/page.tsx:1574)"}, "properties": {"repobilityId": "9e5bde89b995793f", "scanner": "scanner-primary", "fingerprint": "9b4e776cc5c7bc0f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ed9dcf1e53c1a137", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/feedback (app/stage3/page.tsx:1590)"}, "properties": {"repobilityId": "59ab8bd0579c00cc", "scanner": "scanner-primary", "fingerprint": "ed9dcf1e53c1a137", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-66c54ae89a388b1a", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/runs/${run.id} (app/stage3/page.tsx:1607)"}, "properties": {"repobilityId": "56490b4df4977ef3", "scanner": "scanner-primary", "fingerprint": "66c54ae89a388b1a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0ced84bf9e81116e", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/generate (app/stage3/page.tsx:1658)"}, "properties": {"repobilityId": "3642e209b920d45b", "scanner": "scanner-primary", "fingerprint": "0ced84bf9e81116e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6b02afc83b200c04", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/audit (app/stage3/page.tsx:1669)"}, "properties": {"repobilityId": "d454b8a4ed2b2a6d", "scanner": "scanner-primary", "fingerprint": "6b02afc83b200c04", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-62fd7b83fe461619", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/feedback (app/stage3/page.tsx:1679)"}, "properties": {"repobilityId": "888370945d7059a2", "scanner": "scanner-primary", "fingerprint": "62fd7b83fe461619", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d99325bedaef40e6", "level": "error", "message": {"text": "Dangling fetch: POST /api/stage3/edit-prompt (app/stage3/page.tsx:1741)"}, "properties": {"repobilityId": "d810cec27384d0f7", "scanner": "scanner-primary", "fingerprint": "d99325bedaef40e6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9b7e73792699e224", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/runs/${run.id} (app/stage3/page.tsx:1807)"}, "properties": {"repobilityId": "ae2c055488e2b66b", "scanner": "scanner-primary", "fingerprint": "9b7e73792699e224", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d69f12af21cee807", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/runs/${run.id} (app/stage3/page.tsx:1828)"}, "properties": {"repobilityId": "87b35798cb062135", "scanner": "scanner-primary", "fingerprint": "d69f12af21cee807", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e79ed4f0a68240d4", "level": "error", "message": {"text": "Dangling fetch: POST https://api.firecrawl.dev/v1/scrape (app/api/scrape/route.ts:104)"}, "properties": {"repobilityId": "51fe62ad1fadc4dc", "scanner": "scanner-primary", "fingerprint": "e79ed4f0a68240d4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-551dbde131f5c82f", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload-source-images (app/new/page.tsx:66)"}, "properties": {"repobilityId": "b96eb3567db0621b", "scanner": "scanner-primary", "fingerprint": "551dbde131f5c82f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-33c96cf3d03c90ed", "level": "error", "message": {"text": "Dangling fetch: POST /api/runs/start (app/new/page.tsx:90)"}, "properties": {"repobilityId": "3687fe1604628073", "scanner": "scanner-primary", "fingerprint": "33c96cf3d03c90ed", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9cab83f6c4111472", "level": "error", "message": {"text": "Dangling fetch: POST /api/runs/${runId}/cancel (app/runs/[id]/page.tsx:285)"}, "properties": {"repobilityId": "f1c4a44fc754a0d2", "scanner": "scanner-primary", "fingerprint": "9cab83f6c4111472", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-07937d0a236bb2e2", "level": "error", "message": {"text": "Dangling fetch: POST /api/runs/${runId}/resume (app/runs/[id]/page.tsx:293)"}, "properties": {"repobilityId": "022d55d116a6da24", "scanner": "scanner-primary", "fingerprint": "07937d0a236bb2e2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b773a4f7ba574ed3", "level": "error", "message": {"text": "Dangling fetch: POST /api/runs/${runId}/start-stage2 (app/runs/[id]/page.tsx:313)"}, "properties": {"repobilityId": "bf36e3bea0ae4034", "scanner": "scanner-primary", "fingerprint": "b773a4f7ba574ed3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d690b1679617880b", "level": "error", "message": {"text": "Dangling fetch: POST /api/runs/${runId}/restart-stage (app/runs/[id]/page.tsx:329)"}, "properties": {"repobilityId": "34b1e5cd2a5b3d49", "scanner": "scanner-primary", "fingerprint": "d690b1679617880b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b85ac0cc0c57bfad", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/runs/${runId} (app/runs/[id]/page.tsx:348)"}, "properties": {"repobilityId": "60bf4bfb3742d6f8", "scanner": "scanner-primary", "fingerprint": "b85ac0cc0c57bfad", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0ece2fe5bc37d2bc", "level": "error", "message": {"text": "Dangling fetch: GET /api/runs/${runId} (app/runs/[id]/page.tsx:387)"}, "properties": {"repobilityId": "427591cb31f89964", "scanner": "scanner-primary", "fingerprint": "0ece2fe5bc37d2bc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-add1c6ad39e888ea", "level": "error", "message": {"text": "Dangling fetch: GET /api/runs/${runId}/status (hooks/useRunPolling.ts:70)"}, "properties": {"repobilityId": "457fdf776ab3d592", "scanner": "scanner-primary", "fingerprint": "add1c6ad39e888ea", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d2e04646e9cae6ea", "level": "error", "message": {"text": "Dangling fetch: GET /api/runs/${runId}/status (hooks/useRunPolling.ts:106)"}, "properties": {"repobilityId": "09ed0813946c800f", "scanner": "scanner-primary", "fingerprint": "d2e04646e9cae6ea", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "7712fb72bf2bb8be", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ab8b3c68308c92da", "level": "note", "message": {"text": "Unused endpoint: POST /scrape"}, "properties": {"repobilityId": "6e873d88daa64289", "scanner": "scanner-primary", "fingerprint": "ab8b3c68308c92da", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}