{"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-09db0ce51b8c5ecf", "name": "Possibly dead Python function: notify_github_trial", "shortDescription": {"text": "Possibly dead Python function: notify_github_trial"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3d5d90ea5362edbc", "name": "Possibly dead Python function: notify_github_analysis", "shortDescription": {"text": "Possibly dead Python function: notify_github_analysis"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9665c726b765176b", "name": "Possibly dead Python function: notify_github_qa", "shortDescription": {"text": "Possibly dead Python function: notify_github_qa"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a16e21af862d789a", "name": "Possibly dead Python function: export_skills", "shortDescription": {"text": "Possibly dead Python function: export_skills"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c0d16b087ff0a80d", "name": "Possibly dead Python function: run_reaper_loop", "shortDescription": {"text": "Possibly dead Python function: run_reaper_loop"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-52552492c9f3c59b", "name": "Possibly dead Python function: run_once", "shortDescription": {"text": "Possibly dead Python function: run_once"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4a90a641e2057853", "name": "Possibly dead Python function: do_run_migrations", "shortDescription": {"text": "Possibly dead Python function: do_run_migrations"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-33d4b163c3573fdf", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1d7aed4f1621c0d8", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-99e2a5473fb0dc15", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e3b97517a121421f", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-396b4e3d2351d77e", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b9fa1a1380ed41d8", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-70fe1066696a0b7c", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0ad824ec516bcd64", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c3bf80e7950f2166", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e7908e7b8fb49e1c", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6d1047d03b63a835", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3589d61a112e7927", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/share/[token]/page.tsx:82", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/share/[token]/page.tsx:82"}, "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-d830e6d3689b41bc", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/(app)/experiments/[experiment]/experiment-client.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/(app)/experiments/[experiment]/experiment-client.tsx:480"}, "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-9316d2007fcc19d3", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/(app)/dashboard/dashboard-client.tsx:1332", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/(app)/dashboard/dashboard-client.tsx:1332"}, "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-357fbc21f25028f1", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/(app)/settings/page.tsx:747", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/(app)/settings/page.tsx:747"}, "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-f64179547ec2cdd2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/(app)/tasks/tasks-client.tsx:313", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/(app)/tasks/tasks-client.tsx:313"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bfe2a1e9c66b8dcf", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/(app)/tasks/[task_id]/task-detail-client.tsx:223", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/(app)/tasks/[task_id]/task-detail-client.tsx:223"}, "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-40fedce749dda9db", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/worker-jobs-card.tsx:327", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/worker-jobs-card.tsx:327"}, "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-ff9e95e4bcd6e5af", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/artifacts-viewer.tsx:307", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/artifacts-viewer.tsx:307"}, "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-27864831d8a849ef", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/experiment-trials-table.tsx:2111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/experiment-trials-table.tsx:2111"}, "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-1a2e105107613a31", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/preview-banner.tsx:22", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/preview-banner.tsx:22"}, "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-9745d94481e73a01", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/dataset-detail-view.tsx:255", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/dataset-detail-view.tsx:255"}, "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-e0589252e8298689", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/code-block.tsx:171", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/code-block.tsx:171"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1e19ccf46ae7b66e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/pass-at-one-leaderboard.tsx:148", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/pass-at-one-leaderboard.tsx:148"}, "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-e5aa2adc5bef15db", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/saved-filters-menu.tsx:206", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/saved-filters-menu.tsx:206"}, "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-d4a67a32d7e20a5d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/task-files-panel.tsx:962", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/task-files-panel.tsx:962"}, "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-91e4d10f5a78803e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/experiment-detail-view.tsx:379", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/experiment-detail-view.tsx:379"}, "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-958fa300f583a269", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/task-probe-run-card.tsx:174", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/task-probe-run-card.tsx:174"}, "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-9b76ba0f66369102", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/trajectory-viewer.tsx:530", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/trajectory-viewer.tsx:530"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-69a4d12c0db842a0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/trial-detail-panel.tsx:474", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/trial-detail-panel.tsx:474"}, "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-209dc7e4897dff60", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/renderers/csv-renderer.tsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/renderers/csv-renderer.tsx:118"}, "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-ac9aef4a21ee62ac", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/renderers/docx-renderer.tsx:166", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/renderers/docx-renderer.tsx:166"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-23ed071915bdcfe2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/renderers/xlsx-renderer.tsx:140", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/renderers/xlsx-renderer.tsx:140"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1f66ad88286ca30a", "name": "Dockerfile runs as root: backend/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: backend/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-a1de5ed0cd57d4e5", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.13-slim-bookworm", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.13-slim-bookworm"}, "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-faa134129e5545ff", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "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-40e37292dd0495c4", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/code-block.tsx:171", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/code-block.tsx:171"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d0144b58fe57a146", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/renderers/docx-renderer.tsx:166", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/renderers/docx-renderer.tsx:166"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bee8f830415ebe5d", "name": "Insecure pattern 'domparser_html_parse' in frontend/src/components/renderers/docx-renderer.tsx:57", "shortDescription": {"text": "Insecure pattern 'domparser_html_parse' in frontend/src/components/renderers/docx-renderer.tsx:57"}, "fullDescription": {"text": "Found a known-risky pattern (domparser_html_parse). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ae84ceeaa5d9b3a3", "name": "Insecure pattern 'cors_wildcard' in oddish/src/oddish/server/__init__.py:224", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in oddish/src/oddish/server/__init__.py:224"}, "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-d2acfd945a26070a", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ad92685d63517eaa", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-76c64d601e1994a8", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0503686c5b4ed857", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2f636b6fcc434322", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-91c918149077140f", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-076f6dab08aedb18", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-43e0a2695dd8336d", "name": "Very large file: frontend/src/app/(app)/dashboard/dashboard-client.tsx (1811 lines)", "shortDescription": {"text": "Very large file: frontend/src/app/(app)/dashboard/dashboard-client.tsx (1811 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-d286050edf40a0d9", "name": "Very large file: frontend/src/components/experiment-trials-table.tsx (2545 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/experiment-trials-table.tsx (2545 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-3d4767c4fcc04598", "name": "Very large file: oddish/src/oddish/config.py (1254 lines)", "shortDescription": {"text": "Very large file: oddish/src/oddish/config.py (1254 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-7c2cac551693eb25", "name": "Very large file: oddish/src/oddish/workers/harbor_runner.py (1374 lines)", "shortDescription": {"text": "Very large file: oddish/src/oddish/workers/harbor_runner.py (1374 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-794f61df46a5f2bc", "name": "Very large file: oddish/src/oddish/db/models.py (1662 lines)", "shortDescription": {"text": "Very large file: oddish/src/oddish/db/models.py (1662 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-dde84156f4314431", "name": "Very large file: oddish/src/oddish/db/storage.py (1600 lines)", "shortDescription": {"text": "Very large file: oddish/src/oddish/db/storage.py (1600 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-386bc7120b104adb", "name": "Very large file: oddish/src/oddish/core/dashboard.py (1571 lines)", "shortDescription": {"text": "Very large file: oddish/src/oddish/core/dashboard.py (1571 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-fb906d67bffe7f42", "name": "Very large file: oddish/src/oddish/core/endpoints.py (2613 lines)", "shortDescription": {"text": "Very large file: oddish/src/oddish/core/endpoints.py (2613 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-489d64aa33ad8760", "name": "Very large file: oddish/src/oddish/cli/api.py (1774 lines)", "shortDescription": {"text": "Very large file: oddish/src/oddish/cli/api.py (1774 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "111 tests / 458 src (ratio 0.24)."}, "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 71 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 58 placeholder/mock markers across 29 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-bea357a6497a2d5d", "name": "Agent authority lacks a verifier contract: CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cbb5857940ba0dc2", "name": "Agent instruction/config may expose a secret: AGENTS.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: AGENTS.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-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-31c91df33ddb9e19", "name": "Commented-code block (8 lines) in backend/modal_app.py:43", "shortDescription": {"text": "Commented-code block (8 lines) in backend/modal_app.py:43"}, "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-9965b54685f5273b", "name": "Commented-code block (5 lines) in backend/models.py:333", "shortDescription": {"text": "Commented-code block (5 lines) in backend/models.py:333"}, "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-ff9b5553594fdd24", "name": "Commented-code block (7 lines) in backend/endpoints.py:10", "shortDescription": {"text": "Commented-code block (7 lines) in backend/endpoints.py:10"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e00cf05a269fcc0a", "name": "Commented-code block (5 lines) in backend/dashboard_owner_backfill.py:323", "shortDescription": {"text": "Commented-code block (5 lines) in backend/dashboard_owner_backfill.py:323"}, "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-0bda2bef9a08a3ca", "name": "Commented-code block (8 lines) in backend/observability.py:122", "shortDescription": {"text": "Commented-code block (8 lines) in backend/observability.py:122"}, "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-c4b6dc5ba9d87f0f", "name": "Commented-code block (5 lines) in backend/preview_seed.py:67", "shortDescription": {"text": "Commented-code block (5 lines) in backend/preview_seed.py:67"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c49bff17b0dd7d1f", "name": "Commented-code block (7 lines) in backend/worker/functions.py:3", "shortDescription": {"text": "Commented-code block (7 lines) in backend/worker/functions.py: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-f6aa5e74d4d6b5c3", "name": "Legacy-named symbol `a_old` in backend/tests/test_org_probes_api.py:77", "shortDescription": {"text": "Legacy-named symbol `a_old` in backend/tests/test_org_probes_api.py:77"}, "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-bbade7309befdb6d", "name": "Commented-code block (9 lines) in backend/api/services/cc_chat/claude_md.py:76", "shortDescription": {"text": "Commented-code block (9 lines) in backend/api/services/cc_chat/claude_md.py:76"}, "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-b4386766fe919d9e", "name": "Network/subprocess call without timeout or try/except \u2014 .github/scripts/preview/redeploy_vercel.py:58", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 .github/scripts/preview/redeploy_vercel.py:58"}, "fullDescription": {"text": "`urllib.request.urlopen(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-89dd84c4db32395d", "name": "Network/subprocess call without timeout or try/except \u2014 .github/scripts/preview/bootstrap_preview_db.py:16", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 .github/scripts/preview/bootstrap_preview_db.py:16"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f298a939dc3c3c9b", "name": "Commented-code block (5 lines) in .github/scripts/preview/find_last_deploys.py:48", "shortDescription": {"text": "Commented-code block (5 lines) in .github/scripts/preview/find_last_deploys.py:48"}, "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-97e96831e99592bd", "name": "Network/subprocess call without timeout or try/except \u2014 .github/scripts/preview/find_last_deploys.py:38", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 .github/scripts/preview/find_last_deploys.py:38"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-676b1c31b10d69cf", "name": "Commented-code block (6 lines) in frontend/src/middleware.ts:5", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/middleware.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-83d53f0d50cfd126", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/experiments/[experiment]/route.ts:43", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/experiments/[experiment]/route.ts:43"}, "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-3916233fec7dc9cd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/experiments/[experiment]/unpublish/route.ts:41", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/experiments/[experiment]/unpublish/route.ts:41"}, "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-de22657222b7c1ba", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/experiments/[experiment]/probes/route.ts:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/experiments/[experiment]/probes/route.ts:35"}, "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-b40b71dd85593861", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/experiments/[experiment]/share/route.ts:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/experiments/[experiment]/share/route.ts:35"}, "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-bd6ab5236b0600aa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/experiments/[experiment]/publish/route.ts:41", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/experiments/[experiment]/publish/route.ts:41"}, "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-222a56a7cc155d63", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/experiments/[experiment]/tasks/route.ts:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/experiments/[experiment]/tasks/route.ts:72"}, "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-1717d71a2302cb9c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tag-policy/route.ts:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tag-policy/route.ts:18"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3f0b191d907e94e9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/trials/[trial_id]/probe-artifacts/route.ts:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/trials/[trial_id]/probe-artifacts/route.ts:20"}, "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-0d1422e17479716e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/trials/[trial_id]/trajectory/route.ts:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/trials/[trial_id]/trajectory/route.ts:20"}, "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-b864cc94f5d63bf5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/trials/[trial_id]/retry/route.ts:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/trials/[trial_id]/retry/route.ts:25"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7d273235ab29cbcf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/trials/[trial_id]/logs/route.ts:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/trials/[trial_id]/logs/route.ts:20"}, "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-c617cd6a58acf5b4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/trials/[trial_id]/logs/structured/route.ts:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/trials/[trial_id]/logs/structured/route.ts:20"}, "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-7f35f4a2906d7345", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/trials/[trial_id]/result/route.ts:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/trials/[trial_id]/result/route.ts:20"}, "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-36d135060e1c2ae1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/admin/worker-jobs/route.ts:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/admin/worker-jobs/route.ts:36"}, "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-619252b024789d58", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/admin/orphaned-state/route.ts:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/admin/orphaned-state/route.ts:34"}, "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-c2c2bba9509b48f2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/admin/slots/route.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/admin/slots/route.ts:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0e1ed854bc64e45f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/admin/queue-health/route.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/admin/queue-health/route.ts:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f53ee9ead0362ed4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/admin/queue-status/route.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/admin/queue-status/route.ts:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-93b20e64fb68ad5d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/users/route.ts:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/users/route.ts:28"}, "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-5db9452ca73cb461", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/probes/route.ts:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/probes/route.ts:18"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-406491b5ac6e4f4a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tag-filters/route.ts:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tag-filters/route.ts:18"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e9e8ff08c54f39ed", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tag-filters/[filter_id]/route.ts:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tag-filters/[filter_id]/route.ts:26"}, "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-d5b7c8c576af2a4d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/settings/api-keys/route.ts:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/settings/api-keys/route.ts:19"}, "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-aa5fcfe86b2e6c9b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/settings/api-keys/[key_id]/route.ts:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/settings/api-keys/[key_id]/route.ts:24"}, "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-6efafcc93c0768f7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tags/route.ts:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tags/route.ts:18"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9cd757d2e4e8a579", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tags/unassign/route.ts:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tags/unassign/route.ts:19"}, "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-ae7420e0acb33306", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tags/assign/route.ts:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tags/assign/route.ts:19"}, "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-fe938da1dc7429e2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/route.ts:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/route.ts:33"}, "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-e851adebb94cd676", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/browse/route.ts:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/browse/route.ts:32"}, "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-513bdcc6aa6a40a9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/cancel/route.ts:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/cancel/route.ts:33"}, "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-7ed5300225ac99b7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/sweep/route.ts:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/sweep/route.ts:19"}, "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-0e9e652a39358541", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/[task_id]/route.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/[task_id]/route.ts:23"}, "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-f7bf1018da1bb8ab", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/[task_id]/trials/route.ts:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/[task_id]/trials/route.ts:22"}, "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-dde52c16f96b24a0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/[task_id]/trials/[index]/route.ts:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/[task_id]/trials/[index]/route.ts:20"}, "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-e0326291e77ada77", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/[task_id]/qa/cancel/route.ts:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/[task_id]/qa/cancel/route.ts:25"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-21b00b093bc9e993", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/[task_id]/qa/retry/route.ts:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/[task_id]/qa/retry/route.ts:25"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a39dce632479e464", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/[task_id]/versions/route.ts:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/[task_id]/versions/route.ts:19"}, "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-d12e1930eb1ae8d1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/skills/route.ts:81", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/skills/route.ts:81"}, "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-1719c97615831db2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/skills/[id]/route.ts:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/skills/[id]/route.ts:32"}, "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-c9ce4d83cc562d96", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/documents/route.ts:81", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/documents/route.ts:81"}, "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-74661e608697e2cd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/documents/[id]/route.ts:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/documents/[id]/route.ts:32"}, "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-04e3bb3707e0345c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/probe-presets/route.ts:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/probe-presets/route.ts:18"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b5e7d389b28bc080", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/probe-presets/[preset_id]/route.ts:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/probe-presets/[preset_id]/route.ts:26"}, "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-46bd5382ed915814", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/public/experiments/[token]/tasks/route.ts:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/public/experiments/[token]/tasks/route.ts:15"}, "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-2e64ed25b0286975", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/public/tasks/[task_id]/files/route.ts:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/public/tasks/[task_id]/files/route.ts:15"}, "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-2b5b752d2f5552c0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/(app)/experiments/[experiment]/page.tsx:64", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/(app)/experiments/[experiment]/page.tsx:64"}, "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-c44a2b4c5cb2b1e9", "name": "Commented-code block (6 lines) in frontend/src/app/(app)/experiments/[experiment]/experiment-client.tsx:295", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/app/(app)/experiments/[experiment]/experiment-client.tsx:295"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a9055100f45dc6af", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/(app)/tasks/page.tsx:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/(app)/tasks/page.tsx:26"}, "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-92ecee80726ccb50", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/(app)/tasks/[task_id]/page.tsx:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/(app)/tasks/[task_id]/page.tsx:21"}, "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-1586086421feef1c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/(app)/tasks/[task_id]/probe/[trial_id]/page.tsx:62", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/(app)/tasks/[task_id]/probe/[trial_id]/page.tsx:62"}, "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-97e8480e3ab26aa0", "name": "Commented-code block (6 lines) in frontend/src/components/artifacts-viewer.tsx:64", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/artifacts-viewer.tsx:64"}, "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-e521850fc0ab80e7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/artifacts-viewer.tsx:459", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/artifacts-viewer.tsx:459"}, "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-804e75a307f51957", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/tag-editor.tsx:70", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/tag-editor.tsx:70"}, "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-5c66e85aa3cd1fef", "name": "Commented-code block (5 lines) in frontend/src/components/tag-chip-editor.tsx:111", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/tag-chip-editor.tsx:111"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c1f97611df4213c5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/tag-chip-editor.tsx:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/tag-chip-editor.tsx:78"}, "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-c0f9bef42b17fe73", "name": "Commented-code block (6 lines) in frontend/src/components/saved-filters-menu.tsx:152", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/saved-filters-menu.tsx:152"}, "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-ccadf2396364f463", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/saved-filters-menu.tsx:116", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/saved-filters-menu.tsx:116"}, "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-5829c609c3afd4d8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/probe-history-table.tsx:272", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/probe-history-table.tsx:272"}, "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-06a9ede05ab0f132", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/task-files-panel.tsx:687", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/task-files-panel.tsx:687"}, "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-961629d9a36fa7d2", "name": "Commented-code block (6 lines) in frontend/src/components/experiment-detail-view.tsx:1013", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/experiment-detail-view.tsx:1013"}, "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-66dce02c24ccbfb9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/task-probe-run-card.tsx:108", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/task-probe-run-card.tsx:108"}, "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-5a2be8f3f7881346", "name": "Commented-code block (6 lines) in frontend/src/components/trial-detail-panel.tsx:145", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/trial-detail-panel.tsx:145"}, "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-8797ee4dc530f8aa", "name": "Commented-code block (5 lines) in frontend/src/lib/utils.ts:78", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/lib/utils.ts:78"}, "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-ab324f18cf03759e", "name": "Commented-code block (5 lines) in frontend/src/lib/status-config.ts:276", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/lib/status-config.ts:276"}, "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-3192f4e09121f5bd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/observability.ts:110", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/observability.ts:110"}, "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-afeeb5a1f697f11d", "name": "Commented-code block (5 lines) in oddish/tests/test_task_deletion.py:85", "shortDescription": {"text": "Commented-code block (5 lines) in oddish/tests/test_task_deletion.py:85"}, "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-f8c9307a1e432781", "name": "Legacy-named symbol `test_combine_shared_artifacts_skips_s3_copy` in oddish/tests/test_experiment_combine.py:203", "shortDescription": {"text": "Legacy-named symbol `test_combine_shared_artifacts_skips_s3_copy` in oddish/tests/test_experiment_combine.py:203"}, "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-ff44286cea70e539", "name": "Commented-code block (5 lines) in oddish/tests/test_worker_job_dispatcher.py:180", "shortDescription": {"text": "Commented-code block (5 lines) in oddish/tests/test_worker_job_dispatcher.py:180"}, "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-15e4bae743c430cc", "name": "Commented-code block (6 lines) in oddish/tests/test_tags_migration_sanity.py:217", "shortDescription": {"text": "Commented-code block (6 lines) in oddish/tests/test_tags_migration_sanity.py:217"}, "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-04c7ab3ee3f8c58f", "name": "Commented-code block (6 lines) in oddish/tests/test_subscription_routing.py:254", "shortDescription": {"text": "Commented-code block (6 lines) in oddish/tests/test_subscription_routing.py:254"}, "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-56cf43c70de21e20", "name": "Commented-code block (5 lines) in oddish/tests/test_config_queue_keys.py:272", "shortDescription": {"text": "Commented-code block (5 lines) in oddish/tests/test_config_queue_keys.py:272"}, "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-4e0292ee1fe2c001", "name": "Legacy-named symbol `list_objects_v2` in oddish/tests/test_task_storage.py:91", "shortDescription": {"text": "Legacy-named symbol `list_objects_v2` in oddish/tests/test_task_storage.py:91"}, "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-b56bcace997cedc3", "name": "Commented-code block (5 lines) in oddish/alembic/versions/mine_filter_idx_001_add_mine_filter_indexes.py:40", "shortDescription": {"text": "Commented-code block (5 lines) in oddish/alembic/versions/mine_filter_idx_001_add_mine_filter_indexes.py:40"}, "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-3bccc2fec43ddc58", "name": "Commented-code block (5 lines) in oddish/alembic/versions/skills_001_add_skills.py:20", "shortDescription": {"text": "Commented-code block (5 lines) in oddish/alembic/versions/skills_001_add_skills.py:20"}, "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-e60c3ee4b70f24eb", "name": "Commented-code block (5 lines) in oddish/alembic/versions/documents_001_add_documents.py:21", "shortDescription": {"text": "Commented-code block (5 lines) in oddish/alembic/versions/documents_001_add_documents.py:21"}, "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-104530d734791f37", "name": "Commented-code block (5 lines) in oddish/alembic/versions/i1d2e3f4a5b6_partial_indexes_for_soft_delete.py:44", "shortDescription": {"text": "Commented-code block (5 lines) in oddish/alembic/versions/i1d2e3f4a5b6_partial_indexes_for_soft_delete.py:44"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-10a7065176640f07", "name": "Commented-code block (7 lines) in oddish/src/oddish/config.py:99", "shortDescription": {"text": "Commented-code block (7 lines) in oddish/src/oddish/config.py:99"}, "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-2c59ad50f380f5f8", "name": "Commented-code block (5 lines) in oddish/src/oddish/queue.py:649", "shortDescription": {"text": "Commented-code block (5 lines) in oddish/src/oddish/queue.py:649"}, "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-15a9b9c53e599a99", "name": "Commented-code block (9 lines) in oddish/src/oddish/task_timeouts.py:7", "shortDescription": {"text": "Commented-code block (9 lines) in oddish/src/oddish/task_timeouts.py:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8f37df98d62941df", "name": "Legacy-named symbol `model_copy` in oddish/src/oddish/workers/harbor_runner.py:1159", "shortDescription": {"text": "Legacy-named symbol `model_copy` in oddish/src/oddish/workers/harbor_runner.py:1159"}, "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-b6c66991e865be9e", "name": "Commented-code block (9 lines) in oddish/src/oddish/workers/harbor_runner.py:134", "shortDescription": {"text": "Commented-code block (9 lines) in oddish/src/oddish/workers/harbor_runner.py:134"}, "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-c9e2678b785cee6e", "name": "Commented-code block (7 lines) in oddish/src/oddish/workers/claude_code_agent.py:46", "shortDescription": {"text": "Commented-code block (7 lines) in oddish/src/oddish/workers/claude_code_agent.py:46"}, "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-aa601b75b79e6cc7", "name": "Commented-code block (5 lines) in oddish/src/oddish/workers/queue/task_expand_handler.py:208", "shortDescription": {"text": "Commented-code block (5 lines) in oddish/src/oddish/workers/queue/task_expand_handler.py:208"}, "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-cf0c12840b7d05fa", "name": "Commented-code block (5 lines) in oddish/src/oddish/workers/queue/trial_handler.py:439", "shortDescription": {"text": "Commented-code block (5 lines) in oddish/src/oddish/workers/queue/trial_handler.py:439"}, "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-3687914a4bc11b16", "name": "Commented-code block (5 lines) in oddish/src/oddish/workers/queue/worker_job_dispatcher.py:191", "shortDescription": {"text": "Commented-code block (5 lines) in oddish/src/oddish/workers/queue/worker_job_dispatcher.py:191"}, "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-adedd66f4af5774a", "name": "Commented-code block (5 lines) in oddish/src/oddish/workers/queue/cleanup.py:55", "shortDescription": {"text": "Commented-code block (5 lines) in oddish/src/oddish/workers/queue/cleanup.py:55"}, "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-11efe8977ec1567e", "name": "Commented-code block (5 lines) in oddish/src/oddish/workers/queue/worker_job_single_job.py:129", "shortDescription": {"text": "Commented-code block (5 lines) in oddish/src/oddish/workers/queue/worker_job_single_job.py:129"}, "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-b6459d71084c48b0", "name": "Commented-code block (7 lines) in oddish/src/oddish/worker/probe_overlay.py:19", "shortDescription": {"text": "Commented-code block (7 lines) in oddish/src/oddish/worker/probe_overlay.py:19"}, "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-4cb18c8e36ba9584", "name": "Commented-code block (6 lines) in oddish/src/oddish/worker/local_runner.py:367", "shortDescription": {"text": "Commented-code block (6 lines) in oddish/src/oddish/worker/local_runner.py:367"}, "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-06af5ce2ccbce4e6", "name": "Commented-code block (6 lines) in oddish/src/oddish/worker/probe_analysis.py:213", "shortDescription": {"text": "Commented-code block (6 lines) in oddish/src/oddish/worker/probe_analysis.py:213"}, "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-c969fbf6bacf1c14", "name": "Commented-code block (8 lines) in oddish/src/oddish/server/__init__.py:511", "shortDescription": {"text": "Commented-code block (8 lines) in oddish/src/oddish/server/__init__.py:511"}, "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-1c92e35a1af003e5", "name": "Commented-code block (6 lines) in oddish/src/oddish/analyze/classifier.py:301", "shortDescription": {"text": "Commented-code block (6 lines) in oddish/src/oddish/analyze/classifier.py:301"}, "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-79a01786dd9bc57c", "name": "Commented-code block (5 lines) in oddish/src/oddish/db/connection.py:168", "shortDescription": {"text": "Commented-code block (5 lines) in oddish/src/oddish/db/connection.py:168"}, "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-d07591b676085735", "name": "Network/subprocess call without timeout or try/except \u2014 oddish/src/oddish/db/connection.py:294", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 oddish/src/oddish/db/connection.py:294"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8af6a1c7e9ae9880", "name": "Commented-code block (6 lines) in oddish/src/oddish/db/soft_delete.py:55", "shortDescription": {"text": "Commented-code block (6 lines) in oddish/src/oddish/db/soft_delete.py:55"}, "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-bc583d5c26b815d0", "name": "Commented-code block (11 lines) in oddish/src/oddish/db/models.py:104", "shortDescription": {"text": "Commented-code block (11 lines) in oddish/src/oddish/db/models.py:104"}, "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-a9583ece76e8c058", "name": "Legacy-named symbol `list_objects_v2` in oddish/src/oddish/db/storage.py:406", "shortDescription": {"text": "Legacy-named symbol `list_objects_v2` in oddish/src/oddish/db/storage.py:406"}, "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-b7c4b8848d6b914b", "name": "Commented-code block (5 lines) in oddish/src/oddish/db/storage.py:148", "shortDescription": {"text": "Commented-code block (5 lines) in oddish/src/oddish/db/storage.py:148"}, "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-7ce9d8b163354434", "name": "Commented-code block (6 lines) in oddish/src/oddish/core/tasks.py:298", "shortDescription": {"text": "Commented-code block (6 lines) in oddish/src/oddish/core/tasks.py:298"}, "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-f20344530de47668", "name": "Commented-code block (5 lines) in oddish/src/oddish/core/admin.py:210", "shortDescription": {"text": "Commented-code block (5 lines) in oddish/src/oddish/core/admin.py:210"}, "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-842f57fe71c13af5", "name": "Commented-code block (5 lines) in oddish/src/oddish/core/auto_probe.py:27", "shortDescription": {"text": "Commented-code block (5 lines) in oddish/src/oddish/core/auto_probe.py:27"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-63b694b0ce00f358", "name": "Commented-code block (5 lines) in oddish/src/oddish/core/dashboard.py:111", "shortDescription": {"text": "Commented-code block (5 lines) in oddish/src/oddish/core/dashboard.py:111"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-387aff99ccd262db", "name": "Legacy-named symbol `model_copy` in oddish/src/oddish/core/endpoints.py:2438", "shortDescription": {"text": "Legacy-named symbol `model_copy` in oddish/src/oddish/core/endpoints.py:2438"}, "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-d9b3ecdae3b2710d", "name": "Commented-code block (6 lines) in oddish/src/oddish/core/endpoints.py:179", "shortDescription": {"text": "Commented-code block (6 lines) in oddish/src/oddish/core/endpoints.py:179"}, "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-270e1ca19948b150", "name": "Commented-code block (9 lines) in oddish/src/oddish/core/experiments.py:103", "shortDescription": {"text": "Commented-code block (9 lines) in oddish/src/oddish/core/experiments.py:103"}, "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-c0968aad67ce369d", "name": "Commented-code block (6 lines) in oddish/src/oddish/core/trial_imports.py:196", "shortDescription": {"text": "Commented-code block (6 lines) in oddish/src/oddish/core/trial_imports.py:196"}, "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-073353bfd06d5409", "name": "Commented-code block (5 lines) in oddish/src/oddish/cli/upload.py:347", "shortDescription": {"text": "Commented-code block (5 lines) in oddish/src/oddish/cli/upload.py:347"}, "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-5f9ed1d4f39f6d2a", "name": "Commented-code block (5 lines) in oddish/src/oddish/cli/api.py:332", "shortDescription": {"text": "Commented-code block (5 lines) in oddish/src/oddish/cli/api.py:332"}, "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-2370d87afbad59f1", "name": "Commented-code block (8 lines) in oddish/src/oddish/cli/run.py:665", "shortDescription": {"text": "Commented-code block (8 lines) in oddish/src/oddish/cli/run.py:665"}, "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-b673918452ee2583", "name": "70 env vars used in code but missing from .env.example", "shortDescription": {"text": "70 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANTHROPIC_API_KEY`, `AWS_ACCESS_KEY_ID`, `AWS_REGION`, `AWS_SECRET_ACCESS_KEY`, `CC_LOGGER_REAL_CLAUDE`, `CLAUDE_CODE_OAUTH_TOKEN`, `CLERK_ISSUER`, `CLERK_JWT_AUDIENCE` + 62 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/api/routers/tags.py:exclude_tag, backend/api/routers/tags.py:unexclude_tag\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/api/services/cc_chat/daytona_client.py:create_sandbox, backend/api/services/cc_chat/daytona_client.py:create_sandbox, backend/api/services/cc_chat/daytona_client.py:create_sandbox\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4fd2559af834d1de", "name": "FastAPI POST `handle_clerk_webhook` without auth dependency \u2014 backend/api/routers/clerk_webhooks.py:186", "shortDescription": {"text": "FastAPI POST `handle_clerk_webhook` without auth dependency \u2014 backend/api/routers/clerk_webhooks.py:186"}, "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-616c3644b2be36d9", "name": "Dangling fetch: POST /api/settings/api-keys (frontend/src/app/(app)/settings/page.tsx:354)", "shortDescription": {"text": "Dangling fetch: POST /api/settings/api-keys (frontend/src/app/(app)/settings/page.tsx:354)"}, "fullDescription": {"text": "`frontend/src/app/(app)/settings/page.tsx:354` calls `POST /api/settings/api-keys` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings/api-keys`\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-088e83c55dd3e746", "name": "Dangling fetch: DELETE /api/settings/api-keys/${revokeTarget.id} (frontend/src/app/(app)/settings/page.tsx:526)", "shortDescription": {"text": "Dangling fetch: DELETE /api/settings/api-keys/${revokeTarget.id} (frontend/src/app/(app)/settings/page.tsx:526)"}, "fullDescription": {"text": "`frontend/src/app/(app)/settings/page.tsx:526` calls `DELETE /api/settings/api-keys/${revokeTarget.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings/api-keys/<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-539cd44e6287d818", "name": "Dangling fetch: POST /api/trials/${trial_id}/cancel (frontend/src/lib/observability.ts:110)", "shortDescription": {"text": "Dangling fetch: POST /api/trials/${trial_id}/cancel (frontend/src/lib/observability.ts:110)"}, "fullDescription": {"text": "`frontend/src/lib/observability.ts:110` calls `POST /api/trials/${trial_id}/cancel` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trials/<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-5a15440273e677bc", "name": "Unused endpoint: GET /documents/{document_id}", "shortDescription": {"text": "Unused endpoint: GET /documents/{document_id}"}, "fullDescription": {"text": "`backend/api/routers/documents.py` declares `GET /documents/{document_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3558d5261f8fa12e", "name": "Unused endpoint: POST /tasks/upload/init", "shortDescription": {"text": "Unused endpoint: POST /tasks/upload/init"}, "fullDescription": {"text": "`backend/api/routers/tasks.py` declares `POST /tasks/upload/init` 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-567e24f86b861da7", "name": "Unused endpoint: POST /tasks/upload/complete", "shortDescription": {"text": "Unused endpoint: POST /tasks/upload/complete"}, "fullDescription": {"text": "`backend/api/routers/tasks.py` declares `POST /tasks/upload/complete` 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-fd0e06afbaab19b3", "name": "Unused endpoint: GET /tasks", "shortDescription": {"text": "Unused endpoint: GET /tasks"}, "fullDescription": {"text": "`backend/api/routers/tasks.py` declares `GET /tasks` 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-25f8096bbe16ad83", "name": "Unused endpoint: GET /tasks/browse", "shortDescription": {"text": "Unused endpoint: GET /tasks/browse"}, "fullDescription": {"text": "`backend/api/routers/tasks.py` declares `GET /tasks/browse` 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-0bb3f1c6d8611d4c", "name": "Unused endpoint: POST /experiments/combine", "shortDescription": {"text": "Unused endpoint: POST /experiments/combine"}, "fullDescription": {"text": "`backend/api/routers/tasks.py` declares `POST /experiments/combine` 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-99eb2cc79a9ab7c5", "name": "Unused endpoint: GET /experiments/{experiment_id}/share", "shortDescription": {"text": "Unused endpoint: GET /experiments/{experiment_id}/share"}, "fullDescription": {"text": "`backend/api/routers/tasks.py` declares `GET /experiments/{experiment_id}/share` 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-74a7db6caaffd961", "name": "Unused endpoint: GET /experiments/{experiment_id}/probes", "shortDescription": {"text": "Unused endpoint: GET /experiments/{experiment_id}/probes"}, "fullDescription": {"text": "`backend/api/routers/tasks.py` declares `GET /experiments/{experiment_id}/probes` 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-375da1783d4d1692", "name": "Unused endpoint: GET /probes", "shortDescription": {"text": "Unused endpoint: GET /probes"}, "fullDescription": {"text": "`backend/api/routers/tasks.py` declares `GET /probes` 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-f093162615b3b04e", "name": "Unused endpoint: GET /tasks/{task_id}/detail", "shortDescription": {"text": "Unused endpoint: GET /tasks/{task_id}/detail"}, "fullDescription": {"text": "`backend/api/routers/tasks.py` declares `GET /tasks/{task_id}/detail` 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-f21b3f2c68ab5775", "name": "Unused endpoint: GET /tasks/{task_id}/versions", "shortDescription": {"text": "Unused endpoint: GET /tasks/{task_id}/versions"}, "fullDescription": {"text": "`backend/api/routers/tasks.py` declares `GET /tasks/{task_id}/versions` 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-a2c71244069daa76", "name": "Unused endpoint: GET /tasks/{task_id}/versions/{version}", "shortDescription": {"text": "Unused endpoint: GET /tasks/{task_id}/versions/{version}"}, "fullDescription": {"text": "`backend/api/routers/tasks.py` declares `GET /tasks/{task_id}/versions/{version}` 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-688c2c286ca9b8bd", "name": "Unused endpoint: GET /tasks/{task_id}/files", "shortDescription": {"text": "Unused endpoint: GET /tasks/{task_id}/files"}, "fullDescription": {"text": "`backend/api/routers/tasks.py` declares `GET /tasks/{task_id}/files` 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-d0cd444b531f5f3b", "name": "Unused endpoint: GET /tasks/{task_id}/files/{file_path:path}", "shortDescription": {"text": "Unused endpoint: GET /tasks/{task_id}/files/{file_path:path}"}, "fullDescription": {"text": "`backend/api/routers/tasks.py` declares `GET /tasks/{task_id}/files/{file_path:path}` 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-ebf6744d53d9d555", "name": "Unused endpoint: GET /slots", "shortDescription": {"text": "Unused endpoint: GET /slots"}, "fullDescription": {"text": "`backend/api/routers/admin.py` declares `GET /slots` 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-d64cbc39e926a40f", "name": "Unused endpoint: GET /queue-status", "shortDescription": {"text": "Unused endpoint: GET /queue-status"}, "fullDescription": {"text": "`backend/api/routers/admin.py` declares `GET /queue-status` 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-2521d72e3bb08df4", "name": "Unused endpoint: GET /orphaned-state", "shortDescription": {"text": "Unused endpoint: GET /orphaned-state"}, "fullDescription": {"text": "`backend/api/routers/admin.py` declares `GET /orphaned-state` 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-8510bf10858f2a4f", "name": "Unused endpoint: GET /queue-health", "shortDescription": {"text": "Unused endpoint: GET /queue-health"}, "fullDescription": {"text": "`backend/api/routers/admin.py` declares `GET /queue-health` 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-6ce5f3cbd81224a0", "name": "Unused endpoint: GET /worker-jobs", "shortDescription": {"text": "Unused endpoint: GET /worker-jobs"}, "fullDescription": {"text": "`backend/api/routers/admin.py` declares `GET /worker-jobs` 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-20d0d7ae629de5ba", "name": "Unused endpoint: POST /tasks/expand-backfill", "shortDescription": {"text": "Unused endpoint: POST /tasks/expand-backfill"}, "fullDescription": {"text": "`backend/api/routers/admin.py` declares `POST /tasks/expand-backfill` 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-a9ea2b2f13dd64c2", "name": "Unused endpoint: POST /clerk", "shortDescription": {"text": "Unused endpoint: POST /clerk"}, "fullDescription": {"text": "`backend/api/routers/clerk_webhooks.py` declares `POST /clerk` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-15946599dc588e37", "name": "Unused endpoint: POST /chat-sessions", "shortDescription": {"text": "Unused endpoint: POST /chat-sessions"}, "fullDescription": {"text": "`backend/api/routers/cc_chat.py` declares `POST /chat-sessions` 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-12f63219b62a284f", "name": "Unused endpoint: GET /chat-sessions/{session_id}", "shortDescription": {"text": "Unused endpoint: GET /chat-sessions/{session_id}"}, "fullDescription": {"text": "`backend/api/routers/cc_chat.py` declares `GET /chat-sessions/{session_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e5223ed0bcf5b663", "name": "Unused endpoint: GET /chat-sessions/{session_id}/events", "shortDescription": {"text": "Unused endpoint: GET /chat-sessions/{session_id}/events"}, "fullDescription": {"text": "`backend/api/routers/cc_chat.py` declares `GET /chat-sessions/{session_id}/events` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c14a21c82a676417", "name": "Unused endpoint: POST /chat-sessions/{session_id}/messages", "shortDescription": {"text": "Unused endpoint: POST /chat-sessions/{session_id}/messages"}, "fullDescription": {"text": "`backend/api/routers/cc_chat.py` declares `POST /chat-sessions/{session_id}/messages` 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-6f67e3a5e9ad346d", "name": "Unused endpoint: DELETE /chat-sessions/{session_id}", "shortDescription": {"text": "Unused endpoint: DELETE /chat-sessions/{session_id}"}, "fullDescription": {"text": "`backend/api/routers/cc_chat.py` declares `DELETE /chat-sessions/{session_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-660ae197d6b79be9", "name": "Unused endpoint: GET /skills/{skill_id}", "shortDescription": {"text": "Unused endpoint: GET /skills/{skill_id}"}, "fullDescription": {"text": "`backend/api/routers/skills.py` declares `GET /skills/{skill_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ce7fe565b4caff57", "name": "Unused endpoint: POST /skills", "shortDescription": {"text": "Unused endpoint: POST /skills"}, "fullDescription": {"text": "`backend/api/routers/skills.py` declares `POST /skills` 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-94a9f7efac4a83e3", "name": "Unused endpoint: PUT /skills/{skill_id}", "shortDescription": {"text": "Unused endpoint: PUT /skills/{skill_id}"}, "fullDescription": {"text": "`backend/api/routers/skills.py` declares `PUT /skills/{skill_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-33a13e77633847b4", "name": "Unused endpoint: GET /org", "shortDescription": {"text": "Unused endpoint: GET /org"}, "fullDescription": {"text": "`backend/api/routers/orgs.py` declares `GET /org` 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-841e50bf821e4158", "name": "Unused endpoint: GET /users", "shortDescription": {"text": "Unused endpoint: GET /users"}, "fullDescription": {"text": "`backend/api/routers/orgs.py` declares `GET /users` 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-1bca8100a44f7f25", "name": "Unused endpoint: POST /users", "shortDescription": {"text": "Unused endpoint: POST /users"}, "fullDescription": {"text": "`backend/api/routers/orgs.py` declares `POST /users` 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-fecd99fa2d3d6078", "name": "Unused endpoint: DELETE /users/{user_id}", "shortDescription": {"text": "Unused endpoint: DELETE /users/{user_id}"}, "fullDescription": {"text": "`backend/api/routers/orgs.py` declares `DELETE /users/{user_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d504b80adc9409ec", "name": "Unused endpoint: GET /dashboard", "shortDescription": {"text": "Unused endpoint: GET /dashboard"}, "fullDescription": {"text": "`backend/api/routers/dashboard.py` declares `GET /dashboard` 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-98e42ebeefe31d47", "name": "Unused endpoint: POST /imports/zip/inspect", "shortDescription": {"text": "Unused endpoint: POST /imports/zip/inspect"}, "fullDescription": {"text": "`backend/api/routers/imports.py` declares `POST /imports/zip/inspect` 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-51fd6f6dae2ec709", "name": "Unused endpoint: POST /tasks/{task_id}/refresh", "shortDescription": {"text": "Unused endpoint: POST /tasks/{task_id}/refresh"}, "fullDescription": {"text": "`backend/api/routers/github_webhooks.py` declares `POST /tasks/{task_id}/refresh` 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-72c74bca5b492f29", "name": "Unused endpoint: POST /experiments/{experiment_id}/refresh", "shortDescription": {"text": "Unused endpoint: POST /experiments/{experiment_id}/refresh"}, "fullDescription": {"text": "`backend/api/routers/github_webhooks.py` declares `POST /experiments/{experiment_id}/refresh` 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-9d730b79f283293f", "name": "Unused endpoint: GET /tags", "shortDescription": {"text": "Unused endpoint: GET /tags"}, "fullDescription": {"text": "`backend/api/routers/tags.py` declares `GET /tags` 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-3009ba7831526f2d", "name": "Unused endpoint: GET /tags/for-target", "shortDescription": {"text": "Unused endpoint: GET /tags/for-target"}, "fullDescription": {"text": "`backend/api/routers/tags.py` declares `GET /tags/for-target` 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-e0b062927b917ff4", "name": "Unused endpoint: GET /tags/{tag_id}", "shortDescription": {"text": "Unused endpoint: GET /tags/{tag_id}"}, "fullDescription": {"text": "`backend/api/routers/tags.py` declares `GET /tags/{tag_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5a3d7c32dac93122", "name": "Unused endpoint: POST /tags/{tag_id}/archive", "shortDescription": {"text": "Unused endpoint: POST /tags/{tag_id}/archive"}, "fullDescription": {"text": "`backend/api/routers/tags.py` declares `POST /tags/{tag_id}/archive` 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-b927fd6c42e2dd7c", "name": "Unused endpoint: POST /tags/{tag_id}/merge", "shortDescription": {"text": "Unused endpoint: POST /tags/{tag_id}/merge"}, "fullDescription": {"text": "`backend/api/routers/tags.py` declares `POST /tags/{tag_id}/merge` 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-7736602c033e1a46", "name": "Unused endpoint: POST /tags/{tag_id}/visibility", "shortDescription": {"text": "Unused endpoint: POST /tags/{tag_id}/visibility"}, "fullDescription": {"text": "`backend/api/routers/tags.py` declares `POST /tags/{tag_id}/visibility` 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-2f48db124f36ef96", "name": "Unused endpoint: POST /tags/exclude", "shortDescription": {"text": "Unused endpoint: POST /tags/exclude"}, "fullDescription": {"text": "`backend/api/routers/tags.py` declares `POST /tags/exclude` 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-206de3cd6daad43d", "name": "Unused endpoint: POST /tags/unexclude", "shortDescription": {"text": "Unused endpoint: POST /tags/unexclude"}, "fullDescription": {"text": "`backend/api/routers/tags.py` declares `POST /tags/unexclude` 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-a3c7e44eb18931e5", "name": "Unused endpoint: GET /tags/{tag_id}/grants", "shortDescription": {"text": "Unused endpoint: GET /tags/{tag_id}/grants"}, "fullDescription": {"text": "`backend/api/routers/tags.py` declares `GET /tags/{tag_id}/grants` 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-14a5075d1667aea8", "name": "Unused endpoint: POST /tags/{tag_id}/grants", "shortDescription": {"text": "Unused endpoint: POST /tags/{tag_id}/grants"}, "fullDescription": {"text": "`backend/api/routers/tags.py` declares `POST /tags/{tag_id}/grants` 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-ad94ea7c52a0698e", "name": "Unused endpoint: DELETE /tags/{tag_id}/grants/{grant_id}", "shortDescription": {"text": "Unused endpoint: DELETE /tags/{tag_id}/grants/{grant_id}"}, "fullDescription": {"text": "`backend/api/routers/tags.py` declares `DELETE /tags/{tag_id}/grants/{grant_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6e836f332f1875eb", "name": "Unused endpoint: GET /tag-policy", "shortDescription": {"text": "Unused endpoint: GET /tag-policy"}, "fullDescription": {"text": "`backend/api/routers/tags.py` declares `GET /tag-policy` 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-51d307124ad9fa87", "name": "Unused endpoint: GET /tag-policy/profanity-reports", "shortDescription": {"text": "Unused endpoint: GET /tag-policy/profanity-reports"}, "fullDescription": {"text": "`backend/api/routers/tags.py` declares `GET /tag-policy/profanity-reports` 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/23874"}, "properties": {"repository": "abundant-ai/oddish", "repoUrl": "https://github.com/abundant-ai/oddish", "branch": "main"}, "results": [{"ruleId": "scanner-09db0ce51b8c5ecf", "level": "note", "message": {"text": "Possibly dead Python function: notify_github_trial"}, "properties": {"repobilityId": "aff927d49d2af91d", "scanner": "scanner-primary", "fingerprint": "09db0ce51b8c5ecf", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/worker/github.py:4"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3d5d90ea5362edbc", "level": "note", "message": {"text": "Possibly dead Python function: notify_github_analysis"}, "properties": {"repobilityId": "bc7fbd977f4fa2ea", "scanner": "scanner-primary", "fingerprint": "3d5d90ea5362edbc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/worker/github.py:14"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9665c726b765176b", "level": "note", "message": {"text": "Possibly dead Python function: notify_github_qa"}, "properties": {"repobilityId": "6b8ecc71645f65e4", "scanner": "scanner-primary", "fingerprint": "9665c726b765176b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/worker/github.py:28"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a16e21af862d789a", "level": "note", "message": {"text": "Possibly dead Python function: export_skills"}, "properties": {"repobilityId": "8f39eb71dfd01ddd", "scanner": "scanner-primary", "fingerprint": "a16e21af862d789a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/services/cc_chat/orchestrator.py:239"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c0d16b087ff0a80d", "level": "note", "message": {"text": "Possibly dead Python function: run_reaper_loop"}, "properties": {"repobilityId": "c1be4102cab7b5b4", "scanner": "scanner-primary", "fingerprint": "c0d16b087ff0a80d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/services/cc_chat/idle_reaper.py:57"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-52552492c9f3c59b", "level": "note", "message": {"text": "Possibly dead Python function: run_once"}, "properties": {"repobilityId": "697a8f279dd38dce", "scanner": "scanner-primary", "fingerprint": "52552492c9f3c59b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/services/cc_chat/claude_code_runtime.py:61"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4a90a641e2057853", "level": "note", "message": {"text": "Possibly dead Python function: do_run_migrations"}, "properties": {"repobilityId": "087acb17722cfd2f", "scanner": "scanner-primary", "fingerprint": "4a90a641e2057853", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/env.py:85"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-33d4b163c3573fdf", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "33d4b163c3573fdf", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/j6k7l8m9n0p1_drop_experiment_name_uniqueness.py:27"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1d7aed4f1621c0d8", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "1d7aed4f1621c0d8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/a1b2c3d4e5f6_add_cloud_auth_tables.py:213"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-99e2a5473fb0dc15", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "99e2a5473fb0dc15", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/m9n0p1q2r3s4_add_user_attribution_cache.py:23"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e3b97517a121421f", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "e3b97517a121421f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/n0p1q2r3s4t5_add_tag_cloud_fks.py:126"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-396b4e3d2351d77e", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "396b4e3d2351d77e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/c4d5e6f7a8b9_add_clerk_user_id.py:32"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b9fa1a1380ed41d8", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "b9fa1a1380ed41d8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/d1e2f3a4b5c6_add_clerk_org_id.py:34"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-70fe1066696a0b7c", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "70fe1066696a0b7c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/p2q3r4s5t6u7_add_chat_tables.py:80"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0ad824ec516bcd64", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "0ad824ec516bcd64", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/h4i5j6k7l8m9_drop_unique_clerk_user_id.py:29"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c3bf80e7950f2166", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "c3bf80e7950f2166", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/k7l8m9n0p1q2_add_queue_slots_table.py:22"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e7908e7b8fb49e1c", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "e7908e7b8fb49e1c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/e2f3a4b5c6d7_add_queue_stats_index.py:111"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6d1047d03b63a835", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "6d1047d03b63a835", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/i5j6k7l8m9n0_add_provider_slots_table.py:43"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3589d61a112e7927", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/share/[token]/page.tsx:82"}, "properties": {"repobilityId": "90ad7f357a93c3aa", "scanner": "scanner-primary", "fingerprint": "3589d61a112e7927", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d830e6d3689b41bc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/(app)/experiments/[experiment]/experiment-client.tsx:480"}, "properties": {"repobilityId": "ae3bf15617b056ed", "scanner": "scanner-primary", "fingerprint": "d830e6d3689b41bc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9316d2007fcc19d3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/(app)/dashboard/dashboard-client.tsx:1332"}, "properties": {"repobilityId": "e2be7667eefe094f", "scanner": "scanner-primary", "fingerprint": "9316d2007fcc19d3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-357fbc21f25028f1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/(app)/settings/page.tsx:747"}, "properties": {"repobilityId": "2b243143da32fc51", "scanner": "scanner-primary", "fingerprint": "357fbc21f25028f1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f64179547ec2cdd2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/(app)/tasks/tasks-client.tsx:313"}, "properties": {"repobilityId": "31c8f1eda1a83498", "scanner": "scanner-primary", "fingerprint": "f64179547ec2cdd2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bfe2a1e9c66b8dcf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/(app)/tasks/[task_id]/task-detail-client.tsx:223"}, "properties": {"repobilityId": "0c1eb5c714e1d2f4", "scanner": "scanner-primary", "fingerprint": "bfe2a1e9c66b8dcf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-40fedce749dda9db", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/worker-jobs-card.tsx:327"}, "properties": {"repobilityId": "1875d0b306fc3424", "scanner": "scanner-primary", "fingerprint": "40fedce749dda9db", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ff9e95e4bcd6e5af", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/artifacts-viewer.tsx:307"}, "properties": {"repobilityId": "8b230068580b4231", "scanner": "scanner-primary", "fingerprint": "ff9e95e4bcd6e5af", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-27864831d8a849ef", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/experiment-trials-table.tsx:2111"}, "properties": {"repobilityId": "767c77b84981e97e", "scanner": "scanner-primary", "fingerprint": "27864831d8a849ef", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1a2e105107613a31", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/preview-banner.tsx:22"}, "properties": {"repobilityId": "f9af251bd0c50a5d", "scanner": "scanner-primary", "fingerprint": "1a2e105107613a31", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9745d94481e73a01", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/dataset-detail-view.tsx:255"}, "properties": {"repobilityId": "e72328e7c0cc485b", "scanner": "scanner-primary", "fingerprint": "9745d94481e73a01", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e0589252e8298689", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/code-block.tsx:171"}, "properties": {"repobilityId": "3473a57c374c4d78", "scanner": "scanner-primary", "fingerprint": "e0589252e8298689", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1e19ccf46ae7b66e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/pass-at-one-leaderboard.tsx:148"}, "properties": {"repobilityId": "086c666020ce0d32", "scanner": "scanner-primary", "fingerprint": "1e19ccf46ae7b66e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e5aa2adc5bef15db", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/saved-filters-menu.tsx:206"}, "properties": {"repobilityId": "a8cbd37e572850b7", "scanner": "scanner-primary", "fingerprint": "e5aa2adc5bef15db", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4a67a32d7e20a5d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/task-files-panel.tsx:962"}, "properties": {"repobilityId": "944d2f1d9790bf2b", "scanner": "scanner-primary", "fingerprint": "d4a67a32d7e20a5d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-91e4d10f5a78803e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/experiment-detail-view.tsx:379"}, "properties": {"repobilityId": "fb69391ce43be3fc", "scanner": "scanner-primary", "fingerprint": "91e4d10f5a78803e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-958fa300f583a269", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/task-probe-run-card.tsx:174"}, "properties": {"repobilityId": "b7785ba0eb4e84d2", "scanner": "scanner-primary", "fingerprint": "958fa300f583a269", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9b76ba0f66369102", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/trajectory-viewer.tsx:530"}, "properties": {"repobilityId": "55f0b6243991ffbc", "scanner": "scanner-primary", "fingerprint": "9b76ba0f66369102", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-69a4d12c0db842a0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/trial-detail-panel.tsx:474"}, "properties": {"repobilityId": "229511673694fc18", "scanner": "scanner-primary", "fingerprint": "69a4d12c0db842a0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-209dc7e4897dff60", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/renderers/csv-renderer.tsx:118"}, "properties": {"repobilityId": "2c2144901dbf0c13", "scanner": "scanner-primary", "fingerprint": "209dc7e4897dff60", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ac9aef4a21ee62ac", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/renderers/docx-renderer.tsx:166"}, "properties": {"repobilityId": "4a3d999230dca512", "scanner": "scanner-primary", "fingerprint": "ac9aef4a21ee62ac", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-23ed071915bdcfe2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/renderers/xlsx-renderer.tsx:140"}, "properties": {"repobilityId": "920d3d75383b7aeb", "scanner": "scanner-primary", "fingerprint": "23ed071915bdcfe2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1f66ad88286ca30a", "level": "warning", "message": {"text": "Dockerfile runs as root: backend/Dockerfile"}, "properties": {"repobilityId": "7afd2b0e8a8c9eeb", "scanner": "scanner-primary", "fingerprint": "1f66ad88286ca30a", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-a1de5ed0cd57d4e5", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.13-slim-bookworm"}, "properties": {"repobilityId": "56cab9df01ecb6a2", "scanner": "scanner-primary", "fingerprint": "a1de5ed0cd57d4e5", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-faa134129e5545ff", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "9b1c3165a771342a", "scanner": "scanner-primary", "fingerprint": "faa134129e5545ff", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-40e37292dd0495c4", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/code-block.tsx:171"}, "properties": {"repobilityId": "d1bf95393562d5d8", "scanner": "scanner-primary", "fingerprint": "40e37292dd0495c4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/code-block.tsx"}, "region": {"startLine": 171}}}]}, {"ruleId": "scanner-d0144b58fe57a146", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/renderers/docx-renderer.tsx:166"}, "properties": {"repobilityId": "efafed981e143d9b", "scanner": "scanner-primary", "fingerprint": "d0144b58fe57a146", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/renderers/docx-renderer.tsx"}, "region": {"startLine": 166}}}]}, {"ruleId": "scanner-bee8f830415ebe5d", "level": "warning", "message": {"text": "Insecure pattern 'domparser_html_parse' in frontend/src/components/renderers/docx-renderer.tsx:57"}, "properties": {"repobilityId": "e248da54b2b3a4be", "scanner": "scanner-primary", "fingerprint": "bee8f830415ebe5d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "domparser_html_parse"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/renderers/docx-renderer.tsx"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-ae84ceeaa5d9b3a3", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in oddish/src/oddish/server/__init__.py:224"}, "properties": {"repobilityId": "7081aa520f5bf2a0", "scanner": "scanner-primary", "fingerprint": "ae84ceeaa5d9b3a3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "oddish/src/oddish/server/__init__.py"}, "region": {"startLine": 224}}}]}, {"ruleId": "scanner-d2acfd945a26070a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "41321efe8504be6b", "scanner": "scanner-primary", "fingerprint": "d2acfd945a26070a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/modal-deploy.yml"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-ad92685d63517eaa", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d1256a1c67d79692", "scanner": "scanner-primary", "fingerprint": "ad92685d63517eaa", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/supabase-db-migrations.yml"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-76c64d601e1994a8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "aea3ee2e71defdab", "scanner": "scanner-primary", "fingerprint": "76c64d601e1994a8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pr-preview.yml"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-76c64d601e1994a8", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "96475267c189e806", "scanner": "scanner-primary", "fingerprint": "76c64d601e1994a8", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pr-preview.yml"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-76c64d601e1994a8", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "96475267c189e806", "scanner": "scanner-primary", "fingerprint": "76c64d601e1994a8", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pr-preview.yml"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-76c64d601e1994a8", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "96475267c189e806", "scanner": "scanner-primary", "fingerprint": "76c64d601e1994a8", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pr-preview.yml"}, "region": {"startLine": 77}}}]}, {"ruleId": "scanner-76c64d601e1994a8", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "96475267c189e806", "scanner": "scanner-primary", "fingerprint": "76c64d601e1994a8", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pr-preview.yml"}, "region": {"startLine": 98}}}]}, {"ruleId": "scanner-76c64d601e1994a8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "aea3ee2e71defdab", "scanner": "scanner-primary", "fingerprint": "76c64d601e1994a8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pr-preview.yml"}, "region": {"startLine": 141}}}]}, {"ruleId": "scanner-76c64d601e1994a8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "aea3ee2e71defdab", "scanner": "scanner-primary", "fingerprint": "76c64d601e1994a8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pr-preview.yml"}, "region": {"startLine": 193}}}]}, {"ruleId": "scanner-76c64d601e1994a8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "aea3ee2e71defdab", "scanner": "scanner-primary", "fingerprint": "76c64d601e1994a8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pr-preview.yml"}, "region": {"startLine": 247}}}]}, {"ruleId": "scanner-76c64d601e1994a8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "aea3ee2e71defdab", "scanner": "scanner-primary", "fingerprint": "76c64d601e1994a8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pr-preview.yml"}, "region": {"startLine": 302}}}]}, {"ruleId": "scanner-76c64d601e1994a8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "aea3ee2e71defdab", "scanner": "scanner-primary", "fingerprint": "76c64d601e1994a8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pr-preview.yml"}, "region": {"startLine": 340}}}]}, {"ruleId": "scanner-76c64d601e1994a8", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "aea3ee2e71defdab", "scanner": "scanner-primary", "fingerprint": "76c64d601e1994a8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/pr-preview.yml"}, "region": {"startLine": 372}}}]}, {"ruleId": "scanner-0503686c5b4ed857", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2dbb3f1c5a32200b", "scanner": "scanner-primary", "fingerprint": "0503686c5b4ed857", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/daily-changelog.yml"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-0503686c5b4ed857", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "034899beb994bbeb", "scanner": "scanner-primary", "fingerprint": "0503686c5b4ed857", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/daily-changelog.yml"}, "region": {"startLine": 113}}}]}, {"ruleId": "scanner-2f636b6fcc434322", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "09fd22925fbd84d2", "scanner": "scanner-primary", "fingerprint": "2f636b6fcc434322", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/daily-changelog.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-91c918149077140f", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ee3379417fc6db28", "scanner": "scanner-primary", "fingerprint": "91c918149077140f", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci-base-image.yml"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-91c918149077140f", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "30fe25c07cf0f71c", "scanner": "scanner-primary", "fingerprint": "91c918149077140f", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci-base-image.yml"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-91c918149077140f", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "afc3d7aca17bbb5b", "scanner": "scanner-primary", "fingerprint": "91c918149077140f", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci-base-image.yml"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-91c918149077140f", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "5771b70e56943ff0", "scanner": "scanner-primary", "fingerprint": "91c918149077140f", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci-base-image.yml"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-076f6dab08aedb18", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "7beb863e77e38291", "scanner": "scanner-primary", "fingerprint": "076f6dab08aedb18", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci-base-image.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-43e0a2695dd8336d", "level": "note", "message": {"text": "Very large file: frontend/src/app/(app)/dashboard/dashboard-client.tsx (1811 lines)"}, "properties": {"repobilityId": "2ff78f1a4816e8c5", "scanner": "scanner-primary", "fingerprint": "43e0a2695dd8336d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d286050edf40a0d9", "level": "note", "message": {"text": "Very large file: frontend/src/components/experiment-trials-table.tsx (2545 lines)"}, "properties": {"repobilityId": "c8c1a0ccb9b955a2", "scanner": "scanner-primary", "fingerprint": "d286050edf40a0d9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3d4767c4fcc04598", "level": "note", "message": {"text": "Very large file: oddish/src/oddish/config.py (1254 lines)"}, "properties": {"repobilityId": "b87b883414edfe19", "scanner": "scanner-primary", "fingerprint": "3d4767c4fcc04598", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7c2cac551693eb25", "level": "note", "message": {"text": "Very large file: oddish/src/oddish/workers/harbor_runner.py (1374 lines)"}, "properties": {"repobilityId": "43e1b32ccfa37390", "scanner": "scanner-primary", "fingerprint": "7c2cac551693eb25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-794f61df46a5f2bc", "level": "note", "message": {"text": "Very large file: oddish/src/oddish/db/models.py (1662 lines)"}, "properties": {"repobilityId": "0ca410c9cef76b3d", "scanner": "scanner-primary", "fingerprint": "794f61df46a5f2bc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-dde84156f4314431", "level": "note", "message": {"text": "Very large file: oddish/src/oddish/db/storage.py (1600 lines)"}, "properties": {"repobilityId": "9a8e18d43d82117f", "scanner": "scanner-primary", "fingerprint": "dde84156f4314431", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-386bc7120b104adb", "level": "note", "message": {"text": "Very large file: oddish/src/oddish/core/dashboard.py (1571 lines)"}, "properties": {"repobilityId": "8b4af7e37399f29a", "scanner": "scanner-primary", "fingerprint": "386bc7120b104adb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fb906d67bffe7f42", "level": "note", "message": {"text": "Very large file: oddish/src/oddish/core/endpoints.py (2613 lines)"}, "properties": {"repobilityId": "311e774fd69d55f7", "scanner": "scanner-primary", "fingerprint": "fb906d67bffe7f42", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-489d64aa33ad8760", "level": "note", "message": {"text": "Very large file: oddish/src/oddish/cli/api.py (1774 lines)"}, "properties": {"repobilityId": "67c22fb90c971797", "scanner": "scanner-primary", "fingerprint": "489d64aa33ad8760", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "0d7881fff5a54e8a", "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": "c3c21313ef056299", "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": "eedd0cff421aa71b", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-bea357a6497a2d5d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "properties": {"repobilityId": "aae72df3934829ac", "scanner": "scanner-primary", "fingerprint": "bea357a6497a2d5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cbb5857940ba0dc2", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: AGENTS.md"}, "properties": {"repobilityId": "e12c7213d5eadf3e", "scanner": "scanner-primary", "fingerprint": "cbb5857940ba0dc2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "agents_md"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "AGENTS.md"}, "region": {"startLine": 313}}}]}, {"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-31c91df33ddb9e19", "level": "none", "message": {"text": "Commented-code block (8 lines) in backend/modal_app.py:43"}, "properties": {"repobilityId": "b0af2d157731776a", "scanner": "scanner-primary", "fingerprint": "31c91df33ddb9e19", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9965b54685f5273b", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/models.py:333"}, "properties": {"repobilityId": "0e8667177a15b46b", "scanner": "scanner-primary", "fingerprint": "9965b54685f5273b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ff9b5553594fdd24", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/endpoints.py:10"}, "properties": {"repobilityId": "3a5832be22b3d2c6", "scanner": "scanner-primary", "fingerprint": "ff9b5553594fdd24", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e00cf05a269fcc0a", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/dashboard_owner_backfill.py:323"}, "properties": {"repobilityId": "2d11fe2cbc0d80e9", "scanner": "scanner-primary", "fingerprint": "e00cf05a269fcc0a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0bda2bef9a08a3ca", "level": "none", "message": {"text": "Commented-code block (8 lines) in backend/observability.py:122"}, "properties": {"repobilityId": "b7a7b7e8864809d4", "scanner": "scanner-primary", "fingerprint": "0bda2bef9a08a3ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c4b6dc5ba9d87f0f", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/preview_seed.py:67"}, "properties": {"repobilityId": "1e04efe8d70e9c89", "scanner": "scanner-primary", "fingerprint": "c4b6dc5ba9d87f0f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c49bff17b0dd7d1f", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/worker/functions.py:3"}, "properties": {"repobilityId": "487a4b2bf621d44a", "scanner": "scanner-primary", "fingerprint": "c49bff17b0dd7d1f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f6aa5e74d4d6b5c3", "level": "note", "message": {"text": "Legacy-named symbol `a_old` in backend/tests/test_org_probes_api.py:77"}, "properties": {"repobilityId": "de3c26f4d3b4fb96", "scanner": "scanner-primary", "fingerprint": "f6aa5e74d4d6b5c3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bbade7309befdb6d", "level": "none", "message": {"text": "Commented-code block (9 lines) in backend/api/services/cc_chat/claude_md.py:76"}, "properties": {"repobilityId": "4df49bfe28e1d8d7", "scanner": "scanner-primary", "fingerprint": "bbade7309befdb6d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b4386766fe919d9e", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 .github/scripts/preview/redeploy_vercel.py:58"}, "properties": {"repobilityId": "7db875f14d757945", "scanner": "scanner-primary", "fingerprint": "b4386766fe919d9e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-89dd84c4db32395d", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 .github/scripts/preview/bootstrap_preview_db.py:16"}, "properties": {"repobilityId": "5f013425fea12ce5", "scanner": "scanner-primary", "fingerprint": "89dd84c4db32395d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f298a939dc3c3c9b", "level": "none", "message": {"text": "Commented-code block (5 lines) in .github/scripts/preview/find_last_deploys.py:48"}, "properties": {"repobilityId": "f794c557478878e4", "scanner": "scanner-primary", "fingerprint": "f298a939dc3c3c9b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-97e96831e99592bd", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 .github/scripts/preview/find_last_deploys.py:38"}, "properties": {"repobilityId": "1b7919cd0dd6a91a", "scanner": "scanner-primary", "fingerprint": "97e96831e99592bd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-676b1c31b10d69cf", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/middleware.ts:5"}, "properties": {"repobilityId": "5ce2b68c52ada5a2", "scanner": "scanner-primary", "fingerprint": "676b1c31b10d69cf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-83d53f0d50cfd126", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/experiments/[experiment]/route.ts:43"}, "properties": {"repobilityId": "6736b599eb43ec16", "scanner": "scanner-primary", "fingerprint": "83d53f0d50cfd126", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3916233fec7dc9cd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/experiments/[experiment]/unpublish/route.ts:41"}, "properties": {"repobilityId": "8e452199eda6604c", "scanner": "scanner-primary", "fingerprint": "3916233fec7dc9cd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-de22657222b7c1ba", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/experiments/[experiment]/probes/route.ts:35"}, "properties": {"repobilityId": "7f6ff69916abedf0", "scanner": "scanner-primary", "fingerprint": "de22657222b7c1ba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b40b71dd85593861", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/experiments/[experiment]/share/route.ts:35"}, "properties": {"repobilityId": "466401e81b045154", "scanner": "scanner-primary", "fingerprint": "b40b71dd85593861", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bd6ab5236b0600aa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/experiments/[experiment]/publish/route.ts:41"}, "properties": {"repobilityId": "2141832e9d55b722", "scanner": "scanner-primary", "fingerprint": "bd6ab5236b0600aa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-222a56a7cc155d63", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/experiments/[experiment]/tasks/route.ts:72"}, "properties": {"repobilityId": "33ae6cd7fa9fdb8d", "scanner": "scanner-primary", "fingerprint": "222a56a7cc155d63", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1717d71a2302cb9c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tag-policy/route.ts:18"}, "properties": {"repobilityId": "64d767604d14d160", "scanner": "scanner-primary", "fingerprint": "1717d71a2302cb9c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3f0b191d907e94e9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/trials/[trial_id]/probe-artifacts/route.ts:20"}, "properties": {"repobilityId": "d25d1a68d417c5f9", "scanner": "scanner-primary", "fingerprint": "3f0b191d907e94e9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0d1422e17479716e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/trials/[trial_id]/trajectory/route.ts:20"}, "properties": {"repobilityId": "80c250215d690016", "scanner": "scanner-primary", "fingerprint": "0d1422e17479716e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b864cc94f5d63bf5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/trials/[trial_id]/retry/route.ts:25"}, "properties": {"repobilityId": "d20d480513512b47", "scanner": "scanner-primary", "fingerprint": "b864cc94f5d63bf5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7d273235ab29cbcf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/trials/[trial_id]/logs/route.ts:20"}, "properties": {"repobilityId": "faff0d093a23f0fe", "scanner": "scanner-primary", "fingerprint": "7d273235ab29cbcf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c617cd6a58acf5b4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/trials/[trial_id]/logs/structured/route.ts:20"}, "properties": {"repobilityId": "d2d0f04052340e29", "scanner": "scanner-primary", "fingerprint": "c617cd6a58acf5b4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7f35f4a2906d7345", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/trials/[trial_id]/result/route.ts:20"}, "properties": {"repobilityId": "60b60c3efe716faa", "scanner": "scanner-primary", "fingerprint": "7f35f4a2906d7345", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-36d135060e1c2ae1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/admin/worker-jobs/route.ts:36"}, "properties": {"repobilityId": "39a4e34db9893c69", "scanner": "scanner-primary", "fingerprint": "36d135060e1c2ae1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-619252b024789d58", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/admin/orphaned-state/route.ts:34"}, "properties": {"repobilityId": "be280fe74457c743", "scanner": "scanner-primary", "fingerprint": "619252b024789d58", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c2c2bba9509b48f2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/admin/slots/route.ts:29"}, "properties": {"repobilityId": "2dcf27455156a967", "scanner": "scanner-primary", "fingerprint": "c2c2bba9509b48f2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0e1ed854bc64e45f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/admin/queue-health/route.ts:29"}, "properties": {"repobilityId": "f18312a678671664", "scanner": "scanner-primary", "fingerprint": "0e1ed854bc64e45f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f53ee9ead0362ed4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/admin/queue-status/route.ts:29"}, "properties": {"repobilityId": "0ea0d3113f2ae871", "scanner": "scanner-primary", "fingerprint": "f53ee9ead0362ed4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-93b20e64fb68ad5d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/users/route.ts:28"}, "properties": {"repobilityId": "aa7d16c2fa8b85e3", "scanner": "scanner-primary", "fingerprint": "93b20e64fb68ad5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5db9452ca73cb461", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/probes/route.ts:18"}, "properties": {"repobilityId": "e0f991b136e21fdb", "scanner": "scanner-primary", "fingerprint": "5db9452ca73cb461", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-406491b5ac6e4f4a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tag-filters/route.ts:18"}, "properties": {"repobilityId": "9964bbcd8219341f", "scanner": "scanner-primary", "fingerprint": "406491b5ac6e4f4a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e9e8ff08c54f39ed", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tag-filters/[filter_id]/route.ts:26"}, "properties": {"repobilityId": "88cdc1952af56eb8", "scanner": "scanner-primary", "fingerprint": "e9e8ff08c54f39ed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d5b7c8c576af2a4d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/settings/api-keys/route.ts:19"}, "properties": {"repobilityId": "50b5b916e39e4cfa", "scanner": "scanner-primary", "fingerprint": "d5b7c8c576af2a4d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aa5fcfe86b2e6c9b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/settings/api-keys/[key_id]/route.ts:24"}, "properties": {"repobilityId": "40970c6afeacfee5", "scanner": "scanner-primary", "fingerprint": "aa5fcfe86b2e6c9b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6efafcc93c0768f7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tags/route.ts:18"}, "properties": {"repobilityId": "4fd6919c3688cf10", "scanner": "scanner-primary", "fingerprint": "6efafcc93c0768f7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9cd757d2e4e8a579", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tags/unassign/route.ts:19"}, "properties": {"repobilityId": "dfbc6fae287b1850", "scanner": "scanner-primary", "fingerprint": "9cd757d2e4e8a579", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ae7420e0acb33306", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tags/assign/route.ts:19"}, "properties": {"repobilityId": "4d7383ab41228b8e", "scanner": "scanner-primary", "fingerprint": "ae7420e0acb33306", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fe938da1dc7429e2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/route.ts:33"}, "properties": {"repobilityId": "7de5408e738770ad", "scanner": "scanner-primary", "fingerprint": "fe938da1dc7429e2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e851adebb94cd676", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/browse/route.ts:32"}, "properties": {"repobilityId": "a59e9708deaeb17a", "scanner": "scanner-primary", "fingerprint": "e851adebb94cd676", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-513bdcc6aa6a40a9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/cancel/route.ts:33"}, "properties": {"repobilityId": "008b96e65bb03e3f", "scanner": "scanner-primary", "fingerprint": "513bdcc6aa6a40a9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7ed5300225ac99b7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/sweep/route.ts:19"}, "properties": {"repobilityId": "4d49940443aee8ac", "scanner": "scanner-primary", "fingerprint": "7ed5300225ac99b7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0e9e652a39358541", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/[task_id]/route.ts:23"}, "properties": {"repobilityId": "52560cbedde7c7e5", "scanner": "scanner-primary", "fingerprint": "0e9e652a39358541", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f7bf1018da1bb8ab", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/[task_id]/trials/route.ts:22"}, "properties": {"repobilityId": "293df0ce6dd061a7", "scanner": "scanner-primary", "fingerprint": "f7bf1018da1bb8ab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dde52c16f96b24a0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/[task_id]/trials/[index]/route.ts:20"}, "properties": {"repobilityId": "6df0ac0b61a5f925", "scanner": "scanner-primary", "fingerprint": "dde52c16f96b24a0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e0326291e77ada77", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/[task_id]/qa/cancel/route.ts:25"}, "properties": {"repobilityId": "0cdd54289e75e383", "scanner": "scanner-primary", "fingerprint": "e0326291e77ada77", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-21b00b093bc9e993", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/[task_id]/qa/retry/route.ts:25"}, "properties": {"repobilityId": "298c43d8f963fac7", "scanner": "scanner-primary", "fingerprint": "21b00b093bc9e993", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a39dce632479e464", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/tasks/[task_id]/versions/route.ts:19"}, "properties": {"repobilityId": "d704027f5b9dc768", "scanner": "scanner-primary", "fingerprint": "a39dce632479e464", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d12e1930eb1ae8d1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/skills/route.ts:81"}, "properties": {"repobilityId": "2847921b903ba193", "scanner": "scanner-primary", "fingerprint": "d12e1930eb1ae8d1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1719c97615831db2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/skills/[id]/route.ts:32"}, "properties": {"repobilityId": "26323034f411ab0d", "scanner": "scanner-primary", "fingerprint": "1719c97615831db2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c9ce4d83cc562d96", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/documents/route.ts:81"}, "properties": {"repobilityId": "2f655f7421920ab6", "scanner": "scanner-primary", "fingerprint": "c9ce4d83cc562d96", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-74661e608697e2cd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/documents/[id]/route.ts:32"}, "properties": {"repobilityId": "ac14c4a095f180e9", "scanner": "scanner-primary", "fingerprint": "74661e608697e2cd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-04e3bb3707e0345c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/probe-presets/route.ts:18"}, "properties": {"repobilityId": "2c0af5b4e7a7fe05", "scanner": "scanner-primary", "fingerprint": "04e3bb3707e0345c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b5e7d389b28bc080", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/probe-presets/[preset_id]/route.ts:26"}, "properties": {"repobilityId": "659e25400bcc5a09", "scanner": "scanner-primary", "fingerprint": "b5e7d389b28bc080", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-46bd5382ed915814", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/public/experiments/[token]/tasks/route.ts:15"}, "properties": {"repobilityId": "32d46665b9d16ed2", "scanner": "scanner-primary", "fingerprint": "46bd5382ed915814", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2e64ed25b0286975", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/public/tasks/[task_id]/files/route.ts:15"}, "properties": {"repobilityId": "6c4e1b2407b5b5d1", "scanner": "scanner-primary", "fingerprint": "2e64ed25b0286975", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2b5b752d2f5552c0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/(app)/experiments/[experiment]/page.tsx:64"}, "properties": {"repobilityId": "150347df934275b3", "scanner": "scanner-primary", "fingerprint": "2b5b752d2f5552c0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c44a2b4c5cb2b1e9", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/app/(app)/experiments/[experiment]/experiment-client.tsx:295"}, "properties": {"repobilityId": "df8aace4ba83097e", "scanner": "scanner-primary", "fingerprint": "c44a2b4c5cb2b1e9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a9055100f45dc6af", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/(app)/tasks/page.tsx:26"}, "properties": {"repobilityId": "a70912447b8d557a", "scanner": "scanner-primary", "fingerprint": "a9055100f45dc6af", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-92ecee80726ccb50", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/(app)/tasks/[task_id]/page.tsx:21"}, "properties": {"repobilityId": "b77c4a4f92dff477", "scanner": "scanner-primary", "fingerprint": "92ecee80726ccb50", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1586086421feef1c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/(app)/tasks/[task_id]/probe/[trial_id]/page.tsx:62"}, "properties": {"repobilityId": "1a1fdf86b863909f", "scanner": "scanner-primary", "fingerprint": "1586086421feef1c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-97e8480e3ab26aa0", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/artifacts-viewer.tsx:64"}, "properties": {"repobilityId": "a0431bcdb073a55a", "scanner": "scanner-primary", "fingerprint": "97e8480e3ab26aa0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e521850fc0ab80e7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/artifacts-viewer.tsx:459"}, "properties": {"repobilityId": "8c25660d4f4fb60f", "scanner": "scanner-primary", "fingerprint": "e521850fc0ab80e7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-804e75a307f51957", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/tag-editor.tsx:70"}, "properties": {"repobilityId": "4e06145ea0deaf2c", "scanner": "scanner-primary", "fingerprint": "804e75a307f51957", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5c66e85aa3cd1fef", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/tag-chip-editor.tsx:111"}, "properties": {"repobilityId": "3fdc1b28f68dac87", "scanner": "scanner-primary", "fingerprint": "5c66e85aa3cd1fef", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c1f97611df4213c5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/tag-chip-editor.tsx:78"}, "properties": {"repobilityId": "3bbd89909629ffa4", "scanner": "scanner-primary", "fingerprint": "c1f97611df4213c5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c0f9bef42b17fe73", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/saved-filters-menu.tsx:152"}, "properties": {"repobilityId": "d9dd8a5e55547328", "scanner": "scanner-primary", "fingerprint": "c0f9bef42b17fe73", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ccadf2396364f463", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/saved-filters-menu.tsx:116"}, "properties": {"repobilityId": "7ecacd345b1a3e87", "scanner": "scanner-primary", "fingerprint": "ccadf2396364f463", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5829c609c3afd4d8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/probe-history-table.tsx:272"}, "properties": {"repobilityId": "bf2e934364a2a429", "scanner": "scanner-primary", "fingerprint": "5829c609c3afd4d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-06a9ede05ab0f132", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/task-files-panel.tsx:687"}, "properties": {"repobilityId": "f9afc0e21737f4cc", "scanner": "scanner-primary", "fingerprint": "06a9ede05ab0f132", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-961629d9a36fa7d2", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/experiment-detail-view.tsx:1013"}, "properties": {"repobilityId": "b5438987670b3c2a", "scanner": "scanner-primary", "fingerprint": "961629d9a36fa7d2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-66dce02c24ccbfb9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/task-probe-run-card.tsx:108"}, "properties": {"repobilityId": "329794b3752bf65e", "scanner": "scanner-primary", "fingerprint": "66dce02c24ccbfb9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5a2be8f3f7881346", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/trial-detail-panel.tsx:145"}, "properties": {"repobilityId": "a1f94076c4b858c8", "scanner": "scanner-primary", "fingerprint": "5a2be8f3f7881346", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8797ee4dc530f8aa", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/lib/utils.ts:78"}, "properties": {"repobilityId": "8d165e7626cf13db", "scanner": "scanner-primary", "fingerprint": "8797ee4dc530f8aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ab324f18cf03759e", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/lib/status-config.ts:276"}, "properties": {"repobilityId": "3f32e9bcb17569ed", "scanner": "scanner-primary", "fingerprint": "ab324f18cf03759e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3192f4e09121f5bd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/observability.ts:110"}, "properties": {"repobilityId": "f194f84b60d91ec4", "scanner": "scanner-primary", "fingerprint": "3192f4e09121f5bd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-afeeb5a1f697f11d", "level": "none", "message": {"text": "Commented-code block (5 lines) in oddish/tests/test_task_deletion.py:85"}, "properties": {"repobilityId": "df62f56df6724875", "scanner": "scanner-primary", "fingerprint": "afeeb5a1f697f11d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f8c9307a1e432781", "level": "note", "message": {"text": "Legacy-named symbol `test_combine_shared_artifacts_skips_s3_copy` in oddish/tests/test_experiment_combine.py:203"}, "properties": {"repobilityId": "9fb85938c2d9b295", "scanner": "scanner-primary", "fingerprint": "f8c9307a1e432781", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ff44286cea70e539", "level": "none", "message": {"text": "Commented-code block (5 lines) in oddish/tests/test_worker_job_dispatcher.py:180"}, "properties": {"repobilityId": "420ba3cd78275024", "scanner": "scanner-primary", "fingerprint": "ff44286cea70e539", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-15e4bae743c430cc", "level": "none", "message": {"text": "Commented-code block (6 lines) in oddish/tests/test_tags_migration_sanity.py:217"}, "properties": {"repobilityId": "feeead831d84ab8f", "scanner": "scanner-primary", "fingerprint": "15e4bae743c430cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-04c7ab3ee3f8c58f", "level": "none", "message": {"text": "Commented-code block (6 lines) in oddish/tests/test_subscription_routing.py:254"}, "properties": {"repobilityId": "7ee6b37f11503a19", "scanner": "scanner-primary", "fingerprint": "04c7ab3ee3f8c58f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-56cf43c70de21e20", "level": "none", "message": {"text": "Commented-code block (5 lines) in oddish/tests/test_config_queue_keys.py:272"}, "properties": {"repobilityId": "78539c5101831b32", "scanner": "scanner-primary", "fingerprint": "56cf43c70de21e20", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4e0292ee1fe2c001", "level": "note", "message": {"text": "Legacy-named symbol `list_objects_v2` in oddish/tests/test_task_storage.py:91"}, "properties": {"repobilityId": "f860de6a2e0456e3", "scanner": "scanner-primary", "fingerprint": "4e0292ee1fe2c001", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b56bcace997cedc3", "level": "none", "message": {"text": "Commented-code block (5 lines) in oddish/alembic/versions/mine_filter_idx_001_add_mine_filter_indexes.py:40"}, "properties": {"repobilityId": "6f3e64662a9ff07e", "scanner": "scanner-primary", "fingerprint": "b56bcace997cedc3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3bccc2fec43ddc58", "level": "none", "message": {"text": "Commented-code block (5 lines) in oddish/alembic/versions/skills_001_add_skills.py:20"}, "properties": {"repobilityId": "3d87e40ff24aa337", "scanner": "scanner-primary", "fingerprint": "3bccc2fec43ddc58", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e60c3ee4b70f24eb", "level": "none", "message": {"text": "Commented-code block (5 lines) in oddish/alembic/versions/documents_001_add_documents.py:21"}, "properties": {"repobilityId": "1a510e1f0e247684", "scanner": "scanner-primary", "fingerprint": "e60c3ee4b70f24eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-104530d734791f37", "level": "none", "message": {"text": "Commented-code block (5 lines) in oddish/alembic/versions/i1d2e3f4a5b6_partial_indexes_for_soft_delete.py:44"}, "properties": {"repobilityId": "e5b682e209d3f813", "scanner": "scanner-primary", "fingerprint": "104530d734791f37", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-10a7065176640f07", "level": "none", "message": {"text": "Commented-code block (7 lines) in oddish/src/oddish/config.py:99"}, "properties": {"repobilityId": "c71a6d967d3d5f87", "scanner": "scanner-primary", "fingerprint": "10a7065176640f07", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c59ad50f380f5f8", "level": "none", "message": {"text": "Commented-code block (5 lines) in oddish/src/oddish/queue.py:649"}, "properties": {"repobilityId": "e681d2ed76e8248e", "scanner": "scanner-primary", "fingerprint": "2c59ad50f380f5f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-15a9b9c53e599a99", "level": "none", "message": {"text": "Commented-code block (9 lines) in oddish/src/oddish/task_timeouts.py:7"}, "properties": {"repobilityId": "4816289aed4d2671", "scanner": "scanner-primary", "fingerprint": "15a9b9c53e599a99", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8f37df98d62941df", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in oddish/src/oddish/workers/harbor_runner.py:1159"}, "properties": {"repobilityId": "8c383fcaf4c45594", "scanner": "scanner-primary", "fingerprint": "8f37df98d62941df", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b6c66991e865be9e", "level": "none", "message": {"text": "Commented-code block (9 lines) in oddish/src/oddish/workers/harbor_runner.py:134"}, "properties": {"repobilityId": "e19c38d55301de31", "scanner": "scanner-primary", "fingerprint": "b6c66991e865be9e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c9e2678b785cee6e", "level": "none", "message": {"text": "Commented-code block (7 lines) in oddish/src/oddish/workers/claude_code_agent.py:46"}, "properties": {"repobilityId": "fb4d6831afc2195c", "scanner": "scanner-primary", "fingerprint": "c9e2678b785cee6e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aa601b75b79e6cc7", "level": "none", "message": {"text": "Commented-code block (5 lines) in oddish/src/oddish/workers/queue/task_expand_handler.py:208"}, "properties": {"repobilityId": "49fad3c7da516b26", "scanner": "scanner-primary", "fingerprint": "aa601b75b79e6cc7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cf0c12840b7d05fa", "level": "none", "message": {"text": "Commented-code block (5 lines) in oddish/src/oddish/workers/queue/trial_handler.py:439"}, "properties": {"repobilityId": "90b81b9b6d104f1f", "scanner": "scanner-primary", "fingerprint": "cf0c12840b7d05fa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3687914a4bc11b16", "level": "none", "message": {"text": "Commented-code block (5 lines) in oddish/src/oddish/workers/queue/worker_job_dispatcher.py:191"}, "properties": {"repobilityId": "c405a5b7db8ffa32", "scanner": "scanner-primary", "fingerprint": "3687914a4bc11b16", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-adedd66f4af5774a", "level": "none", "message": {"text": "Commented-code block (5 lines) in oddish/src/oddish/workers/queue/cleanup.py:55"}, "properties": {"repobilityId": "52d11c7480231858", "scanner": "scanner-primary", "fingerprint": "adedd66f4af5774a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-11efe8977ec1567e", "level": "none", "message": {"text": "Commented-code block (5 lines) in oddish/src/oddish/workers/queue/worker_job_single_job.py:129"}, "properties": {"repobilityId": "f90425fb41329ea1", "scanner": "scanner-primary", "fingerprint": "11efe8977ec1567e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b6459d71084c48b0", "level": "none", "message": {"text": "Commented-code block (7 lines) in oddish/src/oddish/worker/probe_overlay.py:19"}, "properties": {"repobilityId": "13d0e4f2cc06a460", "scanner": "scanner-primary", "fingerprint": "b6459d71084c48b0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4cb18c8e36ba9584", "level": "none", "message": {"text": "Commented-code block (6 lines) in oddish/src/oddish/worker/local_runner.py:367"}, "properties": {"repobilityId": "95d27c40068e4365", "scanner": "scanner-primary", "fingerprint": "4cb18c8e36ba9584", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-06af5ce2ccbce4e6", "level": "none", "message": {"text": "Commented-code block (6 lines) in oddish/src/oddish/worker/probe_analysis.py:213"}, "properties": {"repobilityId": "2add6d3542290505", "scanner": "scanner-primary", "fingerprint": "06af5ce2ccbce4e6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c969fbf6bacf1c14", "level": "none", "message": {"text": "Commented-code block (8 lines) in oddish/src/oddish/server/__init__.py:511"}, "properties": {"repobilityId": "d0bca8c3a52a6f20", "scanner": "scanner-primary", "fingerprint": "c969fbf6bacf1c14", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1c92e35a1af003e5", "level": "none", "message": {"text": "Commented-code block (6 lines) in oddish/src/oddish/analyze/classifier.py:301"}, "properties": {"repobilityId": "bdad239727ed7610", "scanner": "scanner-primary", "fingerprint": "1c92e35a1af003e5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-79a01786dd9bc57c", "level": "none", "message": {"text": "Commented-code block (5 lines) in oddish/src/oddish/db/connection.py:168"}, "properties": {"repobilityId": "e6f8fee62bae0f1c", "scanner": "scanner-primary", "fingerprint": "79a01786dd9bc57c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d07591b676085735", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 oddish/src/oddish/db/connection.py:294"}, "properties": {"repobilityId": "ac292bc8464c8d1c", "scanner": "scanner-primary", "fingerprint": "d07591b676085735", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8af6a1c7e9ae9880", "level": "none", "message": {"text": "Commented-code block (6 lines) in oddish/src/oddish/db/soft_delete.py:55"}, "properties": {"repobilityId": "96059b7c7a793413", "scanner": "scanner-primary", "fingerprint": "8af6a1c7e9ae9880", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bc583d5c26b815d0", "level": "none", "message": {"text": "Commented-code block (11 lines) in oddish/src/oddish/db/models.py:104"}, "properties": {"repobilityId": "39f90b416e620ed1", "scanner": "scanner-primary", "fingerprint": "bc583d5c26b815d0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a9583ece76e8c058", "level": "note", "message": {"text": "Legacy-named symbol `list_objects_v2` in oddish/src/oddish/db/storage.py:406"}, "properties": {"repobilityId": "a9159af3da09d6a3", "scanner": "scanner-primary", "fingerprint": "a9583ece76e8c058", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b7c4b8848d6b914b", "level": "none", "message": {"text": "Commented-code block (5 lines) in oddish/src/oddish/db/storage.py:148"}, "properties": {"repobilityId": "0a046fad77b3cb67", "scanner": "scanner-primary", "fingerprint": "b7c4b8848d6b914b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7ce9d8b163354434", "level": "none", "message": {"text": "Commented-code block (6 lines) in oddish/src/oddish/core/tasks.py:298"}, "properties": {"repobilityId": "0101e7e1e98be0c6", "scanner": "scanner-primary", "fingerprint": "7ce9d8b163354434", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f20344530de47668", "level": "none", "message": {"text": "Commented-code block (5 lines) in oddish/src/oddish/core/admin.py:210"}, "properties": {"repobilityId": "c2e9454916c6d93b", "scanner": "scanner-primary", "fingerprint": "f20344530de47668", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-842f57fe71c13af5", "level": "none", "message": {"text": "Commented-code block (5 lines) in oddish/src/oddish/core/auto_probe.py:27"}, "properties": {"repobilityId": "bbce0f8344b55f69", "scanner": "scanner-primary", "fingerprint": "842f57fe71c13af5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-63b694b0ce00f358", "level": "none", "message": {"text": "Commented-code block (5 lines) in oddish/src/oddish/core/dashboard.py:111"}, "properties": {"repobilityId": "d2c7619c1210adb2", "scanner": "scanner-primary", "fingerprint": "63b694b0ce00f358", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-387aff99ccd262db", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in oddish/src/oddish/core/endpoints.py:2438"}, "properties": {"repobilityId": "1e343ebedf9461c0", "scanner": "scanner-primary", "fingerprint": "387aff99ccd262db", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d9b3ecdae3b2710d", "level": "none", "message": {"text": "Commented-code block (6 lines) in oddish/src/oddish/core/endpoints.py:179"}, "properties": {"repobilityId": "002afb578278d0b6", "scanner": "scanner-primary", "fingerprint": "d9b3ecdae3b2710d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-270e1ca19948b150", "level": "none", "message": {"text": "Commented-code block (9 lines) in oddish/src/oddish/core/experiments.py:103"}, "properties": {"repobilityId": "1d548dc85441ea91", "scanner": "scanner-primary", "fingerprint": "270e1ca19948b150", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c0968aad67ce369d", "level": "none", "message": {"text": "Commented-code block (6 lines) in oddish/src/oddish/core/trial_imports.py:196"}, "properties": {"repobilityId": "e35b0d108a80705a", "scanner": "scanner-primary", "fingerprint": "c0968aad67ce369d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-073353bfd06d5409", "level": "none", "message": {"text": "Commented-code block (5 lines) in oddish/src/oddish/cli/upload.py:347"}, "properties": {"repobilityId": "783683d9c8273804", "scanner": "scanner-primary", "fingerprint": "073353bfd06d5409", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5f9ed1d4f39f6d2a", "level": "none", "message": {"text": "Commented-code block (5 lines) in oddish/src/oddish/cli/api.py:332"}, "properties": {"repobilityId": "3edd1bce28d0bc0c", "scanner": "scanner-primary", "fingerprint": "5f9ed1d4f39f6d2a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2370d87afbad59f1", "level": "none", "message": {"text": "Commented-code block (8 lines) in oddish/src/oddish/cli/run.py:665"}, "properties": {"repobilityId": "8d813e4f8093f255", "scanner": "scanner-primary", "fingerprint": "2370d87afbad59f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b673918452ee2583", "level": "note", "message": {"text": "70 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "abf836fe9ec81133", "scanner": "scanner-primary", "fingerprint": "b673918452ee2583", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "01bab5f2c3d37425", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "2701a5ecc32de3dc", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "7328468b301012a4", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "5d6ca0fc21daf146", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "6a93138bba6fdab9", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "eed544c061dd805f", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "cf3d274341d92800", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "c80b7ad28dab7581", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "c6915f23b433e2bb", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "a3d77493fb542c5e", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "d9e20d05ecf654b5", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "a47ec0fb2a4469a3", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "c441b6dac499c51e", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "2b038a3920743fd4", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "d557b57ac9eb27f9", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "471e485df90f37a9", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "edc6a008bbf94805", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "450a5f0d2e18f164", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "0a677ad7967cfb74", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "d5d0dc49f7bd27e7", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-4fd2559af834d1de", "level": "error", "message": {"text": "FastAPI POST `handle_clerk_webhook` without auth dependency \u2014 backend/api/routers/clerk_webhooks.py:186"}, "properties": {"repobilityId": "83a16124f9ac5594", "scanner": "scanner-primary", "fingerprint": "4fd2559af834d1de", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/routers/clerk_webhooks.py"}, "region": {"startLine": 186}}}]}, {"ruleId": "scanner-616c3644b2be36d9", "level": "error", "message": {"text": "Dangling fetch: POST /api/settings/api-keys (frontend/src/app/(app)/settings/page.tsx:354)"}, "properties": {"repobilityId": "74afdb7edb4b9522", "scanner": "scanner-primary", "fingerprint": "616c3644b2be36d9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-088e83c55dd3e746", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/settings/api-keys/${revokeTarget.id} (frontend/src/app/(app)/settings/page.tsx:526)"}, "properties": {"repobilityId": "1abe070d5ae77fde", "scanner": "scanner-primary", "fingerprint": "088e83c55dd3e746", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-539cd44e6287d818", "level": "error", "message": {"text": "Dangling fetch: POST /api/trials/${trial_id}/cancel (frontend/src/lib/observability.ts:110)"}, "properties": {"repobilityId": "9aeb919a4fc793d4", "scanner": "scanner-primary", "fingerprint": "539cd44e6287d818", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5a15440273e677bc", "level": "note", "message": {"text": "Unused endpoint: GET /documents/{document_id}"}, "properties": {"repobilityId": "023d3363ec7e7e01", "scanner": "scanner-primary", "fingerprint": "5a15440273e677bc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3558d5261f8fa12e", "level": "note", "message": {"text": "Unused endpoint: POST /tasks/upload/init"}, "properties": {"repobilityId": "039ec146600a0be2", "scanner": "scanner-primary", "fingerprint": "3558d5261f8fa12e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-567e24f86b861da7", "level": "note", "message": {"text": "Unused endpoint: POST /tasks/upload/complete"}, "properties": {"repobilityId": "f899f99abb835d6a", "scanner": "scanner-primary", "fingerprint": "567e24f86b861da7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd0e06afbaab19b3", "level": "note", "message": {"text": "Unused endpoint: GET /tasks"}, "properties": {"repobilityId": "dca044f7f9a82e53", "scanner": "scanner-primary", "fingerprint": "fd0e06afbaab19b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-25f8096bbe16ad83", "level": "note", "message": {"text": "Unused endpoint: GET /tasks/browse"}, "properties": {"repobilityId": "e8ce4d58d43cd86f", "scanner": "scanner-primary", "fingerprint": "25f8096bbe16ad83", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0bb3f1c6d8611d4c", "level": "note", "message": {"text": "Unused endpoint: POST /experiments/combine"}, "properties": {"repobilityId": "8428b393aac18440", "scanner": "scanner-primary", "fingerprint": "0bb3f1c6d8611d4c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-99eb2cc79a9ab7c5", "level": "note", "message": {"text": "Unused endpoint: GET /experiments/{experiment_id}/share"}, "properties": {"repobilityId": "317a8336141652f1", "scanner": "scanner-primary", "fingerprint": "99eb2cc79a9ab7c5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-74a7db6caaffd961", "level": "note", "message": {"text": "Unused endpoint: GET /experiments/{experiment_id}/probes"}, "properties": {"repobilityId": "765d4b8d62df9f7f", "scanner": "scanner-primary", "fingerprint": "74a7db6caaffd961", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-375da1783d4d1692", "level": "note", "message": {"text": "Unused endpoint: GET /probes"}, "properties": {"repobilityId": "3aa9dd0326c168cd", "scanner": "scanner-primary", "fingerprint": "375da1783d4d1692", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f093162615b3b04e", "level": "note", "message": {"text": "Unused endpoint: GET /tasks/{task_id}/detail"}, "properties": {"repobilityId": "fe91add5d84772c3", "scanner": "scanner-primary", "fingerprint": "f093162615b3b04e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f21b3f2c68ab5775", "level": "note", "message": {"text": "Unused endpoint: GET /tasks/{task_id}/versions"}, "properties": {"repobilityId": "ae88c5f919ececd7", "scanner": "scanner-primary", "fingerprint": "f21b3f2c68ab5775", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a2c71244069daa76", "level": "note", "message": {"text": "Unused endpoint: GET /tasks/{task_id}/versions/{version}"}, "properties": {"repobilityId": "54f046b0cf119e0c", "scanner": "scanner-primary", "fingerprint": "a2c71244069daa76", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-688c2c286ca9b8bd", "level": "note", "message": {"text": "Unused endpoint: GET /tasks/{task_id}/files"}, "properties": {"repobilityId": "be07dc1f55ac554d", "scanner": "scanner-primary", "fingerprint": "688c2c286ca9b8bd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d0cd444b531f5f3b", "level": "note", "message": {"text": "Unused endpoint: GET /tasks/{task_id}/files/{file_path:path}"}, "properties": {"repobilityId": "05bddc1253aaf09b", "scanner": "scanner-primary", "fingerprint": "d0cd444b531f5f3b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ebf6744d53d9d555", "level": "note", "message": {"text": "Unused endpoint: GET /slots"}, "properties": {"repobilityId": "ba6f9a88bdc907c8", "scanner": "scanner-primary", "fingerprint": "ebf6744d53d9d555", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d64cbc39e926a40f", "level": "note", "message": {"text": "Unused endpoint: GET /queue-status"}, "properties": {"repobilityId": "b02031ea486f4d52", "scanner": "scanner-primary", "fingerprint": "d64cbc39e926a40f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2521d72e3bb08df4", "level": "note", "message": {"text": "Unused endpoint: GET /orphaned-state"}, "properties": {"repobilityId": "dc0f2dabb0160db5", "scanner": "scanner-primary", "fingerprint": "2521d72e3bb08df4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8510bf10858f2a4f", "level": "note", "message": {"text": "Unused endpoint: GET /queue-health"}, "properties": {"repobilityId": "09163c3b7fa17460", "scanner": "scanner-primary", "fingerprint": "8510bf10858f2a4f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6ce5f3cbd81224a0", "level": "note", "message": {"text": "Unused endpoint: GET /worker-jobs"}, "properties": {"repobilityId": "c287c1df00b38106", "scanner": "scanner-primary", "fingerprint": "6ce5f3cbd81224a0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-20d0d7ae629de5ba", "level": "note", "message": {"text": "Unused endpoint: POST /tasks/expand-backfill"}, "properties": {"repobilityId": "486ceb4a87e13462", "scanner": "scanner-primary", "fingerprint": "20d0d7ae629de5ba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a9ea2b2f13dd64c2", "level": "note", "message": {"text": "Unused endpoint: POST /clerk"}, "properties": {"repobilityId": "dedc228f4bf41bee", "scanner": "scanner-primary", "fingerprint": "a9ea2b2f13dd64c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-15946599dc588e37", "level": "note", "message": {"text": "Unused endpoint: POST /chat-sessions"}, "properties": {"repobilityId": "10e979614a32050e", "scanner": "scanner-primary", "fingerprint": "15946599dc588e37", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-12f63219b62a284f", "level": "note", "message": {"text": "Unused endpoint: GET /chat-sessions/{session_id}"}, "properties": {"repobilityId": "1818f4f1090d0e35", "scanner": "scanner-primary", "fingerprint": "12f63219b62a284f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e5223ed0bcf5b663", "level": "note", "message": {"text": "Unused endpoint: GET /chat-sessions/{session_id}/events"}, "properties": {"repobilityId": "ff3b21a6b06fb171", "scanner": "scanner-primary", "fingerprint": "e5223ed0bcf5b663", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c14a21c82a676417", "level": "note", "message": {"text": "Unused endpoint: POST /chat-sessions/{session_id}/messages"}, "properties": {"repobilityId": "e6397d3334293e33", "scanner": "scanner-primary", "fingerprint": "c14a21c82a676417", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6f67e3a5e9ad346d", "level": "note", "message": {"text": "Unused endpoint: DELETE /chat-sessions/{session_id}"}, "properties": {"repobilityId": "25d1a1f27bb7a566", "scanner": "scanner-primary", "fingerprint": "6f67e3a5e9ad346d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-660ae197d6b79be9", "level": "note", "message": {"text": "Unused endpoint: GET /skills/{skill_id}"}, "properties": {"repobilityId": "d122a208f0295e90", "scanner": "scanner-primary", "fingerprint": "660ae197d6b79be9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ce7fe565b4caff57", "level": "note", "message": {"text": "Unused endpoint: POST /skills"}, "properties": {"repobilityId": "efc45df6cb3711b2", "scanner": "scanner-primary", "fingerprint": "ce7fe565b4caff57", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-94a9f7efac4a83e3", "level": "note", "message": {"text": "Unused endpoint: PUT /skills/{skill_id}"}, "properties": {"repobilityId": "594886a74634aeaf", "scanner": "scanner-primary", "fingerprint": "94a9f7efac4a83e3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-33a13e77633847b4", "level": "note", "message": {"text": "Unused endpoint: GET /org"}, "properties": {"repobilityId": "b08a370be4712ba5", "scanner": "scanner-primary", "fingerprint": "33a13e77633847b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-841e50bf821e4158", "level": "note", "message": {"text": "Unused endpoint: GET /users"}, "properties": {"repobilityId": "cc8b95177fdc5953", "scanner": "scanner-primary", "fingerprint": "841e50bf821e4158", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1bca8100a44f7f25", "level": "note", "message": {"text": "Unused endpoint: POST /users"}, "properties": {"repobilityId": "adbbc173473e84c8", "scanner": "scanner-primary", "fingerprint": "1bca8100a44f7f25", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fecd99fa2d3d6078", "level": "note", "message": {"text": "Unused endpoint: DELETE /users/{user_id}"}, "properties": {"repobilityId": "05963fbd2db3805c", "scanner": "scanner-primary", "fingerprint": "fecd99fa2d3d6078", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d504b80adc9409ec", "level": "note", "message": {"text": "Unused endpoint: GET /dashboard"}, "properties": {"repobilityId": "90b0fb42274a1e43", "scanner": "scanner-primary", "fingerprint": "d504b80adc9409ec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-98e42ebeefe31d47", "level": "note", "message": {"text": "Unused endpoint: POST /imports/zip/inspect"}, "properties": {"repobilityId": "d32368911260cf1f", "scanner": "scanner-primary", "fingerprint": "98e42ebeefe31d47", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-51fd6f6dae2ec709", "level": "note", "message": {"text": "Unused endpoint: POST /tasks/{task_id}/refresh"}, "properties": {"repobilityId": "1fd8329e3f156673", "scanner": "scanner-primary", "fingerprint": "51fd6f6dae2ec709", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-72c74bca5b492f29", "level": "note", "message": {"text": "Unused endpoint: POST /experiments/{experiment_id}/refresh"}, "properties": {"repobilityId": "f3e3241844429450", "scanner": "scanner-primary", "fingerprint": "72c74bca5b492f29", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9d730b79f283293f", "level": "note", "message": {"text": "Unused endpoint: GET /tags"}, "properties": {"repobilityId": "cc6d10df5fa67050", "scanner": "scanner-primary", "fingerprint": "9d730b79f283293f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3009ba7831526f2d", "level": "note", "message": {"text": "Unused endpoint: GET /tags/for-target"}, "properties": {"repobilityId": "87a1b85a20078f21", "scanner": "scanner-primary", "fingerprint": "3009ba7831526f2d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e0b062927b917ff4", "level": "note", "message": {"text": "Unused endpoint: GET /tags/{tag_id}"}, "properties": {"repobilityId": "b19de8a43fb3b53b", "scanner": "scanner-primary", "fingerprint": "e0b062927b917ff4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5a3d7c32dac93122", "level": "note", "message": {"text": "Unused endpoint: POST /tags/{tag_id}/archive"}, "properties": {"repobilityId": "aa1b22e458f7c8b4", "scanner": "scanner-primary", "fingerprint": "5a3d7c32dac93122", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b927fd6c42e2dd7c", "level": "note", "message": {"text": "Unused endpoint: POST /tags/{tag_id}/merge"}, "properties": {"repobilityId": "671d6e89916140c0", "scanner": "scanner-primary", "fingerprint": "b927fd6c42e2dd7c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7736602c033e1a46", "level": "note", "message": {"text": "Unused endpoint: POST /tags/{tag_id}/visibility"}, "properties": {"repobilityId": "486501299b3375b0", "scanner": "scanner-primary", "fingerprint": "7736602c033e1a46", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2f48db124f36ef96", "level": "note", "message": {"text": "Unused endpoint: POST /tags/exclude"}, "properties": {"repobilityId": "131a2e317bbc235a", "scanner": "scanner-primary", "fingerprint": "2f48db124f36ef96", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-206de3cd6daad43d", "level": "note", "message": {"text": "Unused endpoint: POST /tags/unexclude"}, "properties": {"repobilityId": "f81c9e902bf6befe", "scanner": "scanner-primary", "fingerprint": "206de3cd6daad43d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a3c7e44eb18931e5", "level": "note", "message": {"text": "Unused endpoint: GET /tags/{tag_id}/grants"}, "properties": {"repobilityId": "ba70d6277bbc7b5d", "scanner": "scanner-primary", "fingerprint": "a3c7e44eb18931e5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-14a5075d1667aea8", "level": "note", "message": {"text": "Unused endpoint: POST /tags/{tag_id}/grants"}, "properties": {"repobilityId": "18651efaa426ac03", "scanner": "scanner-primary", "fingerprint": "14a5075d1667aea8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ad94ea7c52a0698e", "level": "note", "message": {"text": "Unused endpoint: DELETE /tags/{tag_id}/grants/{grant_id}"}, "properties": {"repobilityId": "7b9dd74702a4fb15", "scanner": "scanner-primary", "fingerprint": "ad94ea7c52a0698e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6e836f332f1875eb", "level": "note", "message": {"text": "Unused endpoint: GET /tag-policy"}, "properties": {"repobilityId": "af90138802fb4128", "scanner": "scanner-primary", "fingerprint": "6e836f332f1875eb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-51d307124ad9fa87", "level": "note", "message": {"text": "Unused endpoint: GET /tag-policy/profanity-reports"}, "properties": {"repobilityId": "b91b5680c3b9180e", "scanner": "scanner-primary", "fingerprint": "51d307124ad9fa87", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}