{"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-0380c645a299647e", "name": "Possibly dead Python function: handle_data", "shortDescription": {"text": "Possibly dead Python function: handle_data"}, "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-4013d843a459dd74", "name": "Possibly dead Python function: earning_calendar", "shortDescription": {"text": "Possibly dead Python function: earning_calendar"}, "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-274535ed6b345715", "name": "Possibly dead Python function: etf_sector_weightings", "shortDescription": {"text": "Possibly dead Python function: etf_sector_weightings"}, "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-132fa6fcd28f5614", "name": "Possibly dead Python function: analyst_recommendations", "shortDescription": {"text": "Possibly dead Python function: analyst_recommendations"}, "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-99378abe1e90383a", "name": "Possibly dead Python function: sort_key", "shortDescription": {"text": "Possibly dead Python function: sort_key"}, "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-e7d8ad5f9744f731", "name": "Possibly dead Python function: send_cup_handle_digest", "shortDescription": {"text": "Possibly dead Python function: send_cup_handle_digest"}, "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-0903ff52ca0fbd38", "name": "Possibly dead Python function: send_article_digest", "shortDescription": {"text": "Possibly dead Python function: send_article_digest"}, "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-ee430dc9d4428b97", "name": "Possibly dead Python function: generate_ogp_image", "shortDescription": {"text": "Possibly dead Python function: generate_ogp_image"}, "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-8a28331bc085e587", "name": "Possibly dead Python function: render_static_fallback", "shortDescription": {"text": "Possibly dead Python function: render_static_fallback"}, "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-61577952161d31d8", "name": "Possibly dead Python function: generate_backtest_og_image", "shortDescription": {"text": "Possibly dead Python function: generate_backtest_og_image"}, "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-0f925a213398e7d3", "name": "Possibly dead Python function: render_backtest_fallback", "shortDescription": {"text": "Possibly dead Python function: render_backtest_fallback"}, "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-26563e9fb1bf08c2", "name": "Possibly dead Python function: generate_backtest_methodology_pdf", "shortDescription": {"text": "Possibly dead Python function: generate_backtest_methodology_pdf"}, "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-164ca68220c116fb", "name": "Possibly dead Python function: prepare_image_data", "shortDescription": {"text": "Possibly dead Python function: prepare_image_data"}, "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-6d5dd22de9a6b64a", "name": "Possibly dead Python function: filter", "shortDescription": {"text": "Possibly dead Python function: filter"}, "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-6f0b82c762e2e67c", "name": "Possibly dead Python function: handle_starttag", "shortDescription": {"text": "Possibly dead Python function: handle_starttag"}, "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-d34215290a0b15f5", "name": "Possibly dead Python function: handle_endtag", "shortDescription": {"text": "Possibly dead Python function: handle_endtag"}, "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-775e57bbe6dcd5ac", "name": "Possibly dead Python function: handle_data", "shortDescription": {"text": "Possibly dead Python function: handle_data"}, "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-442d50243392291d", "name": "Possibly dead Python function: formatMetricsTrend_py", "shortDescription": {"text": "Possibly dead Python function: formatMetricsTrend_py"}, "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-26f44f06c9b4868d", "name": "Possibly dead Python function: summarize", "shortDescription": {"text": "Possibly dead Python function: summarize"}, "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-b6c819ea864380d0", "name": "Possibly dead Python function: candidate_quarters", "shortDescription": {"text": "Possibly dead Python function: candidate_quarters"}, "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-89a245e37a7ef655", "name": "Possibly dead Python function: summarize", "shortDescription": {"text": "Possibly dead Python function: summarize"}, "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-4cf54e1fef3dd9ed", "name": "Possibly dead Python function: summarize", "shortDescription": {"text": "Possibly dead Python function: summarize"}, "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-8eb90929ef33bd6d", "name": "Possibly dead Python function: build_flow_svg", "shortDescription": {"text": "Possibly dead Python function: build_flow_svg"}, "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-9998440ff4ae5796", "name": "Possibly dead Python function: clear_cache", "shortDescription": {"text": "Possibly dead Python function: clear_cache"}, "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-fbd8c2bc6da7f386", "name": "Possibly dead Python function: compute_surprise_pct", "shortDescription": {"text": "Possibly dead Python function: compute_surprise_pct"}, "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-5efa09a68845fbc5", "name": "Possibly dead Python function: build_precomputed_metrics", "shortDescription": {"text": "Possibly dead Python function: build_precomputed_metrics"}, "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-fb6ca466aaabbe7b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/CalendarPanel.jsx:251", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/CalendarPanel.jsx:251"}, "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-68634b276215654a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ScreenerPanel.jsx:101", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ScreenerPanel.jsx:101"}, "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-c23e08d103ad010e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/IRLinksPanel.jsx:30", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/IRLinksPanel.jsx:30"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2b47e5940123f4bb", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/TodaysBriefSection.jsx:188", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/TodaysBriefSection.jsx:188"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1be32bf59720620a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ResultBadge.jsx:28", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ResultBadge.jsx:28"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ff8935561f582ea3", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/CustomScreenerPanel.jsx:436", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/CustomScreenerPanel.jsx:436"}, "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-bbaf5f9712d88795", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/DiagramCard.jsx:3", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/DiagramCard.jsx:3"}, "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-3d752f443ae07846", "name": "Icon-only button without accessible name \u2014 frontend/src/components/UpgradeModal.jsx:134", "shortDescription": {"text": "Icon-only button without accessible name \u2014 frontend/src/components/UpgradeModal.jsx:134"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d28a344f7d527594", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/TickerSearch.jsx:247", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/TickerSearch.jsx:247"}, "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-8c163e4eb5196782", "name": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/components/TickerSearch.jsx:237", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/components/TickerSearch.jsx:237"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b7e6f98ddffff01b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/TenKLinksPanel.jsx:115", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/TenKLinksPanel.jsx:115"}, "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-403aa80d940de6a6", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/DetailReport.jsx:878", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/DetailReport.jsx:878"}, "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-b061a61443f97a20", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/lib/__tests__/blocklist.test.js:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/lib/__tests__/blocklist.test.js:40"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4202a0630f1a891d", "name": "TODO/FIXME marker in shipping code \u2014 frontend/src/features/workspace/IndicesView.jsx:1029", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/features/workspace/IndicesView.jsx:1029"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e4bfc6f0d0f4d9df", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/features/judgment/constants/__tests__/completenessLedger.test.js:173", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/features/judgment/constants/__tests__/completenessLedger.test.js:173"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b456b3902b6eb6c4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend-next/app/layout.tsx:45", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend-next/app/layout.tsx:45"}, "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-a440e226d204f9a5", "name": "Privileged port 19 in use", "shortDescription": {"text": "Privileged port 19 in use"}, "fullDescription": {"text": "Port 19 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-10a3026860efe506", "name": "Privileged port 5 in use", "shortDescription": {"text": "Privileged port 5 in use"}, "fullDescription": {"text": "Port 5 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cd490395eb509bdd", "name": "Privileged port 4 in use", "shortDescription": {"text": "Privileged port 4 in use"}, "fullDescription": {"text": "Port 4 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-349412f2aa40afae", "name": "Privileged port 35 in use", "shortDescription": {"text": "Privileged port 35 in use"}, "fullDescription": {"text": "Port 35 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-18572843fad97036", "name": "Privileged port 17 in use", "shortDescription": {"text": "Privileged port 17 in use"}, "fullDescription": {"text": "Port 17 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d63da3583b14afc0", "name": "Dockerfile runs as root: Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: 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-835eae4c7f17a2f8", "name": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-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-397fd4515e7f8f0e", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim-bookworm", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-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-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-249a1eebd57370d1", "name": "Insecure pattern 'eval_used' in frontend/scripts/snap-c3-authed.mjs:34", "shortDescription": {"text": "Insecure pattern 'eval_used' in frontend/scripts/snap-c3-authed.mjs:34"}, "fullDescription": {"text": "Found a known-risky pattern (eval_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-24f810177f72a704", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/DetailReport.jsx:878", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/DetailReport.jsx:878"}, "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-92c9e4e6dc438d1c", "name": "Insecure pattern 'dangerous_innerhtml' in frontend-next/app/layout.tsx:45", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend-next/app/layout.tsx:45"}, "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-907c663964b01a8f", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0e4060ec47dd1821", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a896089ce1fdbaba", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d305406af9300066", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e9140e3418bf319b", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d550510489575214", "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-9438f86e7ed01d1d", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-908f3dab2634926f", "name": "Very large file: frontend/src/App.jsx (2800 lines)", "shortDescription": {"text": "Very large file: frontend/src/App.jsx (2800 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-47408dc589a631b5", "name": "Very large file: frontend/src/components/LandingPage.jsx (1951 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/LandingPage.jsx (1951 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-75637371564437c1", "name": "Very large file: frontend/src/components/CustomScreenerPanel.jsx (1779 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/CustomScreenerPanel.jsx (1779 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-4fb90dfafb74e86d", "name": "Very large file: frontend/src/components/DiagramCard.jsx (3553 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/DiagramCard.jsx (3553 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-12909ca5b42c4c7f", "name": "Very large file: frontend/src/components/StockPriceChart.jsx (1829 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/StockPriceChart.jsx (1829 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-deb6c59035c1ce70", "name": "Very large file: frontend/src/components/BacktestPage.jsx (1468 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/BacktestPage.jsx (1468 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-3edec29f49996355", "name": "Very large file: frontend/src/features/workspace/IndicesView.jsx (2805 lines)", "shortDescription": {"text": "Very large file: frontend/src/features/workspace/IndicesView.jsx (2805 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-8169b20e0c04e469", "name": "Very large file: frontend/src/features/workspace/Workspace.jsx (1159 lines)", "shortDescription": {"text": "Very large file: frontend/src/features/workspace/Workspace.jsx (1159 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-8818d6d152d8684e", "name": "Very large file: frontend/src/features/judgment/components/detail/JudgmentDetail.jsx (1655 lines)", "shortDescription": {"text": "Very large file: frontend/src/features/judgment/components/detail/JudgmentDetail.jsx (1655 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-730297a952ca72d6", "name": "Very large file: frontend/src/features/judgment/components/detail/ProfileCard.jsx (1660 lines)", "shortDescription": {"text": "Very large file: frontend/src/features/judgment/components/detail/ProfileCard.jsx (1660 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-4737266e7397a6ea", "name": "Very large file: frontend/src/features/judgment/components/detail/sections/EarningsFlashSummary.jsx (1025 lines)", "shortDescription": {"text": "Very large file: frontend/src/features/judgment/components/detail/sections/EarningsFlashSummary.jsx (1025 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "30 test file(s) for 357 source file(s) (ratio 0.08). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 232 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 149 placeholder/mock markers across 52 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "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-064191ae07b621f5", "name": "Agent authority lacks a verifier contract: .claude/commands/health.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/health.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-0da813324024de69", "name": "Agent authority lacks a verifier contract: .claude/commands/morning.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/morning.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-7636906907cb7899", "name": "Agent authority lacks a verifier contract: .claude/commands/fetch-handover.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/fetch-handover.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-862e0bc3b5b50e34", "name": "Agent authority lacks a verifier contract: .claude/agents/planner.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/agents/planner.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-d6d7a1050034c30a", "name": "Agent authority lacks a verifier contract: .claude/skills/design-system-check/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/design-system-check/SKILL.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-b8363164998b0b29", "name": "Agent authority lacks a verifier contract: .claude/skills/design-system-check/references/chip_check.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/design-system-check/references/chip_check.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-a54d5f43a213fa07", "name": "Agent authority lacks a verifier contract: .claude/skills/next-best-practices/bundling.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/next-best-practices/bundling.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-3dd2e3e46c9753c5", "name": "Agent authority lacks a verifier contract: .claude/skills/next-best-practices/file-conventions.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/next-best-practices/file-conventions.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-4d72c7a0c4b47e86", "name": "Agent instruction/config may expose a secret: .claude/skills/next-best-practices/route-handlers.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/skills/next-best-practices/route-handlers.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-02a36d2c3a12d962", "name": "Agent authority lacks a verifier contract: .claude/skills/next-best-practices/route-handlers.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/next-best-practices/route-handlers.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-71519890f1fcf1fb", "name": "Agent authority lacks a verifier contract: .claude/skills/next-best-practices/async-patterns.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/next-best-practices/async-patterns.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-2823f689df48a081", "name": "Agent authority lacks a verifier contract: .claude/skills/next-best-practices/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/next-best-practices/SKILL.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-a78045556b8778bb", "name": "Agent instruction/config may expose a secret: .claude/skills/next-best-practices/self-hosting.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/skills/next-best-practices/self-hosting.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-8650f45324a1911e", "name": "Agent authority lacks a verifier contract: .claude/skills/shadcn/customization.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/shadcn/customization.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-6d4759e0e7135b23", "name": "Commented-code block (5 lines) in frontend/playwright.config.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/playwright.config.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0c8ba94a05d91952", "name": "Commented-code block (9 lines) in frontend/vite.config.js:15", "shortDescription": {"text": "Commented-code block (9 lines) in frontend/vite.config.js:15"}, "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-92505e399eb346d3", "name": "Commented-code block (6 lines) in frontend/scripts/snap-debug-pane29.mjs:5", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/scripts/snap-debug-pane29.mjs:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ba224f253b1a230d", "name": "Commented-code block (7 lines) in frontend/scripts/snap-s5b-funda.mjs:1", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/scripts/snap-s5b-funda.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4b23a0cd14ce34d7", "name": "Commented-code block (5 lines) in frontend/scripts/snap-c3-scroll.mjs:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-c3-scroll.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-184386b28fc6934e", "name": "Commented-code block (6 lines) in frontend/scripts/snap-cup-handle.mjs:6", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/scripts/snap-cup-handle.mjs:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9e5cf74a98547b20", "name": "Legacy-named symbol `pane3_v2` in frontend/scripts/snap-nvda-v2-diff.mjs:1", "shortDescription": {"text": "Legacy-named symbol `pane3_v2` in frontend/scripts/snap-nvda-v2-diff.mjs:1"}, "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-1497939c89579458", "name": "Commented-code block (5 lines) in frontend/scripts/snap-c3-authed.mjs:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-c3-authed.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-468b104e31dcc2f7", "name": "Commented-code block (5 lines) in frontend/scripts/snap-diagram.mjs:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-diagram.mjs: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-36b924d8020d04b9", "name": "Commented-code block (5 lines) in frontend/scripts/snap-active.mjs:6", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-active.mjs:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-14ac15ab294691c3", "name": "Commented-code block (5 lines) in frontend/scripts/snap-vision-eval.mjs:7", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-vision-eval.mjs:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d91da4cfd0868a01", "name": "Commented-code block (5 lines) in frontend/scripts/snap-b3-empty-detail-cyan.mjs:5", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-b3-empty-detail-cyan.mjs:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8adf0ccc44268dec", "name": "Commented-code block (6 lines) in frontend/scripts/snap-c3-breadcrumb.mjs:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/scripts/snap-c3-breadcrumb.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aba0412c3938a2c4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/scripts/snap-c3-breadcrumb.mjs:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/scripts/snap-c3-breadcrumb.mjs:42"}, "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-0c7cbdbc587eb133", "name": "Commented-code block (8 lines) in frontend/scripts/snap-conditions.mjs:1", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/scripts/snap-conditions.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cf735d79933f8c2e", "name": "Commented-code block (5 lines) in frontend/scripts/snap-flow-pane3-scroll.mjs:5", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-flow-pane3-scroll.mjs:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4243a17cbb7fa916", "name": "Commented-code block (5 lines) in frontend/scripts/snap-pdca-loop-v2.mjs:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-pdca-loop-v2.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ab4c64309ce31fb6", "name": "Commented-code block (10 lines) in frontend/scripts/snap-forward-extras.mjs:1", "shortDescription": {"text": "Commented-code block (10 lines) in frontend/scripts/snap-forward-extras.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c15fd5831b089482", "name": "Commented-code block (7 lines) in frontend/scripts/snap-c3-keepmount.mjs:1", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/scripts/snap-c3-keepmount.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-756949ae787f6b0e", "name": "Commented-code block (6 lines) in frontend/scripts/snap-pdca-loop.mjs:4", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/scripts/snap-pdca-loop.mjs:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7f92639dbe14e38c", "name": "Commented-code block (6 lines) in frontend/scripts/snap-etf-holdings.mjs:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/scripts/snap-etf-holdings.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-18e958ddc41c8f4d", "name": "Commented-code block (5 lines) in frontend/scripts/snap-visual-regression.mjs:287", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-visual-regression.mjs:287"}, "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-bd490a4148d1be72", "name": "Commented-code block (5 lines) in frontend/scripts/snap-current-pillar2.mjs:5", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-current-pillar2.mjs:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2c64a809d3707843", "name": "Legacy-named symbol `flash_v2` in frontend/scripts/snap-flash-gm.mjs:18", "shortDescription": {"text": "Legacy-named symbol `flash_v2` in frontend/scripts/snap-flash-gm.mjs:18"}, "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-5ea806fa5f01a944", "name": "Commented-code block (9 lines) in frontend/scripts/snap-flash-gm.mjs:1", "shortDescription": {"text": "Commented-code block (9 lines) in frontend/scripts/snap-flash-gm.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7b81ad7cfdf49394", "name": "Commented-code block (6 lines) in frontend/scripts/build-articles.mjs:168", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/scripts/build-articles.mjs: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-de01c999609720e5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/scripts/build-articles.mjs:936", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/scripts/build-articles.mjs:936"}, "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-0657f38799cd0aab", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/scripts/fetch-tickers-cache.mjs:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/scripts/fetch-tickers-cache.mjs: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-4342d3148216702e", "name": "Commented-code block (5 lines) in frontend/scripts/snap-screener-hero.mjs:3", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-screener-hero.mjs: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-4ba74edda6962687", "name": "Commented-code block (5 lines) in frontend/scripts/snap-autopilot-c11r3.mjs:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-autopilot-c11r3.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-71d3d150e65e6110", "name": "Commented-code block (8 lines) in frontend/scripts/snap-flash-summary.mjs:1", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/scripts/snap-flash-summary.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5a6e217c26fd18e6", "name": "Commented-code block (6 lines) in frontend/scripts/snap-v5-dogfood.mjs:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/scripts/snap-v5-dogfood.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e9760f29fd4c2fa5", "name": "Commented-code block (6 lines) in frontend/scripts/snap-priceladder.mjs:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/scripts/snap-priceladder.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c3216637efe251fa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/scripts/snap-completeness-badge.mjs:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/scripts/snap-completeness-badge.mjs:37"}, "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-0d9842490787b407", "name": "Commented-code block (5 lines) in frontend/scripts/snap-baseline-pillar2.mjs:5", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-baseline-pillar2.mjs:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1b96b208b0e5f575", "name": "Legacy-named symbol `bs_holding_mode_v1` in frontend/src/App.jsx:244", "shortDescription": {"text": "Legacy-named symbol `bs_holding_mode_v1` in frontend/src/App.jsx:244"}, "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-3fffde9a6c108af3", "name": "Commented-code block (5 lines) in frontend/src/App.jsx:45", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/App.jsx:45"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-71f4c124f34400da", "name": "Commented-code block (8 lines) in frontend/src/api.js:45", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/api.js:45"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1dc78f4d86c12b21", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/api.js:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/api.js:48"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1e12db52ed1f31d7", "name": "Commented-code block (6 lines) in frontend/src/state/workspaceStore.js:33", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/state/workspaceStore.js:33"}, "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-8a3ee84feb199625", "name": "Commented-code block (7 lines) in frontend/src/utils/darkMode.js:3", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/utils/darkMode.js:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d823f9b45c625831", "name": "Commented-code block (6 lines) in frontend/src/components/EarningsHistoryChart.jsx:80", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/EarningsHistoryChart.jsx:80"}, "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-e593f65226bada5c", "name": "Commented-code block (10 lines) in frontend/src/components/ChartTab.jsx:346", "shortDescription": {"text": "Commented-code block (10 lines) in frontend/src/components/ChartTab.jsx:346"}, "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-298b5ddddad52233", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/ChartTab.jsx:193", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/ChartTab.jsx:193"}, "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-f45180e8db5093e5", "name": "Commented-code block (5 lines) in frontend/src/components/AnalystPanel.jsx:313", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/AnalystPanel.jsx:313"}, "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-fcd8ca8cd5a36633", "name": "Commented-code block (5 lines) in frontend/src/components/CupPivotCard.jsx:101", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/CupPivotCard.jsx:101"}, "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-a78e47893dab9741", "name": "Commented-code block (5 lines) in frontend/src/components/LandingPage.jsx:814", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/LandingPage.jsx:814"}, "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-74c7c9ad004c0d87", "name": "Legacy-named symbol `pane3_v2` in frontend/src/components/diagramEssence.js:12", "shortDescription": {"text": "Legacy-named symbol `pane3_v2` in frontend/src/components/diagramEssence.js:12"}, "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-4bca7d3db7d5e98e", "name": "Commented-code block (5 lines) in frontend/src/components/TodaysBriefSection.jsx:11", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/TodaysBriefSection.jsx:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a55927f0b4dae376", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/InsightsPanel.jsx:504", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/InsightsPanel.jsx:504"}, "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-ed95c2af219d9825", "name": "Commented-code block (6 lines) in frontend/src/components/GuidanceCard.jsx:101", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/GuidanceCard.jsx:101"}, "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-2660c4e0db286e87", "name": "Commented-code block (6 lines) in frontend/src/components/CustomScreenerPanel.jsx:59", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/CustomScreenerPanel.jsx:59"}, "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-a00b6c2bd317e2c7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/CustomScreenerPanel.jsx:1256", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/CustomScreenerPanel.jsx:1256"}, "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-15a3c8cb9bb6e0d9", "name": "Commented-code block (6 lines) in frontend/src/components/PriceLadder.jsx:451", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/PriceLadder.jsx:451"}, "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-8de60617c4e47eb6", "name": "Commented-code block (9 lines) in frontend/src/components/DiagramCard.jsx:30", "shortDescription": {"text": "Commented-code block (9 lines) in frontend/src/components/DiagramCard.jsx:30"}, "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-242df0f154b989d4", "name": "Commented-code block (5 lines) in frontend/src/components/PortfolioHistoryChart.jsx:302", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/PortfolioHistoryChart.jsx:302"}, "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-9038cccc630390e7", "name": "Commented-code block (5 lines) in frontend/src/components/EconomicCalendarSection.jsx:12", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/EconomicCalendarSection.jsx:12"}, "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-07baa080e3d6d6c2", "name": "Commented-code block (6 lines) in frontend/src/components/QuarterlyHistoryTable.jsx:246", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/QuarterlyHistoryTable.jsx:246"}, "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-5e075987d45c2a95", "name": "Commented-code block (7 lines) in frontend/src/components/SummaryBrief.jsx:66", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/components/SummaryBrief.jsx:66"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-513da1f1492fda79", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/SummaryBrief.jsx:251", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/SummaryBrief.jsx:251"}, "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-55070e32bf19f91b", "name": "Commented-code block (7 lines) in frontend/src/components/DiagramCitation.jsx:48", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/components/DiagramCitation.jsx: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-2567290c4557cacb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/TenKLinksPanel.jsx:5", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/TenKLinksPanel.jsx:5"}, "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-2f06e7833a4479e0", "name": "Commented-code block (7 lines) in frontend/src/components/TriageBanner.jsx:285", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/components/TriageBanner.jsx:285"}, "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-f82892112081c6f1", "name": "Commented-code block (5 lines) in frontend/src/components/AnalystTargetCard.jsx:67", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/AnalystTargetCard.jsx: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-249bef6ab0f80b98", "name": "Commented-code block (9 lines) in frontend/src/components/ConferenceAnalysis.jsx:7", "shortDescription": {"text": "Commented-code block (9 lines) in frontend/src/components/ConferenceAnalysis.jsx: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-6a02a327ecef344a", "name": "Commented-code block (5 lines) in frontend/src/components/DetailReport.jsx:991", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/DetailReport.jsx:991"}, "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-f65bf8b908edf044", "name": "Commented-code block (8 lines) in frontend/src/components/ForwardOutlookSection.jsx:76", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/components/ForwardOutlookSection.jsx: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-e55908af39618d9a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/ForwardOutlookSection.jsx:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/ForwardOutlookSection.jsx:16"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-966345ffb6f650ce", "name": "Legacy-named symbol `pane3_chart_style_v1` in frontend/src/components/StockPriceChart.jsx:11", "shortDescription": {"text": "Legacy-named symbol `pane3_chart_style_v1` in frontend/src/components/StockPriceChart.jsx:11"}, "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-ec73a670e45da463", "name": "Commented-code block (8 lines) in frontend/src/components/StockPriceChart.jsx:210", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/components/StockPriceChart.jsx: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-0d88672a92b1c5f3", "name": "Commented-code block (5 lines) in frontend/src/components/BacktestPage.jsx:430", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/BacktestPage.jsx:430"}, "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-db07ca34e93f8034", "name": "Commented-code block (5 lines) in frontend/src/components/ui/ProTeaser.jsx:41", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/ui/ProTeaser.jsx:41"}, "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-32962a728f1f15a2", "name": "Commented-code block (5 lines) in frontend/src/components/ui/Chip.jsx:37", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/ui/Chip.jsx:37"}, "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-625acff54ad18933", "name": "Commented-code block (8 lines) in frontend/src/lib/buyZoneLabels.js:73", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/lib/buyZoneLabels.js:73"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6e2b7ef49fa857ee", "name": "Commented-code block (5 lines) in frontend/src/lib/planGating.js:88", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/lib/planGating.js:88"}, "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-4d88ccbe3f4f5992", "name": "Commented-code block (6 lines) in frontend/src/lib/sentry.js:39", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/lib/sentry.js:39"}, "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-6fe32ff5dd807afe", "name": "Commented-code block (5 lines) in frontend/src/lib/holdings.js:189", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/lib/holdings.js:189"}, "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-4ef345ea59ff8d3b", "name": "Legacy-named symbol `pane3_v2` in frontend/src/lib/featureFlags.js:5", "shortDescription": {"text": "Legacy-named symbol `pane3_v2` in frontend/src/lib/featureFlags.js:5"}, "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-dbfe5e6efae84098", "name": "Commented-code block (7 lines) in frontend/src/lib/blocklist.js:72", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/lib/blocklist.js:72"}, "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-cc3e5e58f2e917fc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/usePortfolioPrices.js:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/usePortfolioPrices.js:17"}, "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-d7e19eb8d751a55b", "name": "Commented-code block (5 lines) in frontend/src/hooks/useSubscription.js:7", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/hooks/useSubscription.js: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-6796390670c9c69e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useSubscription.js:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useSubscription.js:7"}, "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-7f64146f98c7aaa3", "name": "Legacy-named symbol `bs_translation_cache_v1` in frontend/src/hooks/useTranslation.js:9", "shortDescription": {"text": "Legacy-named symbol `bs_translation_cache_v1` in frontend/src/hooks/useTranslation.js:9"}, "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-8261e9b118f2ee69", "name": "Commented-code block (6 lines) in frontend/src/features/cmd-palette/CmdPalette.jsx:40", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/features/cmd-palette/CmdPalette.jsx: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-21cc881fae679a38", "name": "Commented-code block (5 lines) in frontend/src/features/workspace/ScreenerPane.jsx:209", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/workspace/ScreenerPane.jsx:209"}, "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-776c207029a59224", "name": "Commented-code block (8 lines) in frontend/src/features/workspace/WorkspaceShell.jsx:27", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/features/workspace/WorkspaceShell.jsx: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-3b18139467cad7b0", "name": "Commented-code block (7 lines) in frontend/src/features/workspace/IndicesView.jsx:80", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/features/workspace/IndicesView.jsx:80"}, "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-a2b6e775f8997c87", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/workspace/IndicesView.jsx:2800", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/workspace/IndicesView.jsx:2800"}, "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-9d63dadb1ab2aff7", "name": "Commented-code block (7 lines) in frontend/src/features/workspace/Workspace.jsx:96", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/features/workspace/Workspace.jsx:96"}, "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-e8cafca63effe9ad", "name": "Commented-code block (5 lines) in frontend/src/features/workspace/useUrlSync.js:27", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/workspace/useUrlSync.js: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-748749a843d64709", "name": "Commented-code block (5 lines) in frontend/src/features/judgment/state/useJudgmentResult.js:89", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/judgment/state/useJudgmentResult.js:89"}, "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-feb41521e61b5622", "name": "Commented-code block (5 lines) in frontend/src/features/judgment/primitives/TtmValuationPanel.jsx:185", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/judgment/primitives/TtmValuationPanel.jsx:185"}, "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-296453e5ee538af6", "name": "Commented-code block (6 lines) in frontend/src/features/judgment/primitives/SectionFadeSubtle.jsx:50", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/features/judgment/primitives/SectionFadeSubtle.jsx:50"}, "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-2e47811caf59c6e0", "name": "Legacy-named symbol `pane3_scroll_v1` in frontend/src/features/judgment/primitives/AccordionSection.jsx:72", "shortDescription": {"text": "Legacy-named symbol `pane3_scroll_v1` in frontend/src/features/judgment/primitives/AccordionSection.jsx:72"}, "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-836c435660f69c31", "name": "Commented-code block (5 lines) in frontend/src/features/judgment/primitives/AccordionSection.jsx:132", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/judgment/primitives/AccordionSection.jsx:132"}, "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-704b83c7da01335c", "name": "Commented-code block (5 lines) in frontend/src/features/judgment/primitives/SectorDonut.jsx:97", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/judgment/primitives/SectorDonut.jsx:97"}, "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-e38161aff175df1b", "name": "Commented-code block (5 lines) in frontend/src/features/judgment/primitives/ReturnGrid.jsx:53", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/judgment/primitives/ReturnGrid.jsx:53"}, "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-481fcf12487b7d4a", "name": "Commented-code block (9 lines) in frontend/src/features/judgment/primitives/SectionFade.jsx:58", "shortDescription": {"text": "Commented-code block (9 lines) in frontend/src/features/judgment/primitives/SectionFade.jsx:58"}, "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-065b186de1d61db0", "name": "Commented-code block (5 lines) in frontend/src/features/judgment/constants/stateCompassText.js:27", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/judgment/constants/stateCompassText.js: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-22ce03b24706acc6", "name": "Legacy-named symbol `pane3_v2` in frontend/src/features/judgment/components/detail/JudgmentDetail.jsx:74", "shortDescription": {"text": "Legacy-named symbol `pane3_v2` in frontend/src/features/judgment/components/detail/JudgmentDetail.jsx:74"}, "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-d77e77cba9d50eb6", "name": "Commented-code block (5 lines) in frontend/src/features/judgment/components/detail/JudgmentDetail.jsx:134", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/judgment/components/detail/JudgmentDetail.jsx: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-66ca472a5a66a3c6", "name": "Commented-code block (5 lines) in frontend/src/features/judgment/components/detail/ProfileCard.jsx:61", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/judgment/components/detail/ProfileCard.jsx:61"}, "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-3007ec1b7d32c6d9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/judgment/components/detail/ProfileCard.jsx:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/judgment/components/detail/ProfileCard.jsx: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-b7c0f2dcc4a713b4", "name": "Commented-code block (5 lines) in frontend/src/features/judgment/components/detail/ConditionRow.jsx:47", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/judgment/components/detail/ConditionRow.jsx:47"}, "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-9a416c2e33973102", "name": "Commented-code block (5 lines) in frontend/src/features/judgment/components/detail/ConditionSparkline.jsx:72", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/features/judgment/components/detail/ConditionSparkline.jsx:72"}, "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-9c441148cf9fa48c", "name": "Commented-code block (7 lines) in frontend/src/features/judgment/components/detail/FiveConditionsCard.jsx:105", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/features/judgment/components/detail/FiveConditionsCard.jsx:105"}, "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-42133e89043e6692", "name": "Legacy-named symbol `pane3_v2` in frontend/src/features/judgment/components/detail/Hero.jsx:152", "shortDescription": {"text": "Legacy-named symbol `pane3_v2` in frontend/src/features/judgment/components/detail/Hero.jsx:152"}, "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-44e03b2c0c1287cc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/judgment/components/detail/sections/StickyDiagramAcc", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/judgment/components/detail/sections/StickyDiagramAccordion.jsx:131"}, "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-5afef1cd494063cc", "name": "Legacy-named symbol `flash_v2` in frontend/src/features/judgment/components/detail/sections/EarningsFlashSummary.jsx:112", "shortDescription": {"text": "Legacy-named symbol `flash_v2` in frontend/src/features/judgment/components/detail/sections/EarningsFlashSummary.jsx:112"}, "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-beec34f1c8077a79", "name": "Commented-code block (8 lines) in frontend/src/features/judgment/components/detail/sections/EarningsFlashSummary.jsx:49", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/features/judgment/components/detail/sections/EarningsFlashSummary.jsx:49"}, "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-908a3d963369d5ab", "name": "Commented-code block (6 lines) in frontend/src/features/judgment/components/shared/PremiumLock.jsx:44", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/features/judgment/components/shared/PremiumLock.jsx: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-956d12100d16be01", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/articles/ArticlePage.jsx:64", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/articles/ArticlePage.jsx: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-49778df2272f06ea", "name": "Commented-code block (6 lines) in frontend/src/features/articles/ArticleBody.jsx:88", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/features/articles/ArticleBody.jsx:88"}, "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-ae8326aa78b49641", "name": "Legacy-named symbol `bs_theme_v2` in frontend-next/app/layout.tsx:22", "shortDescription": {"text": "Legacy-named symbol `bs_theme_v2` in frontend-next/app/layout.tsx:22"}, "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-33398e4c0ea4a7f5", "name": "Commented-code block (6 lines) in backend/tests/article_pipeline/test_fact_checker.py:320", "shortDescription": {"text": "Commented-code block (6 lines) in backend/tests/article_pipeline/test_fact_checker.py:320"}, "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-620d28683440e1c1", "name": "Commented-code block (5 lines) in backend/app/fmp_client.py:87", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/fmp_client.py:87"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-71d851b41b7b1150", "name": "Commented-code block (5 lines) in backend/app/judgment.py:236", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/judgment.py:236"}, "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-183165a49d21b977", "name": "Commented-code block (6 lines) in backend/app/og_image_generator.py:131", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/og_image_generator.py:131"}, "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-9ad07f0a689f6ec2", "name": "Commented-code block (9 lines) in backend/app/transcript_source.py:64", "shortDescription": {"text": "Commented-code block (9 lines) in backend/app/transcript_source.py: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-78f2a6f1c1b5c6d4", "name": "Commented-code block (9 lines) in backend/app/article_pipeline/__init__.py:23", "shortDescription": {"text": "Commented-code block (9 lines) in backend/app/article_pipeline/__init__.py:23"}, "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-fb776537d073b149", "name": "Commented-code block (5 lines) in backend/app/article_pipeline/fact_checker.py:48", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/article_pipeline/fact_checker.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-a56ff9c5ccdfb27d", "name": "Commented-code block (5 lines) in backend/app/article_pipeline/storage.py:148", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/article_pipeline/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-50d6456708534445", "name": "Commented-code block (7 lines) in backend/app/article_pipeline/sources.py:46", "shortDescription": {"text": "Commented-code block (7 lines) in backend/app/article_pipeline/sources.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-36401d3909f4db51", "name": "Commented-code block (6 lines) in backend/app/article_pipeline/writer.py:140", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/article_pipeline/writer.py:140"}, "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-8365ac2549a7cb08", "name": "Commented-code block (6 lines) in backend/app/aggregator/guidance_history.py:34", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/aggregator/guidance_history.py:34"}, "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-4cd2be747cbde492", "name": "Commented-code block (7 lines) in backend/app/visualizer/prompt.py:20", "shortDescription": {"text": "Commented-code block (7 lines) in backend/app/visualizer/prompt.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-d83c1c88d0cb4903", "name": "Commented-code block (6 lines) in backend/app/visualizer/profile_summary.py:360", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/visualizer/profile_summary.py:360"}, "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-4d223bfdf539b12d", "name": "42 env vars used in code but missing from .env.example", "shortDescription": {"text": "42 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ALPHA_VANTAGE_API_KEY`, `APP_BASE_URL`, `BASE`, `BYPASS_TOKEN`, `CANONICAL_BASE_URL`, `CI`, `DEV`, `DOGFOOD_TEST_EMAIL` + 34 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/app/fmp_client.py:batch_quotes, backend/app/fmp_client.py:batch_quote\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-d21e79d1aed73540", "name": "FastAPI POST `generate_articles_endpoint` without auth dependency \u2014 backend/app/article_pipeline/router.py:33", "shortDescription": {"text": "FastAPI POST `generate_articles_endpoint` without auth dependency \u2014 backend/app/article_pipeline/router.py:33"}, "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-8dd635993a0a0753", "name": "Dangling fetch: POST /api/analyze (frontend/scripts/sentry-verify.mjs:23)", "shortDescription": {"text": "Dangling fetch: POST /api/analyze (frontend/scripts/sentry-verify.mjs:23)"}, "fullDescription": {"text": "`frontend/scripts/sentry-verify.mjs:23` calls `POST /api/analyze` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/analyze`\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-abdc296159fd474b", "name": "Dangling fetch: GET /api/profile-summary/${t}${qs} (frontend/src/api.js:901)", "shortDescription": {"text": "Dangling fetch: GET /api/profile-summary/${t}${qs} (frontend/src/api.js:901)"}, "fullDescription": {"text": "`frontend/src/api.js:901` calls `GET /api/profile-summary/${t}${qs}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/profile-summary/<p>/<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-09183b88ecf57489", "name": "Unused endpoint: GET /api/sitemap.xml", "shortDescription": {"text": "Unused endpoint: GET /api/sitemap.xml"}, "fullDescription": {"text": "`backend/app/sitemap.py` declares `GET /api/sitemap.xml` 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-9ff6d8b7a61de4c4", "name": "Unused endpoint: GET /api/sentry-debug", "shortDescription": {"text": "Unused endpoint: GET /api/sentry-debug"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/sentry-debug` 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-658b1476c982bc19", "name": "Unused endpoint: POST /api/sentry-tunnel", "shortDescription": {"text": "Unused endpoint: POST /api/sentry-tunnel"}, "fullDescription": {"text": "`backend/app/main.py` declares `POST /api/sentry-tunnel` 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-03be48c3ac3ff9f7", "name": "Unused endpoint: GET /api/sample-pass", "shortDescription": {"text": "Unused endpoint: GET /api/sample-pass"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/sample-pass` 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-af59e3e822ddb2e5", "name": "Unused endpoint: GET /api/demo/analyze/{ticker}", "shortDescription": {"text": "Unused endpoint: GET /api/demo/analyze/{ticker}"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/demo/analyze/{ticker}` 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-66163527ffbf9f3c", "name": "Unused endpoint: GET /api/analyze/{ticker}", "shortDescription": {"text": "Unused endpoint: GET /api/analyze/{ticker}"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/analyze/{ticker}` 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-44ccd3a27edac2da", "name": "Unused endpoint: GET /api/etf-info/{ticker}", "shortDescription": {"text": "Unused endpoint: GET /api/etf-info/{ticker}"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/etf-info/{ticker}` 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-f1c0f2236abbd36c", "name": "Unused endpoint: GET /api/etf-exposure/{ticker}", "shortDescription": {"text": "Unused endpoint: GET /api/etf-exposure/{ticker}"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/etf-exposure/{ticker}` 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-b0a322b00d4bf653", "name": "Unused endpoint: GET /api/backtest", "shortDescription": {"text": "Unused endpoint: GET /api/backtest"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/backtest` 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-9e8e5c28c1fcb9f5", "name": "Unused endpoint: GET /api/historical-dividends/{ticker}", "shortDescription": {"text": "Unused endpoint: GET /api/historical-dividends/{ticker}"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/historical-dividends/{ticker}` 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-ce28cf83c5e6b34b", "name": "Unused endpoint: GET /api/guidance/{ticker}/quarterly-history", "shortDescription": {"text": "Unused endpoint: GET /api/guidance/{ticker}/quarterly-history"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/guidance/{ticker}/quarterly-history` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a81d0a29ca172f79", "name": "Unused endpoint: GET /api/guidance/{ticker}/basic", "shortDescription": {"text": "Unused endpoint: GET /api/guidance/{ticker}/basic"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/guidance/{ticker}/basic` 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-8d50066e11134876", "name": "Unused endpoint: GET /api/cache/status", "shortDescription": {"text": "Unused endpoint: GET /api/cache/status"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/cache/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-cfecdf0c4ffe4de7", "name": "Unused endpoint: GET /api/debug/earnings/{ticker}", "shortDescription": {"text": "Unused endpoint: GET /api/debug/earnings/{ticker}"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/debug/earnings/{ticker}` 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-cee61f79c027e3c7", "name": "Unused endpoint: GET /api/price-history/{ticker}", "shortDescription": {"text": "Unused endpoint: GET /api/price-history/{ticker}"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/price-history/{ticker}` 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-b616b662fc838269", "name": "Unused endpoint: GET /api/period-returns/{ticker}", "shortDescription": {"text": "Unused endpoint: GET /api/period-returns/{ticker}"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/period-returns/{ticker}` 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-9462b76b4e8186c0", "name": "Unused endpoint: GET /api/news/{ticker}", "shortDescription": {"text": "Unused endpoint: GET /api/news/{ticker}"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/news/{ticker}` 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-53776d49048a9cf6", "name": "Unused endpoint: GET /api/ir-links/{ticker}", "shortDescription": {"text": "Unused endpoint: GET /api/ir-links/{ticker}"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/ir-links/{ticker}` 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-f6ea07eddd82ba90", "name": "Unused endpoint: GET /api/profile-summary/{ticker}", "shortDescription": {"text": "Unused endpoint: GET /api/profile-summary/{ticker}"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/profile-summary/{ticker}` 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-576eb93a297d7ce2", "name": "Unused endpoint: POST /api/summary/brief", "shortDescription": {"text": "Unused endpoint: POST /api/summary/brief"}, "fullDescription": {"text": "`backend/app/main.py` declares `POST /api/summary/brief` 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-c5d417b68c43d80c", "name": "Unused endpoint: POST /api/summary/detail", "shortDescription": {"text": "Unused endpoint: POST /api/summary/detail"}, "fullDescription": {"text": "`backend/app/main.py` declares `POST /api/summary/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-cbfb9525aaeabd4f", "name": "Unused endpoint: GET /api/analyst/consensus-drift", "shortDescription": {"text": "Unused endpoint: GET /api/analyst/consensus-drift"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/analyst/consensus-drift` 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-00463fb32f3596c2", "name": "Unused endpoint: GET /api/chart/{ticker}/candles", "shortDescription": {"text": "Unused endpoint: GET /api/chart/{ticker}/candles"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/chart/{ticker}/candles` 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-4cca9d4fe6251b3d", "name": "Unused endpoint: GET /api/technical/{ticker}", "shortDescription": {"text": "Unused endpoint: GET /api/technical/{ticker}"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/technical/{ticker}` 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-827e68478e8942dd", "name": "Unused endpoint: GET /api/movers/debug", "shortDescription": {"text": "Unused endpoint: GET /api/movers/debug"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/movers/debug` 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-69ee7e5287c8bc43", "name": "Unused endpoint: GET /api/movers/stream", "shortDescription": {"text": "Unused endpoint: GET /api/movers/stream"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/movers/stream` 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-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6b6edfcd307c922d", "name": "Unused endpoint: GET /api/ogp/{ticker}", "shortDescription": {"text": "Unused endpoint: GET /api/ogp/{ticker}"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/ogp/{ticker}` 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-c643b7b59c9eedff", "name": "Unused endpoint: ANY /api/ogp/cache/clear", "shortDescription": {"text": "Unused endpoint: ANY /api/ogp/cache/clear"}, "fullDescription": {"text": "`backend/app/main.py` declares `ANY /api/ogp/cache/clear` 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-2e36b9e65c34e6dd", "name": "Unused endpoint: GET /api/og-image-today.png", "shortDescription": {"text": "Unused endpoint: GET /api/og-image-today.png"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/og-image-today.png` 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-7f38258d757c846c", "name": "Unused endpoint: ANY /api/og-image-today/regenerate", "shortDescription": {"text": "Unused endpoint: ANY /api/og-image-today/regenerate"}, "fullDescription": {"text": "`backend/app/main.py` declares `ANY /api/og-image-today/regenerate` 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-268cab242d76588c", "name": "Unused endpoint: GET /api/og-image-backtest.png", "shortDescription": {"text": "Unused endpoint: GET /api/og-image-backtest.png"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/og-image-backtest.png` 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-a430f87ec1f8a2b3", "name": "Unused endpoint: ANY /api/og-image-backtest/regenerate", "shortDescription": {"text": "Unused endpoint: ANY /api/og-image-backtest/regenerate"}, "fullDescription": {"text": "`backend/app/main.py` declares `ANY /api/og-image-backtest/regenerate` 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-765e04e29faa0cdd", "name": "Unused endpoint: GET /api/backtest/methodology.pdf", "shortDescription": {"text": "Unused endpoint: GET /api/backtest/methodology.pdf"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/backtest/methodology.pdf` 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-11f7633c8e85a643", "name": "Unused endpoint: ANY /api/backtest/methodology/regenerate", "shortDescription": {"text": "Unused endpoint: ANY /api/backtest/methodology/regenerate"}, "fullDescription": {"text": "`backend/app/main.py` declares `ANY /api/backtest/methodology/regenerate` 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-70fd29dcffee518d", "name": "Unused endpoint: POST /api/profile-summary/refresh/batch", "shortDescription": {"text": "Unused endpoint: POST /api/profile-summary/refresh/batch"}, "fullDescription": {"text": "`backend/app/main.py` declares `POST /api/profile-summary/refresh/batch` 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-28f8163bdfdff842", "name": "Unused endpoint: POST /api/insights/refresh/batch", "shortDescription": {"text": "Unused endpoint: POST /api/insights/refresh/batch"}, "fullDescription": {"text": "`backend/app/main.py` declares `POST /api/insights/refresh/batch` 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-6a56c6ccc07d4162", "name": "Unused endpoint: POST /api/admin/refresh-earnings-history", "shortDescription": {"text": "Unused endpoint: POST /api/admin/refresh-earnings-history"}, "fullDescription": {"text": "`backend/app/main.py` declares `POST /api/admin/refresh-earnings-history` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7ef180012dac02cc", "name": "Unused endpoint: POST /api/insights/refresh/{ticker}", "shortDescription": {"text": "Unused endpoint: POST /api/insights/refresh/{ticker}"}, "fullDescription": {"text": "`backend/app/main.py` declares `POST /api/insights/refresh/{ticker}` 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-5aa26d02face9f0b", "name": "Unused endpoint: ANY /api/insights/cache/clear", "shortDescription": {"text": "Unused endpoint: ANY /api/insights/cache/clear"}, "fullDescription": {"text": "`backend/app/main.py` declares `ANY /api/insights/cache/clear` 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-063a8fbe9339cce2", "name": "Unused endpoint: ANY /api/av/cache/clear", "shortDescription": {"text": "Unused endpoint: ANY /api/av/cache/clear"}, "fullDescription": {"text": "`backend/app/main.py` declares `ANY /api/av/cache/clear` 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-295df4d3d93d97bd", "name": "Unused endpoint: POST /api/cron/cup-scan", "shortDescription": {"text": "Unused endpoint: POST /api/cron/cup-scan"}, "fullDescription": {"text": "`backend/app/main.py` declares `POST /api/cron/cup-scan` 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-4d3a408080cec0b6", "name": "Unused endpoint: POST /api/cron/pattern-signals-cleanup", "shortDescription": {"text": "Unused endpoint: POST /api/cron/pattern-signals-cleanup"}, "fullDescription": {"text": "`backend/app/main.py` declares `POST /api/cron/pattern-signals-cleanup` 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-227be0ae94c66856", "name": "Unused endpoint: POST /api/cron/cup-notify", "shortDescription": {"text": "Unused endpoint: POST /api/cron/cup-notify"}, "fullDescription": {"text": "`backend/app/main.py` declares `POST /api/cron/cup-notify` 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-faa7383cefda707b", "name": "Unused endpoint: POST /api/cron/article-notify", "shortDescription": {"text": "Unused endpoint: POST /api/cron/article-notify"}, "fullDescription": {"text": "`backend/app/main.py` declares `POST /api/cron/article-notify` 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-52f620728c401b27", "name": "Unused endpoint: POST /api/cron/rs-scan", "shortDescription": {"text": "Unused endpoint: POST /api/cron/rs-scan"}, "fullDescription": {"text": "`backend/app/main.py` declares `POST /api/cron/rs-scan` 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-4c960edc87190ddd", "name": "Unused endpoint: POST /api/cron/consensus-snapshot", "shortDescription": {"text": "Unused endpoint: POST /api/cron/consensus-snapshot"}, "fullDescription": {"text": "`backend/app/main.py` declares `POST /api/cron/consensus-snapshot` 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-a28ca24b80aa7cf8", "name": "Unused endpoint: POST /api/cron/guidance-snapshot", "shortDescription": {"text": "Unused endpoint: POST /api/cron/guidance-snapshot"}, "fullDescription": {"text": "`backend/app/main.py` declares `POST /api/cron/guidance-snapshot` 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-8b6482c00ae262bb", "name": "Unused endpoint: POST /api/cron/guidance-backfill", "shortDescription": {"text": "Unused endpoint: POST /api/cron/guidance-backfill"}, "fullDescription": {"text": "`backend/app/main.py` declares `POST /api/cron/guidance-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-a58676791626ce60", "name": "Unused endpoint: GET /api/scanner/canslim", "shortDescription": {"text": "Unused endpoint: GET /api/scanner/canslim"}, "fullDescription": {"text": "`backend/app/main.py` declares `GET /api/scanner/canslim` 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/23120"}, "properties": {"repository": "yamada073526/beatscanner", "repoUrl": "https://github.com/yamada073526/beatscanner", "branch": "main"}, "results": [{"ruleId": "scanner-0380c645a299647e", "level": "note", "message": {"text": "Possibly dead Python function: handle_data"}, "properties": {"repobilityId": "3a673a278f4fc1e6", "scanner": "scanner-primary", "fingerprint": "0380c645a299647e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/scripts/dogfood_8k_presence.py:30"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4013d843a459dd74", "level": "note", "message": {"text": "Possibly dead Python function: earning_calendar"}, "properties": {"repobilityId": "91d0f5d407435d8f", "scanner": "scanner-primary", "fingerprint": "4013d843a459dd74", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/fmp_client.py:64"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-274535ed6b345715", "level": "note", "message": {"text": "Possibly dead Python function: etf_sector_weightings"}, "properties": {"repobilityId": "d16e64c570fef53a", "scanner": "scanner-primary", "fingerprint": "274535ed6b345715", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/fmp_client.py:129"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-132fa6fcd28f5614", "level": "note", "message": {"text": "Possibly dead Python function: analyst_recommendations"}, "properties": {"repobilityId": "ea97f4a6bd8371f3", "scanner": "scanner-primary", "fingerprint": "132fa6fcd28f5614", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/fmp_client.py:173"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-99378abe1e90383a", "level": "note", "message": {"text": "Possibly dead Python function: sort_key"}, "properties": {"repobilityId": "ac2a4181eae38738", "scanner": "scanner-primary", "fingerprint": "99378abe1e90383a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/earnings_mailer.py:592"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e7d8ad5f9744f731", "level": "note", "message": {"text": "Possibly dead Python function: send_cup_handle_digest"}, "properties": {"repobilityId": "2fab2633edf733cc", "scanner": "scanner-primary", "fingerprint": "e7d8ad5f9744f731", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/mailer.py:195"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0903ff52ca0fbd38", "level": "note", "message": {"text": "Possibly dead Python function: send_article_digest"}, "properties": {"repobilityId": "efdb385aa5dc46fe", "scanner": "scanner-primary", "fingerprint": "0903ff52ca0fbd38", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/mailer.py:333"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ee430dc9d4428b97", "level": "note", "message": {"text": "Possibly dead Python function: generate_ogp_image"}, "properties": {"repobilityId": "9841decdfe92db38", "scanner": "scanner-primary", "fingerprint": "ee430dc9d4428b97", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/ogp_generator.py:64"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8a28331bc085e587", "level": "note", "message": {"text": "Possibly dead Python function: render_static_fallback"}, "properties": {"repobilityId": "ddabf19e8cf7c8a4", "scanner": "scanner-primary", "fingerprint": "8a28331bc085e587", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/og_image_generator.py:386"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-61577952161d31d8", "level": "note", "message": {"text": "Possibly dead Python function: generate_backtest_og_image"}, "properties": {"repobilityId": "322a01a8a9e48915", "scanner": "scanner-primary", "fingerprint": "61577952161d31d8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/og_image_generator.py:396"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0f925a213398e7d3", "level": "note", "message": {"text": "Possibly dead Python function: render_backtest_fallback"}, "properties": {"repobilityId": "0a2575b436672721", "scanner": "scanner-primary", "fingerprint": "0f925a213398e7d3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/og_image_generator.py:582"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-26563e9fb1bf08c2", "level": "note", "message": {"text": "Possibly dead Python function: generate_backtest_methodology_pdf"}, "properties": {"repobilityId": "4be453f44c461d04", "scanner": "scanner-primary", "fingerprint": "26563e9fb1bf08c2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/og_image_generator.py:693"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-164ca68220c116fb", "level": "note", "message": {"text": "Possibly dead Python function: prepare_image_data"}, "properties": {"repobilityId": "6a0725d553d0ff74", "scanner": "scanner-primary", "fingerprint": "164ca68220c116fb", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/og_image_generator.py:921"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6d5dd22de9a6b64a", "level": "note", "message": {"text": "Possibly dead Python function: filter"}, "properties": {"repobilityId": "7da968b6f6ed2422", "scanner": "scanner-primary", "fingerprint": "6d5dd22de9a6b64a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/main.py:136"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6f0b82c762e2e67c", "level": "note", "message": {"text": "Possibly dead Python function: handle_starttag"}, "properties": {"repobilityId": "3bf216d149959ebf", "scanner": "scanner-primary", "fingerprint": "6f0b82c762e2e67c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/main.py:5537"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d34215290a0b15f5", "level": "note", "message": {"text": "Possibly dead Python function: handle_endtag"}, "properties": {"repobilityId": "7eb6f3decafc1766", "scanner": "scanner-primary", "fingerprint": "d34215290a0b15f5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/main.py:5541"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-775e57bbe6dcd5ac", "level": "note", "message": {"text": "Possibly dead Python function: handle_data"}, "properties": {"repobilityId": "3a673a278f4fc1e6", "scanner": "scanner-primary", "fingerprint": "775e57bbe6dcd5ac", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/main.py:5545"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-442d50243392291d", "level": "note", "message": {"text": "Possibly dead Python function: formatMetricsTrend_py"}, "properties": {"repobilityId": "5832bf0ead1c5980", "scanner": "scanner-primary", "fingerprint": "442d50243392291d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/main.py:11052"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-26f44f06c9b4868d", "level": "note", "message": {"text": "Possibly dead Python function: summarize"}, "properties": {"repobilityId": "2f031b6e55dee53f", "scanner": "scanner-primary", "fingerprint": "26f44f06c9b4868d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/aggregator/insider.py:57"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b6c819ea864380d0", "level": "note", "message": {"text": "Possibly dead Python function: candidate_quarters"}, "properties": {"repobilityId": "8455293654678185", "scanner": "scanner-primary", "fingerprint": "b6c819ea864380d0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/aggregator/institutional.py:31"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-89a245e37a7ef655", "level": "note", "message": {"text": "Possibly dead Python function: summarize"}, "properties": {"repobilityId": "2f031b6e55dee53f", "scanner": "scanner-primary", "fingerprint": "89a245e37a7ef655", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/aggregator/institutional.py:68"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4cf54e1fef3dd9ed", "level": "note", "message": {"text": "Possibly dead Python function: summarize"}, "properties": {"repobilityId": "2f031b6e55dee53f", "scanner": "scanner-primary", "fingerprint": "4cf54e1fef3dd9ed", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/aggregator/congress.py:49"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8eb90929ef33bd6d", "level": "note", "message": {"text": "Possibly dead Python function: build_flow_svg"}, "properties": {"repobilityId": "70469d584827b87a", "scanner": "scanner-primary", "fingerprint": "8eb90929ef33bd6d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/visualizer/flow_builder.py:24"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9998440ff4ae5796", "level": "note", "message": {"text": "Possibly dead Python function: clear_cache"}, "properties": {"repobilityId": "089acf3efecdf10a", "scanner": "scanner-primary", "fingerprint": "9998440ff4ae5796", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/visualizer/profile_summary.py:599"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fbd8c2bc6da7f386", "level": "note", "message": {"text": "Possibly dead Python function: compute_surprise_pct"}, "properties": {"repobilityId": "bf19e9e0a8a5472d", "scanner": "scanner-primary", "fingerprint": "fbd8c2bc6da7f386", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/visualizer/calc.py:48"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5efa09a68845fbc5", "level": "note", "message": {"text": "Possibly dead Python function: build_precomputed_metrics"}, "properties": {"repobilityId": "40e5f66c7a0c3b14", "scanner": "scanner-primary", "fingerprint": "5efa09a68845fbc5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/visualizer/calc.py:212"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fb6ca466aaabbe7b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/CalendarPanel.jsx:251"}, "properties": {"repobilityId": "e234e691fb49f44e", "scanner": "scanner-primary", "fingerprint": "fb6ca466aaabbe7b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-68634b276215654a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ScreenerPanel.jsx:101"}, "properties": {"repobilityId": "52450605988c6f5c", "scanner": "scanner-primary", "fingerprint": "68634b276215654a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c23e08d103ad010e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/IRLinksPanel.jsx:30"}, "properties": {"repobilityId": "7d95e0c2f828f1df", "scanner": "scanner-primary", "fingerprint": "c23e08d103ad010e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2b47e5940123f4bb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/TodaysBriefSection.jsx:188"}, "properties": {"repobilityId": "cdebf44cf6e171dc", "scanner": "scanner-primary", "fingerprint": "2b47e5940123f4bb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1be32bf59720620a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ResultBadge.jsx:28"}, "properties": {"repobilityId": "7b448b74b923b073", "scanner": "scanner-primary", "fingerprint": "1be32bf59720620a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ff8935561f582ea3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/CustomScreenerPanel.jsx:436"}, "properties": {"repobilityId": "94f9bdc4d4159bf7", "scanner": "scanner-primary", "fingerprint": "ff8935561f582ea3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bbaf5f9712d88795", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/DiagramCard.jsx:3"}, "properties": {"repobilityId": "509365cf621de635", "scanner": "scanner-primary", "fingerprint": "bbaf5f9712d88795", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-3d752f443ae07846", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 frontend/src/components/UpgradeModal.jsx:134"}, "properties": {"repobilityId": "20ca5b95e310f748", "scanner": "scanner-primary", "fingerprint": "3d752f443ae07846", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-d28a344f7d527594", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/TickerSearch.jsx:247"}, "properties": {"repobilityId": "8358f2238a01f0ea", "scanner": "scanner-primary", "fingerprint": "d28a344f7d527594", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8c163e4eb5196782", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/components/TickerSearch.jsx:237"}, "properties": {"repobilityId": "e840e469eedc09ea", "scanner": "scanner-primary", "fingerprint": "8c163e4eb5196782", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-b7e6f98ddffff01b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/TenKLinksPanel.jsx:115"}, "properties": {"repobilityId": "868066397d6009ba", "scanner": "scanner-primary", "fingerprint": "b7e6f98ddffff01b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-403aa80d940de6a6", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/DetailReport.jsx:878"}, "properties": {"repobilityId": "f877e102208b6fa4", "scanner": "scanner-primary", "fingerprint": "403aa80d940de6a6", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b061a61443f97a20", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/lib/__tests__/blocklist.test.js:40"}, "properties": {"repobilityId": "c9c644af8f224dca", "scanner": "scanner-primary", "fingerprint": "b061a61443f97a20", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4202a0630f1a891d", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/features/workspace/IndicesView.jsx:1029"}, "properties": {"repobilityId": "7033651284832641", "scanner": "scanner-primary", "fingerprint": "4202a0630f1a891d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-e4bfc6f0d0f4d9df", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/features/judgment/constants/__tests__/completenessLedger.test.js:173"}, "properties": {"repobilityId": "61807119accf70fc", "scanner": "scanner-primary", "fingerprint": "e4bfc6f0d0f4d9df", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b456b3902b6eb6c4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend-next/app/layout.tsx:45"}, "properties": {"repobilityId": "19ededaed7ede5d6", "scanner": "scanner-primary", "fingerprint": "b456b3902b6eb6c4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a440e226d204f9a5", "level": "warning", "message": {"text": "Privileged port 19 in use"}, "properties": {"repobilityId": "a6b5b06deac36eac", "scanner": "scanner-primary", "fingerprint": "a440e226d204f9a5", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/generate_article.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-10a3026860efe506", "level": "warning", "message": {"text": "Privileged port 5 in use"}, "properties": {"repobilityId": "a8f80b4866464301", "scanner": "scanner-primary", "fingerprint": "10a3026860efe506", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/generate_article.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cd490395eb509bdd", "level": "warning", "message": {"text": "Privileged port 4 in use"}, "properties": {"repobilityId": "1594bfeff919296e", "scanner": "scanner-primary", "fingerprint": "cd490395eb509bdd", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/generate_article.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-349412f2aa40afae", "level": "warning", "message": {"text": "Privileged port 35 in use"}, "properties": {"repobilityId": "e997ec9811d79c6d", "scanner": "scanner-primary", "fingerprint": "349412f2aa40afae", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/generate_daily_digest.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-18572843fad97036", "level": "warning", "message": {"text": "Privileged port 17 in use"}, "properties": {"repobilityId": "0bf38fb8f89ec589", "scanner": "scanner-primary", "fingerprint": "18572843fad97036", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/morning_health.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d63da3583b14afc0", "level": "warning", "message": {"text": "Dockerfile runs as root: Dockerfile"}, "properties": {"repobilityId": "a2ed1bd120e507db", "scanner": "scanner-primary", "fingerprint": "d63da3583b14afc0", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-835eae4c7f17a2f8", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "0fa65ac1bd81673e", "scanner": "scanner-primary", "fingerprint": "835eae4c7f17a2f8", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-397fd4515e7f8f0e", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim-bookworm"}, "properties": {"repobilityId": "d128c581495c296d", "scanner": "scanner-primary", "fingerprint": "397fd4515e7f8f0e", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-249a1eebd57370d1", "level": "error", "message": {"text": "Insecure pattern 'eval_used' in frontend/scripts/snap-c3-authed.mjs:34"}, "properties": {"repobilityId": "61a0e4e69bbcb799", "scanner": "scanner-primary", "fingerprint": "249a1eebd57370d1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "eval_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/scripts/snap-c3-authed.mjs"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-24f810177f72a704", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/DetailReport.jsx:878"}, "properties": {"repobilityId": "b5f3dc9a8e27c1ba", "scanner": "scanner-primary", "fingerprint": "24f810177f72a704", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/DetailReport.jsx"}, "region": {"startLine": 878}}}]}, {"ruleId": "scanner-92c9e4e6dc438d1c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend-next/app/layout.tsx:45"}, "properties": {"repobilityId": "7e0233fdf88226b6", "scanner": "scanner-primary", "fingerprint": "92c9e4e6dc438d1c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend-next/app/layout.tsx"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-907c663964b01a8f", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "74ca6b8c8ced72a0", "scanner": "scanner-primary", "fingerprint": "907c663964b01a8f", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/generate_article.yml"}, "region": {"startLine": 92}}}]}, {"ruleId": "scanner-0e4060ec47dd1821", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "998d29f8005ac023", "scanner": "scanner-primary", "fingerprint": "0e4060ec47dd1821", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/playwright_smoke.yml"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-0e4060ec47dd1821", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "5fb791d5dadc3312", "scanner": "scanner-primary", "fingerprint": "0e4060ec47dd1821", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/playwright_smoke.yml"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-0e4060ec47dd1821", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "700519abf8a45a00", "scanner": "scanner-primary", "fingerprint": "0e4060ec47dd1821", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/playwright_smoke.yml"}, "region": {"startLine": 63}}}]}, {"ruleId": "scanner-0e4060ec47dd1821", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "700519abf8a45a00", "scanner": "scanner-primary", "fingerprint": "0e4060ec47dd1821", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/playwright_smoke.yml"}, "region": {"startLine": 71}}}]}, {"ruleId": "scanner-a896089ce1fdbaba", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a3309c0ac7383e02", "scanner": "scanner-primary", "fingerprint": "a896089ce1fdbaba", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/generate_daily_digest.yml"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-d305406af9300066", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "7281a87f37a39b4c", "scanner": "scanner-primary", "fingerprint": "d305406af9300066", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/morning_health.yml"}, "region": {"startLine": 81}}}]}, {"ruleId": "scanner-e9140e3418bf319b", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f078d64efa9cf9d3", "scanner": "scanner-primary", "fingerprint": "e9140e3418bf319b", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/refresh_tickers_cache.yml"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-e9140e3418bf319b", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "556d23af74de9a99", "scanner": "scanner-primary", "fingerprint": "e9140e3418bf319b", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/refresh_tickers_cache.yml"}, "region": {"startLine": 51}}}]}, {"ruleId": "scanner-d550510489575214", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "9d7a704821126adf", "scanner": "scanner-primary", "fingerprint": "d550510489575214", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/refresh_tickers_cache.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9438f86e7ed01d1d", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b65f155712134a00", "scanner": "scanner-primary", "fingerprint": "9438f86e7ed01d1d", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/vision_eval.yml"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-9438f86e7ed01d1d", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a03846a55b310c2e", "scanner": "scanner-primary", "fingerprint": "9438f86e7ed01d1d", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/vision_eval.yml"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-9438f86e7ed01d1d", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d4d2264dd97caa61", "scanner": "scanner-primary", "fingerprint": "9438f86e7ed01d1d", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/vision_eval.yml"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-9438f86e7ed01d1d", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "edf0531922fdcec0", "scanner": "scanner-primary", "fingerprint": "9438f86e7ed01d1d", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/vision_eval.yml"}, "region": {"startLine": 88}}}]}, {"ruleId": "scanner-908f3dab2634926f", "level": "note", "message": {"text": "Very large file: frontend/src/App.jsx (2800 lines)"}, "properties": {"repobilityId": "49d8e945ba36ff80", "scanner": "scanner-primary", "fingerprint": "908f3dab2634926f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-47408dc589a631b5", "level": "note", "message": {"text": "Very large file: frontend/src/components/LandingPage.jsx (1951 lines)"}, "properties": {"repobilityId": "13a1a7ae9377c721", "scanner": "scanner-primary", "fingerprint": "47408dc589a631b5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-75637371564437c1", "level": "note", "message": {"text": "Very large file: frontend/src/components/CustomScreenerPanel.jsx (1779 lines)"}, "properties": {"repobilityId": "4b70c8bdc8cf5083", "scanner": "scanner-primary", "fingerprint": "75637371564437c1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4fb90dfafb74e86d", "level": "note", "message": {"text": "Very large file: frontend/src/components/DiagramCard.jsx (3553 lines)"}, "properties": {"repobilityId": "3f85b6eb5e3a5eb8", "scanner": "scanner-primary", "fingerprint": "4fb90dfafb74e86d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-12909ca5b42c4c7f", "level": "note", "message": {"text": "Very large file: frontend/src/components/StockPriceChart.jsx (1829 lines)"}, "properties": {"repobilityId": "1dcb2d564cda3adb", "scanner": "scanner-primary", "fingerprint": "12909ca5b42c4c7f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-deb6c59035c1ce70", "level": "note", "message": {"text": "Very large file: frontend/src/components/BacktestPage.jsx (1468 lines)"}, "properties": {"repobilityId": "b717390a9d6a6465", "scanner": "scanner-primary", "fingerprint": "deb6c59035c1ce70", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3edec29f49996355", "level": "note", "message": {"text": "Very large file: frontend/src/features/workspace/IndicesView.jsx (2805 lines)"}, "properties": {"repobilityId": "c8fea36428d05b50", "scanner": "scanner-primary", "fingerprint": "3edec29f49996355", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8169b20e0c04e469", "level": "note", "message": {"text": "Very large file: frontend/src/features/workspace/Workspace.jsx (1159 lines)"}, "properties": {"repobilityId": "5195c38e74a0bca2", "scanner": "scanner-primary", "fingerprint": "8169b20e0c04e469", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8818d6d152d8684e", "level": "note", "message": {"text": "Very large file: frontend/src/features/judgment/components/detail/JudgmentDetail.jsx (1655 lines)"}, "properties": {"repobilityId": "d3beda8c364687f4", "scanner": "scanner-primary", "fingerprint": "8818d6d152d8684e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-730297a952ca72d6", "level": "note", "message": {"text": "Very large file: frontend/src/features/judgment/components/detail/ProfileCard.jsx (1660 lines)"}, "properties": {"repobilityId": "3b740e0172cb165d", "scanner": "scanner-primary", "fingerprint": "730297a952ca72d6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4737266e7397a6ea", "level": "note", "message": {"text": "Very large file: frontend/src/features/judgment/components/detail/sections/EarningsFlashSummary.jsx (1025 lines)"}, "properties": {"repobilityId": "ad9e09b06b3f4d38", "scanner": "scanner-primary", "fingerprint": "4737266e7397a6ea", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "d1dfd500e4b747ce", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "1e86ea233af217bd", "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": "2a7038e49d2f216c", "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": "1b68c6bd9fd6bc93", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "1b1d29da5e243e4d", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "bfbe5075028721fb", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "af98abcab6ad8c17", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-064191ae07b621f5", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/health.md"}, "properties": {"repobilityId": "a374cf9e4decf113", "scanner": "scanner-primary", "fingerprint": "064191ae07b621f5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/health.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0da813324024de69", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/morning.md"}, "properties": {"repobilityId": "ed50e63e5763a698", "scanner": "scanner-primary", "fingerprint": "0da813324024de69", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/morning.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7636906907cb7899", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/fetch-handover.md"}, "properties": {"repobilityId": "e37a1fb9bccad2e3", "scanner": "scanner-primary", "fingerprint": "7636906907cb7899", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/fetch-handover.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-862e0bc3b5b50e34", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/agents/planner.md"}, "properties": {"repobilityId": "c9e5d098d09b2c19", "scanner": "scanner-primary", "fingerprint": "862e0bc3b5b50e34", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/agents/planner.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d6d7a1050034c30a", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/design-system-check/SKILL.md"}, "properties": {"repobilityId": "30a32c6d21333cf1", "scanner": "scanner-primary", "fingerprint": "d6d7a1050034c30a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/design-system-check/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b8363164998b0b29", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/design-system-check/references/chip_check.md"}, "properties": {"repobilityId": "7c179f6662b13932", "scanner": "scanner-primary", "fingerprint": "b8363164998b0b29", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/design-system-check/references/chip_check.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a54d5f43a213fa07", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/next-best-practices/bundling.md"}, "properties": {"repobilityId": "5415786d1af367a9", "scanner": "scanner-primary", "fingerprint": "a54d5f43a213fa07", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/next-best-practices/bundling.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3dd2e3e46c9753c5", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/next-best-practices/file-conventions.md"}, "properties": {"repobilityId": "73d75dd4d479dba7", "scanner": "scanner-primary", "fingerprint": "3dd2e3e46c9753c5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/next-best-practices/file-conventions.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4d72c7a0c4b47e86", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/skills/next-best-practices/route-handlers.md"}, "properties": {"repobilityId": "b50ab587251f3271", "scanner": "scanner-primary", "fingerprint": "4d72c7a0c4b47e86", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/next-best-practices/route-handlers.md"}, "region": {"startLine": 103}}}]}, {"ruleId": "scanner-02a36d2c3a12d962", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/next-best-practices/route-handlers.md"}, "properties": {"repobilityId": "f33b8a8292aec284", "scanner": "scanner-primary", "fingerprint": "02a36d2c3a12d962", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/next-best-practices/route-handlers.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-71519890f1fcf1fb", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/next-best-practices/async-patterns.md"}, "properties": {"repobilityId": "4c64d6e99b64e11b", "scanner": "scanner-primary", "fingerprint": "71519890f1fcf1fb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/next-best-practices/async-patterns.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2823f689df48a081", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/next-best-practices/SKILL.md"}, "properties": {"repobilityId": "3eacd1a03e76366a", "scanner": "scanner-primary", "fingerprint": "2823f689df48a081", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/next-best-practices/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a78045556b8778bb", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/skills/next-best-practices/self-hosting.md"}, "properties": {"repobilityId": "c31959ba48a952ec", "scanner": "scanner-primary", "fingerprint": "a78045556b8778bb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/next-best-practices/self-hosting.md"}, "region": {"startLine": 291}}}]}, {"ruleId": "scanner-8650f45324a1911e", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/shadcn/customization.md"}, "properties": {"repobilityId": "360366d619619240", "scanner": "scanner-primary", "fingerprint": "8650f45324a1911e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/shadcn/customization.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6d4759e0e7135b23", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/playwright.config.ts:4"}, "properties": {"repobilityId": "f9d31b09be2b8550", "scanner": "scanner-primary", "fingerprint": "6d4759e0e7135b23", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0c8ba94a05d91952", "level": "none", "message": {"text": "Commented-code block (9 lines) in frontend/vite.config.js:15"}, "properties": {"repobilityId": "d81978b681445361", "scanner": "scanner-primary", "fingerprint": "0c8ba94a05d91952", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-92505e399eb346d3", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/scripts/snap-debug-pane29.mjs:5"}, "properties": {"repobilityId": "bba9a84f55288ae9", "scanner": "scanner-primary", "fingerprint": "92505e399eb346d3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ba224f253b1a230d", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/scripts/snap-s5b-funda.mjs:1"}, "properties": {"repobilityId": "8ca43da697b8f050", "scanner": "scanner-primary", "fingerprint": "ba224f253b1a230d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4b23a0cd14ce34d7", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-c3-scroll.mjs:1"}, "properties": {"repobilityId": "79b361afa0045127", "scanner": "scanner-primary", "fingerprint": "4b23a0cd14ce34d7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-184386b28fc6934e", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/scripts/snap-cup-handle.mjs:6"}, "properties": {"repobilityId": "53252126f4efae73", "scanner": "scanner-primary", "fingerprint": "184386b28fc6934e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e5cf74a98547b20", "level": "note", "message": {"text": "Legacy-named symbol `pane3_v2` in frontend/scripts/snap-nvda-v2-diff.mjs:1"}, "properties": {"repobilityId": "82bab0e0d740857e", "scanner": "scanner-primary", "fingerprint": "9e5cf74a98547b20", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1497939c89579458", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-c3-authed.mjs:1"}, "properties": {"repobilityId": "d10f6d139fce7693", "scanner": "scanner-primary", "fingerprint": "1497939c89579458", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-468b104e31dcc2f7", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-diagram.mjs:3"}, "properties": {"repobilityId": "736ef124c4cae55a", "scanner": "scanner-primary", "fingerprint": "468b104e31dcc2f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-36b924d8020d04b9", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-active.mjs:6"}, "properties": {"repobilityId": "a90f8a75e6de79fc", "scanner": "scanner-primary", "fingerprint": "36b924d8020d04b9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-14ac15ab294691c3", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-vision-eval.mjs:7"}, "properties": {"repobilityId": "df5de5296964204e", "scanner": "scanner-primary", "fingerprint": "14ac15ab294691c3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d91da4cfd0868a01", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-b3-empty-detail-cyan.mjs:5"}, "properties": {"repobilityId": "232f4418cf7b5e4f", "scanner": "scanner-primary", "fingerprint": "d91da4cfd0868a01", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8adf0ccc44268dec", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/scripts/snap-c3-breadcrumb.mjs:1"}, "properties": {"repobilityId": "944d2553449fa5bf", "scanner": "scanner-primary", "fingerprint": "8adf0ccc44268dec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aba0412c3938a2c4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/scripts/snap-c3-breadcrumb.mjs:42"}, "properties": {"repobilityId": "d4458fe1b1caa211", "scanner": "scanner-primary", "fingerprint": "aba0412c3938a2c4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0c7cbdbc587eb133", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/scripts/snap-conditions.mjs:1"}, "properties": {"repobilityId": "55db11b28caecdd1", "scanner": "scanner-primary", "fingerprint": "0c7cbdbc587eb133", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cf735d79933f8c2e", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-flow-pane3-scroll.mjs:5"}, "properties": {"repobilityId": "d63e6f461a9efaab", "scanner": "scanner-primary", "fingerprint": "cf735d79933f8c2e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4243a17cbb7fa916", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-pdca-loop-v2.mjs:1"}, "properties": {"repobilityId": "e0343ec371ccd3c1", "scanner": "scanner-primary", "fingerprint": "4243a17cbb7fa916", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ab4c64309ce31fb6", "level": "none", "message": {"text": "Commented-code block (10 lines) in frontend/scripts/snap-forward-extras.mjs:1"}, "properties": {"repobilityId": "6dfa81cf6287feb5", "scanner": "scanner-primary", "fingerprint": "ab4c64309ce31fb6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c15fd5831b089482", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/scripts/snap-c3-keepmount.mjs:1"}, "properties": {"repobilityId": "50599a205f432043", "scanner": "scanner-primary", "fingerprint": "c15fd5831b089482", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-756949ae787f6b0e", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/scripts/snap-pdca-loop.mjs:4"}, "properties": {"repobilityId": "f8877ea10575d110", "scanner": "scanner-primary", "fingerprint": "756949ae787f6b0e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7f92639dbe14e38c", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/scripts/snap-etf-holdings.mjs:1"}, "properties": {"repobilityId": "9253c956e3f6a7b0", "scanner": "scanner-primary", "fingerprint": "7f92639dbe14e38c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-18e958ddc41c8f4d", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-visual-regression.mjs:287"}, "properties": {"repobilityId": "261a13f0146ca66f", "scanner": "scanner-primary", "fingerprint": "18e958ddc41c8f4d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bd490a4148d1be72", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-current-pillar2.mjs:5"}, "properties": {"repobilityId": "8da349abab8c52d1", "scanner": "scanner-primary", "fingerprint": "bd490a4148d1be72", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c64a809d3707843", "level": "note", "message": {"text": "Legacy-named symbol `flash_v2` in frontend/scripts/snap-flash-gm.mjs:18"}, "properties": {"repobilityId": "38b7636b4f2d24a1", "scanner": "scanner-primary", "fingerprint": "2c64a809d3707843", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5ea806fa5f01a944", "level": "none", "message": {"text": "Commented-code block (9 lines) in frontend/scripts/snap-flash-gm.mjs:1"}, "properties": {"repobilityId": "c612e96a83359102", "scanner": "scanner-primary", "fingerprint": "5ea806fa5f01a944", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b81ad7cfdf49394", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/scripts/build-articles.mjs:168"}, "properties": {"repobilityId": "99052e0163d62912", "scanner": "scanner-primary", "fingerprint": "7b81ad7cfdf49394", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-de01c999609720e5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/scripts/build-articles.mjs:936"}, "properties": {"repobilityId": "f56590f359c3ea06", "scanner": "scanner-primary", "fingerprint": "de01c999609720e5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0657f38799cd0aab", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/scripts/fetch-tickers-cache.mjs:72"}, "properties": {"repobilityId": "47f68b49e43576f2", "scanner": "scanner-primary", "fingerprint": "0657f38799cd0aab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4342d3148216702e", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-screener-hero.mjs:3"}, "properties": {"repobilityId": "aa084fbbb5e2db5d", "scanner": "scanner-primary", "fingerprint": "4342d3148216702e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4ba74edda6962687", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-autopilot-c11r3.mjs:1"}, "properties": {"repobilityId": "9afdbce5f42d0d84", "scanner": "scanner-primary", "fingerprint": "4ba74edda6962687", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-71d3d150e65e6110", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/scripts/snap-flash-summary.mjs:1"}, "properties": {"repobilityId": "37f7bc4c3b4c5c18", "scanner": "scanner-primary", "fingerprint": "71d3d150e65e6110", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5a6e217c26fd18e6", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/scripts/snap-v5-dogfood.mjs:1"}, "properties": {"repobilityId": "82c6ff04028f8421", "scanner": "scanner-primary", "fingerprint": "5a6e217c26fd18e6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e9760f29fd4c2fa5", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/scripts/snap-priceladder.mjs:1"}, "properties": {"repobilityId": "a4643f5d03348598", "scanner": "scanner-primary", "fingerprint": "e9760f29fd4c2fa5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c3216637efe251fa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/scripts/snap-completeness-badge.mjs:37"}, "properties": {"repobilityId": "b3497ad3cb0d8d8a", "scanner": "scanner-primary", "fingerprint": "c3216637efe251fa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0d9842490787b407", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/scripts/snap-baseline-pillar2.mjs:5"}, "properties": {"repobilityId": "bb42330658d35bd3", "scanner": "scanner-primary", "fingerprint": "0d9842490787b407", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b96b208b0e5f575", "level": "note", "message": {"text": "Legacy-named symbol `bs_holding_mode_v1` in frontend/src/App.jsx:244"}, "properties": {"repobilityId": "44271e3460493459", "scanner": "scanner-primary", "fingerprint": "1b96b208b0e5f575", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3fffde9a6c108af3", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/App.jsx:45"}, "properties": {"repobilityId": "5116f543d0f1d852", "scanner": "scanner-primary", "fingerprint": "3fffde9a6c108af3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-71f4c124f34400da", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/api.js:45"}, "properties": {"repobilityId": "696e4c5adf051d19", "scanner": "scanner-primary", "fingerprint": "71f4c124f34400da", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1dc78f4d86c12b21", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/api.js:48"}, "properties": {"repobilityId": "193bf80bbeeaa05b", "scanner": "scanner-primary", "fingerprint": "1dc78f4d86c12b21", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1e12db52ed1f31d7", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/state/workspaceStore.js:33"}, "properties": {"repobilityId": "a367707af02630a3", "scanner": "scanner-primary", "fingerprint": "1e12db52ed1f31d7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8a3ee84feb199625", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/utils/darkMode.js:3"}, "properties": {"repobilityId": "2970e851be4119c0", "scanner": "scanner-primary", "fingerprint": "8a3ee84feb199625", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d823f9b45c625831", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/EarningsHistoryChart.jsx:80"}, "properties": {"repobilityId": "4a2360605cb2ad81", "scanner": "scanner-primary", "fingerprint": "d823f9b45c625831", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e593f65226bada5c", "level": "none", "message": {"text": "Commented-code block (10 lines) in frontend/src/components/ChartTab.jsx:346"}, "properties": {"repobilityId": "9dafce7df120f2b8", "scanner": "scanner-primary", "fingerprint": "e593f65226bada5c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-298b5ddddad52233", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/ChartTab.jsx:193"}, "properties": {"repobilityId": "e971740ae0a1c143", "scanner": "scanner-primary", "fingerprint": "298b5ddddad52233", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f45180e8db5093e5", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/AnalystPanel.jsx:313"}, "properties": {"repobilityId": "67079f5cc5f3a931", "scanner": "scanner-primary", "fingerprint": "f45180e8db5093e5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fcd8ca8cd5a36633", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/CupPivotCard.jsx:101"}, "properties": {"repobilityId": "90d1f412e98ceb4d", "scanner": "scanner-primary", "fingerprint": "fcd8ca8cd5a36633", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a78e47893dab9741", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/LandingPage.jsx:814"}, "properties": {"repobilityId": "56e24b744d96b070", "scanner": "scanner-primary", "fingerprint": "a78e47893dab9741", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-74c7c9ad004c0d87", "level": "note", "message": {"text": "Legacy-named symbol `pane3_v2` in frontend/src/components/diagramEssence.js:12"}, "properties": {"repobilityId": "879af7098072c9a4", "scanner": "scanner-primary", "fingerprint": "74c7c9ad004c0d87", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4bca7d3db7d5e98e", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/TodaysBriefSection.jsx:11"}, "properties": {"repobilityId": "9c1de648e794970a", "scanner": "scanner-primary", "fingerprint": "4bca7d3db7d5e98e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a55927f0b4dae376", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/InsightsPanel.jsx:504"}, "properties": {"repobilityId": "8b604bbd0e79b8c5", "scanner": "scanner-primary", "fingerprint": "a55927f0b4dae376", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ed95c2af219d9825", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/GuidanceCard.jsx:101"}, "properties": {"repobilityId": "ab85df0015ce06bf", "scanner": "scanner-primary", "fingerprint": "ed95c2af219d9825", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2660c4e0db286e87", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/CustomScreenerPanel.jsx:59"}, "properties": {"repobilityId": "c44c927a45c0b42c", "scanner": "scanner-primary", "fingerprint": "2660c4e0db286e87", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a00b6c2bd317e2c7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/CustomScreenerPanel.jsx:1256"}, "properties": {"repobilityId": "90903630afa0af76", "scanner": "scanner-primary", "fingerprint": "a00b6c2bd317e2c7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-15a3c8cb9bb6e0d9", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/PriceLadder.jsx:451"}, "properties": {"repobilityId": "ffea66ff0bb74107", "scanner": "scanner-primary", "fingerprint": "15a3c8cb9bb6e0d9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8de60617c4e47eb6", "level": "none", "message": {"text": "Commented-code block (9 lines) in frontend/src/components/DiagramCard.jsx:30"}, "properties": {"repobilityId": "dc9bd0436ead36f4", "scanner": "scanner-primary", "fingerprint": "8de60617c4e47eb6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-242df0f154b989d4", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/PortfolioHistoryChart.jsx:302"}, "properties": {"repobilityId": "b5bd6f604f06a7d4", "scanner": "scanner-primary", "fingerprint": "242df0f154b989d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9038cccc630390e7", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/EconomicCalendarSection.jsx:12"}, "properties": {"repobilityId": "d664197879a423fc", "scanner": "scanner-primary", "fingerprint": "9038cccc630390e7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-07baa080e3d6d6c2", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/QuarterlyHistoryTable.jsx:246"}, "properties": {"repobilityId": "af1595344622caaf", "scanner": "scanner-primary", "fingerprint": "07baa080e3d6d6c2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5e075987d45c2a95", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/components/SummaryBrief.jsx:66"}, "properties": {"repobilityId": "6bfe965fce0cc27c", "scanner": "scanner-primary", "fingerprint": "5e075987d45c2a95", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-513da1f1492fda79", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/SummaryBrief.jsx:251"}, "properties": {"repobilityId": "dd44a79e40a9aa2c", "scanner": "scanner-primary", "fingerprint": "513da1f1492fda79", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-55070e32bf19f91b", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/components/DiagramCitation.jsx:48"}, "properties": {"repobilityId": "bfa27eb3dba8713c", "scanner": "scanner-primary", "fingerprint": "55070e32bf19f91b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2567290c4557cacb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/TenKLinksPanel.jsx:5"}, "properties": {"repobilityId": "dc4af54d77b3c657", "scanner": "scanner-primary", "fingerprint": "2567290c4557cacb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2f06e7833a4479e0", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/components/TriageBanner.jsx:285"}, "properties": {"repobilityId": "2c2943e3c05b2cef", "scanner": "scanner-primary", "fingerprint": "2f06e7833a4479e0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f82892112081c6f1", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/AnalystTargetCard.jsx:67"}, "properties": {"repobilityId": "ca6ee23cf1f10fc2", "scanner": "scanner-primary", "fingerprint": "f82892112081c6f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-249bef6ab0f80b98", "level": "none", "message": {"text": "Commented-code block (9 lines) in frontend/src/components/ConferenceAnalysis.jsx:7"}, "properties": {"repobilityId": "d60d1fd8d6742a85", "scanner": "scanner-primary", "fingerprint": "249bef6ab0f80b98", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6a02a327ecef344a", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/DetailReport.jsx:991"}, "properties": {"repobilityId": "b581c7b9a8f810e9", "scanner": "scanner-primary", "fingerprint": "6a02a327ecef344a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f65bf8b908edf044", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/components/ForwardOutlookSection.jsx:76"}, "properties": {"repobilityId": "693336a35f267934", "scanner": "scanner-primary", "fingerprint": "f65bf8b908edf044", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e55908af39618d9a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/components/ForwardOutlookSection.jsx:16"}, "properties": {"repobilityId": "88c56c401c47ce6e", "scanner": "scanner-primary", "fingerprint": "e55908af39618d9a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-966345ffb6f650ce", "level": "note", "message": {"text": "Legacy-named symbol `pane3_chart_style_v1` in frontend/src/components/StockPriceChart.jsx:11"}, "properties": {"repobilityId": "5d3647d1fc896014", "scanner": "scanner-primary", "fingerprint": "966345ffb6f650ce", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ec73a670e45da463", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/components/StockPriceChart.jsx:210"}, "properties": {"repobilityId": "836de97cae46d59d", "scanner": "scanner-primary", "fingerprint": "ec73a670e45da463", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0d88672a92b1c5f3", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/BacktestPage.jsx:430"}, "properties": {"repobilityId": "3be9e766f73562b9", "scanner": "scanner-primary", "fingerprint": "0d88672a92b1c5f3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-db07ca34e93f8034", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/ui/ProTeaser.jsx:41"}, "properties": {"repobilityId": "a9fed47497b21a35", "scanner": "scanner-primary", "fingerprint": "db07ca34e93f8034", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-32962a728f1f15a2", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/ui/Chip.jsx:37"}, "properties": {"repobilityId": "9a2298f08d6b87bf", "scanner": "scanner-primary", "fingerprint": "32962a728f1f15a2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-625acff54ad18933", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/lib/buyZoneLabels.js:73"}, "properties": {"repobilityId": "e7c066a6907bcd19", "scanner": "scanner-primary", "fingerprint": "625acff54ad18933", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6e2b7ef49fa857ee", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/lib/planGating.js:88"}, "properties": {"repobilityId": "e955ab9100e527dd", "scanner": "scanner-primary", "fingerprint": "6e2b7ef49fa857ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4d88ccbe3f4f5992", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/lib/sentry.js:39"}, "properties": {"repobilityId": "850e89e6cf5b45dd", "scanner": "scanner-primary", "fingerprint": "4d88ccbe3f4f5992", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6fe32ff5dd807afe", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/lib/holdings.js:189"}, "properties": {"repobilityId": "695449bdd6416074", "scanner": "scanner-primary", "fingerprint": "6fe32ff5dd807afe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4ef345ea59ff8d3b", "level": "note", "message": {"text": "Legacy-named symbol `pane3_v2` in frontend/src/lib/featureFlags.js:5"}, "properties": {"repobilityId": "17da47f3ed336c98", "scanner": "scanner-primary", "fingerprint": "4ef345ea59ff8d3b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-dbfe5e6efae84098", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/lib/blocklist.js:72"}, "properties": {"repobilityId": "130b32c9c3e4fa8c", "scanner": "scanner-primary", "fingerprint": "dbfe5e6efae84098", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cc3e5e58f2e917fc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/usePortfolioPrices.js:17"}, "properties": {"repobilityId": "42306128d16796c9", "scanner": "scanner-primary", "fingerprint": "cc3e5e58f2e917fc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d7e19eb8d751a55b", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/hooks/useSubscription.js:7"}, "properties": {"repobilityId": "d1f1481312af6720", "scanner": "scanner-primary", "fingerprint": "d7e19eb8d751a55b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6796390670c9c69e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/useSubscription.js:7"}, "properties": {"repobilityId": "93f91377d0d39df3", "scanner": "scanner-primary", "fingerprint": "6796390670c9c69e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7f64146f98c7aaa3", "level": "note", "message": {"text": "Legacy-named symbol `bs_translation_cache_v1` in frontend/src/hooks/useTranslation.js:9"}, "properties": {"repobilityId": "c581c644a09bb7e9", "scanner": "scanner-primary", "fingerprint": "7f64146f98c7aaa3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8261e9b118f2ee69", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/features/cmd-palette/CmdPalette.jsx:40"}, "properties": {"repobilityId": "1519639121fd1319", "scanner": "scanner-primary", "fingerprint": "8261e9b118f2ee69", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-21cc881fae679a38", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/workspace/ScreenerPane.jsx:209"}, "properties": {"repobilityId": "00a07d3fea48e110", "scanner": "scanner-primary", "fingerprint": "21cc881fae679a38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-776c207029a59224", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/features/workspace/WorkspaceShell.jsx:27"}, "properties": {"repobilityId": "a9bc848f0ca13c1a", "scanner": "scanner-primary", "fingerprint": "776c207029a59224", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3b18139467cad7b0", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/features/workspace/IndicesView.jsx:80"}, "properties": {"repobilityId": "1251c312ef9a5324", "scanner": "scanner-primary", "fingerprint": "3b18139467cad7b0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a2b6e775f8997c87", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/workspace/IndicesView.jsx:2800"}, "properties": {"repobilityId": "3b06d20a5a6b030b", "scanner": "scanner-primary", "fingerprint": "a2b6e775f8997c87", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9d63dadb1ab2aff7", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/features/workspace/Workspace.jsx:96"}, "properties": {"repobilityId": "90e3d9fa7eed827e", "scanner": "scanner-primary", "fingerprint": "9d63dadb1ab2aff7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e8cafca63effe9ad", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/workspace/useUrlSync.js:27"}, "properties": {"repobilityId": "d1fcf7d8a49e08ee", "scanner": "scanner-primary", "fingerprint": "e8cafca63effe9ad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-748749a843d64709", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/judgment/state/useJudgmentResult.js:89"}, "properties": {"repobilityId": "11ae52b4b3348c0f", "scanner": "scanner-primary", "fingerprint": "748749a843d64709", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-feb41521e61b5622", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/judgment/primitives/TtmValuationPanel.jsx:185"}, "properties": {"repobilityId": "9219ab782eb4d968", "scanner": "scanner-primary", "fingerprint": "feb41521e61b5622", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-296453e5ee538af6", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/features/judgment/primitives/SectionFadeSubtle.jsx:50"}, "properties": {"repobilityId": "e9515fe71610feea", "scanner": "scanner-primary", "fingerprint": "296453e5ee538af6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2e47811caf59c6e0", "level": "note", "message": {"text": "Legacy-named symbol `pane3_scroll_v1` in frontend/src/features/judgment/primitives/AccordionSection.jsx:72"}, "properties": {"repobilityId": "5f7ab0721e7220ef", "scanner": "scanner-primary", "fingerprint": "2e47811caf59c6e0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-836c435660f69c31", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/judgment/primitives/AccordionSection.jsx:132"}, "properties": {"repobilityId": "a42532ca5743532c", "scanner": "scanner-primary", "fingerprint": "836c435660f69c31", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-704b83c7da01335c", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/judgment/primitives/SectorDonut.jsx:97"}, "properties": {"repobilityId": "4a536533e8c82f45", "scanner": "scanner-primary", "fingerprint": "704b83c7da01335c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e38161aff175df1b", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/judgment/primitives/ReturnGrid.jsx:53"}, "properties": {"repobilityId": "cc7c734db1a154d4", "scanner": "scanner-primary", "fingerprint": "e38161aff175df1b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-481fcf12487b7d4a", "level": "none", "message": {"text": "Commented-code block (9 lines) in frontend/src/features/judgment/primitives/SectionFade.jsx:58"}, "properties": {"repobilityId": "903c526f9eb35af0", "scanner": "scanner-primary", "fingerprint": "481fcf12487b7d4a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-065b186de1d61db0", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/judgment/constants/stateCompassText.js:27"}, "properties": {"repobilityId": "fc3f59dc393ac6d7", "scanner": "scanner-primary", "fingerprint": "065b186de1d61db0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-22ce03b24706acc6", "level": "note", "message": {"text": "Legacy-named symbol `pane3_v2` in frontend/src/features/judgment/components/detail/JudgmentDetail.jsx:74"}, "properties": {"repobilityId": "513ddf864a194125", "scanner": "scanner-primary", "fingerprint": "22ce03b24706acc6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d77e77cba9d50eb6", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/judgment/components/detail/JudgmentDetail.jsx:134"}, "properties": {"repobilityId": "2a9854bf5f837b39", "scanner": "scanner-primary", "fingerprint": "d77e77cba9d50eb6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-66ca472a5a66a3c6", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/judgment/components/detail/ProfileCard.jsx:61"}, "properties": {"repobilityId": "13215a5a9086ba94", "scanner": "scanner-primary", "fingerprint": "66ca472a5a66a3c6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3007ec1b7d32c6d9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/judgment/components/detail/ProfileCard.jsx:22"}, "properties": {"repobilityId": "b095a9e5995f010a", "scanner": "scanner-primary", "fingerprint": "3007ec1b7d32c6d9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b7c0f2dcc4a713b4", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/judgment/components/detail/ConditionRow.jsx:47"}, "properties": {"repobilityId": "57d29d5888670d26", "scanner": "scanner-primary", "fingerprint": "b7c0f2dcc4a713b4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9a416c2e33973102", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/features/judgment/components/detail/ConditionSparkline.jsx:72"}, "properties": {"repobilityId": "8c4675ac8b6d4569", "scanner": "scanner-primary", "fingerprint": "9a416c2e33973102", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9c441148cf9fa48c", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/features/judgment/components/detail/FiveConditionsCard.jsx:105"}, "properties": {"repobilityId": "3f88ac36ea6a52b1", "scanner": "scanner-primary", "fingerprint": "9c441148cf9fa48c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-42133e89043e6692", "level": "note", "message": {"text": "Legacy-named symbol `pane3_v2` in frontend/src/features/judgment/components/detail/Hero.jsx:152"}, "properties": {"repobilityId": "e320f9a7045ae1f1", "scanner": "scanner-primary", "fingerprint": "42133e89043e6692", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-44e03b2c0c1287cc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/judgment/components/detail/sections/StickyDiagramAccordion.jsx:131"}, "properties": {"repobilityId": "4e95dcaabae41f17", "scanner": "scanner-primary", "fingerprint": "44e03b2c0c1287cc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5afef1cd494063cc", "level": "note", "message": {"text": "Legacy-named symbol `flash_v2` in frontend/src/features/judgment/components/detail/sections/EarningsFlashSummary.jsx:112"}, "properties": {"repobilityId": "ef4ac281bcc050e2", "scanner": "scanner-primary", "fingerprint": "5afef1cd494063cc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-beec34f1c8077a79", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/features/judgment/components/detail/sections/EarningsFlashSummary.jsx:49"}, "properties": {"repobilityId": "2d3fb7ad6b02e6e0", "scanner": "scanner-primary", "fingerprint": "beec34f1c8077a79", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-908a3d963369d5ab", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/features/judgment/components/shared/PremiumLock.jsx:44"}, "properties": {"repobilityId": "70b47663ba20ca58", "scanner": "scanner-primary", "fingerprint": "908a3d963369d5ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-956d12100d16be01", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/features/articles/ArticlePage.jsx:64"}, "properties": {"repobilityId": "db7411284a3b079e", "scanner": "scanner-primary", "fingerprint": "956d12100d16be01", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-49778df2272f06ea", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/features/articles/ArticleBody.jsx:88"}, "properties": {"repobilityId": "71c676d82c0f7ed0", "scanner": "scanner-primary", "fingerprint": "49778df2272f06ea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ae8326aa78b49641", "level": "note", "message": {"text": "Legacy-named symbol `bs_theme_v2` in frontend-next/app/layout.tsx:22"}, "properties": {"repobilityId": "3a5402ccafcc6718", "scanner": "scanner-primary", "fingerprint": "ae8326aa78b49641", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-33398e4c0ea4a7f5", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/tests/article_pipeline/test_fact_checker.py:320"}, "properties": {"repobilityId": "41b0199abbadba6b", "scanner": "scanner-primary", "fingerprint": "33398e4c0ea4a7f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-620d28683440e1c1", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/fmp_client.py:87"}, "properties": {"repobilityId": "8a0313e7527b2109", "scanner": "scanner-primary", "fingerprint": "620d28683440e1c1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-71d851b41b7b1150", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/judgment.py:236"}, "properties": {"repobilityId": "29b3414f9b8509fb", "scanner": "scanner-primary", "fingerprint": "71d851b41b7b1150", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-183165a49d21b977", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/og_image_generator.py:131"}, "properties": {"repobilityId": "6427d3007401bd44", "scanner": "scanner-primary", "fingerprint": "183165a49d21b977", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9ad07f0a689f6ec2", "level": "none", "message": {"text": "Commented-code block (9 lines) in backend/app/transcript_source.py:64"}, "properties": {"repobilityId": "42659c02056d43b2", "scanner": "scanner-primary", "fingerprint": "9ad07f0a689f6ec2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-78f2a6f1c1b5c6d4", "level": "none", "message": {"text": "Commented-code block (9 lines) in backend/app/article_pipeline/__init__.py:23"}, "properties": {"repobilityId": "5086201667328efc", "scanner": "scanner-primary", "fingerprint": "78f2a6f1c1b5c6d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fb776537d073b149", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/article_pipeline/fact_checker.py:48"}, "properties": {"repobilityId": "8b4d2e0ca01b395e", "scanner": "scanner-primary", "fingerprint": "fb776537d073b149", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a56ff9c5ccdfb27d", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/article_pipeline/storage.py:148"}, "properties": {"repobilityId": "5ec7e246f6e60dd5", "scanner": "scanner-primary", "fingerprint": "a56ff9c5ccdfb27d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-50d6456708534445", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/app/article_pipeline/sources.py:46"}, "properties": {"repobilityId": "f67a2f1845c28d78", "scanner": "scanner-primary", "fingerprint": "50d6456708534445", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-36401d3909f4db51", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/article_pipeline/writer.py:140"}, "properties": {"repobilityId": "2c958ed16cb1ef5b", "scanner": "scanner-primary", "fingerprint": "36401d3909f4db51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8365ac2549a7cb08", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/aggregator/guidance_history.py:34"}, "properties": {"repobilityId": "ada44b37c8c9efa3", "scanner": "scanner-primary", "fingerprint": "8365ac2549a7cb08", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4cd2be747cbde492", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/app/visualizer/prompt.py:20"}, "properties": {"repobilityId": "8388783b4bfc66c3", "scanner": "scanner-primary", "fingerprint": "4cd2be747cbde492", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d83c1c88d0cb4903", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/visualizer/profile_summary.py:360"}, "properties": {"repobilityId": "9f9d6d6bd5226960", "scanner": "scanner-primary", "fingerprint": "d83c1c88d0cb4903", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4d223bfdf539b12d", "level": "note", "message": {"text": "42 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "5bbbd2b50dcb630d", "scanner": "scanner-primary", "fingerprint": "4d223bfdf539b12d", "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": "a8699a6c44157086", "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": "9ce59ce3e8715512", "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": "b471ffdba55ddacd", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-d21e79d1aed73540", "level": "error", "message": {"text": "FastAPI POST `generate_articles_endpoint` without auth dependency \u2014 backend/app/article_pipeline/router.py:33"}, "properties": {"repobilityId": "1fa1c29470eb79e0", "scanner": "scanner-primary", "fingerprint": "d21e79d1aed73540", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/article_pipeline/router.py"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-8dd635993a0a0753", "level": "error", "message": {"text": "Dangling fetch: POST /api/analyze (frontend/scripts/sentry-verify.mjs:23)"}, "properties": {"repobilityId": "39a411fca5fcf08f", "scanner": "scanner-primary", "fingerprint": "8dd635993a0a0753", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-abdc296159fd474b", "level": "error", "message": {"text": "Dangling fetch: GET /api/profile-summary/${t}${qs} (frontend/src/api.js:901)"}, "properties": {"repobilityId": "73ae6172b72b79f9", "scanner": "scanner-primary", "fingerprint": "abdc296159fd474b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-09183b88ecf57489", "level": "note", "message": {"text": "Unused endpoint: GET /api/sitemap.xml"}, "properties": {"repobilityId": "9809c92e9b4f1a62", "scanner": "scanner-primary", "fingerprint": "09183b88ecf57489", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9ff6d8b7a61de4c4", "level": "note", "message": {"text": "Unused endpoint: GET /api/sentry-debug"}, "properties": {"repobilityId": "8d86b5e055c84118", "scanner": "scanner-primary", "fingerprint": "9ff6d8b7a61de4c4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-658b1476c982bc19", "level": "note", "message": {"text": "Unused endpoint: POST /api/sentry-tunnel"}, "properties": {"repobilityId": "9771fda2e00b85c1", "scanner": "scanner-primary", "fingerprint": "658b1476c982bc19", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-03be48c3ac3ff9f7", "level": "note", "message": {"text": "Unused endpoint: GET /api/sample-pass"}, "properties": {"repobilityId": "603de8a41e776456", "scanner": "scanner-primary", "fingerprint": "03be48c3ac3ff9f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-af59e3e822ddb2e5", "level": "note", "message": {"text": "Unused endpoint: GET /api/demo/analyze/{ticker}"}, "properties": {"repobilityId": "530923afb6f39c1a", "scanner": "scanner-primary", "fingerprint": "af59e3e822ddb2e5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-66163527ffbf9f3c", "level": "note", "message": {"text": "Unused endpoint: GET /api/analyze/{ticker}"}, "properties": {"repobilityId": "b6e707a397c62192", "scanner": "scanner-primary", "fingerprint": "66163527ffbf9f3c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-44ccd3a27edac2da", "level": "note", "message": {"text": "Unused endpoint: GET /api/etf-info/{ticker}"}, "properties": {"repobilityId": "d7f435fc3829eddb", "scanner": "scanner-primary", "fingerprint": "44ccd3a27edac2da", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f1c0f2236abbd36c", "level": "note", "message": {"text": "Unused endpoint: GET /api/etf-exposure/{ticker}"}, "properties": {"repobilityId": "d55ab01ac00ebfc3", "scanner": "scanner-primary", "fingerprint": "f1c0f2236abbd36c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b0a322b00d4bf653", "level": "note", "message": {"text": "Unused endpoint: GET /api/backtest"}, "properties": {"repobilityId": "4967dbc90804cf54", "scanner": "scanner-primary", "fingerprint": "b0a322b00d4bf653", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9e8e5c28c1fcb9f5", "level": "note", "message": {"text": "Unused endpoint: GET /api/historical-dividends/{ticker}"}, "properties": {"repobilityId": "484a669212601ec7", "scanner": "scanner-primary", "fingerprint": "9e8e5c28c1fcb9f5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ce28cf83c5e6b34b", "level": "note", "message": {"text": "Unused endpoint: GET /api/guidance/{ticker}/quarterly-history"}, "properties": {"repobilityId": "96e71e0a4c71e04d", "scanner": "scanner-primary", "fingerprint": "ce28cf83c5e6b34b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a81d0a29ca172f79", "level": "note", "message": {"text": "Unused endpoint: GET /api/guidance/{ticker}/basic"}, "properties": {"repobilityId": "e53bd55d2ddffe03", "scanner": "scanner-primary", "fingerprint": "a81d0a29ca172f79", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d50066e11134876", "level": "note", "message": {"text": "Unused endpoint: GET /api/cache/status"}, "properties": {"repobilityId": "47688fafee46ca9a", "scanner": "scanner-primary", "fingerprint": "8d50066e11134876", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cfecdf0c4ffe4de7", "level": "note", "message": {"text": "Unused endpoint: GET /api/debug/earnings/{ticker}"}, "properties": {"repobilityId": "98fadf43b831bdf9", "scanner": "scanner-primary", "fingerprint": "cfecdf0c4ffe4de7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cee61f79c027e3c7", "level": "note", "message": {"text": "Unused endpoint: GET /api/price-history/{ticker}"}, "properties": {"repobilityId": "d5489516e218bb29", "scanner": "scanner-primary", "fingerprint": "cee61f79c027e3c7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b616b662fc838269", "level": "note", "message": {"text": "Unused endpoint: GET /api/period-returns/{ticker}"}, "properties": {"repobilityId": "d251682e1fcb8a89", "scanner": "scanner-primary", "fingerprint": "b616b662fc838269", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9462b76b4e8186c0", "level": "note", "message": {"text": "Unused endpoint: GET /api/news/{ticker}"}, "properties": {"repobilityId": "87a53e5dfff40ea9", "scanner": "scanner-primary", "fingerprint": "9462b76b4e8186c0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-53776d49048a9cf6", "level": "note", "message": {"text": "Unused endpoint: GET /api/ir-links/{ticker}"}, "properties": {"repobilityId": "d4aa0752f3ac09f0", "scanner": "scanner-primary", "fingerprint": "53776d49048a9cf6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f6ea07eddd82ba90", "level": "note", "message": {"text": "Unused endpoint: GET /api/profile-summary/{ticker}"}, "properties": {"repobilityId": "6fc31227bb563205", "scanner": "scanner-primary", "fingerprint": "f6ea07eddd82ba90", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-576eb93a297d7ce2", "level": "note", "message": {"text": "Unused endpoint: POST /api/summary/brief"}, "properties": {"repobilityId": "f18421cac28b1e91", "scanner": "scanner-primary", "fingerprint": "576eb93a297d7ce2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c5d417b68c43d80c", "level": "note", "message": {"text": "Unused endpoint: POST /api/summary/detail"}, "properties": {"repobilityId": "43dbe993a8c2a643", "scanner": "scanner-primary", "fingerprint": "c5d417b68c43d80c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cbfb9525aaeabd4f", "level": "note", "message": {"text": "Unused endpoint: GET /api/analyst/consensus-drift"}, "properties": {"repobilityId": "933597d986c1f41a", "scanner": "scanner-primary", "fingerprint": "cbfb9525aaeabd4f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-00463fb32f3596c2", "level": "note", "message": {"text": "Unused endpoint: GET /api/chart/{ticker}/candles"}, "properties": {"repobilityId": "11640a92637e21c5", "scanner": "scanner-primary", "fingerprint": "00463fb32f3596c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4cca9d4fe6251b3d", "level": "note", "message": {"text": "Unused endpoint: GET /api/technical/{ticker}"}, "properties": {"repobilityId": "e3a8d02078e2a23c", "scanner": "scanner-primary", "fingerprint": "4cca9d4fe6251b3d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-827e68478e8942dd", "level": "note", "message": {"text": "Unused endpoint: GET /api/movers/debug"}, "properties": {"repobilityId": "ad857a76b1565fa7", "scanner": "scanner-primary", "fingerprint": "827e68478e8942dd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-69ee7e5287c8bc43", "level": "note", "message": {"text": "Unused endpoint: GET /api/movers/stream"}, "properties": {"repobilityId": "b9fc6818210d8894", "scanner": "scanner-primary", "fingerprint": "69ee7e5287c8bc43", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "9a7ab29051c0367b", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6b6edfcd307c922d", "level": "note", "message": {"text": "Unused endpoint: GET /api/ogp/{ticker}"}, "properties": {"repobilityId": "8935c7dd112d2cea", "scanner": "scanner-primary", "fingerprint": "6b6edfcd307c922d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c643b7b59c9eedff", "level": "note", "message": {"text": "Unused endpoint: ANY /api/ogp/cache/clear"}, "properties": {"repobilityId": "679e03b1dbce6cff", "scanner": "scanner-primary", "fingerprint": "c643b7b59c9eedff", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2e36b9e65c34e6dd", "level": "note", "message": {"text": "Unused endpoint: GET /api/og-image-today.png"}, "properties": {"repobilityId": "9437c10063a6f2a3", "scanner": "scanner-primary", "fingerprint": "2e36b9e65c34e6dd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7f38258d757c846c", "level": "note", "message": {"text": "Unused endpoint: ANY /api/og-image-today/regenerate"}, "properties": {"repobilityId": "ee81a9897e6212b3", "scanner": "scanner-primary", "fingerprint": "7f38258d757c846c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-268cab242d76588c", "level": "note", "message": {"text": "Unused endpoint: GET /api/og-image-backtest.png"}, "properties": {"repobilityId": "0beb11cdea67f74f", "scanner": "scanner-primary", "fingerprint": "268cab242d76588c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a430f87ec1f8a2b3", "level": "note", "message": {"text": "Unused endpoint: ANY /api/og-image-backtest/regenerate"}, "properties": {"repobilityId": "3163c73e6fa8b79a", "scanner": "scanner-primary", "fingerprint": "a430f87ec1f8a2b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-765e04e29faa0cdd", "level": "note", "message": {"text": "Unused endpoint: GET /api/backtest/methodology.pdf"}, "properties": {"repobilityId": "88ff420f378ef0d9", "scanner": "scanner-primary", "fingerprint": "765e04e29faa0cdd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-11f7633c8e85a643", "level": "note", "message": {"text": "Unused endpoint: ANY /api/backtest/methodology/regenerate"}, "properties": {"repobilityId": "81cbb0d36dc0eb49", "scanner": "scanner-primary", "fingerprint": "11f7633c8e85a643", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-70fd29dcffee518d", "level": "note", "message": {"text": "Unused endpoint: POST /api/profile-summary/refresh/batch"}, "properties": {"repobilityId": "cf68ea0ef978dd21", "scanner": "scanner-primary", "fingerprint": "70fd29dcffee518d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-28f8163bdfdff842", "level": "note", "message": {"text": "Unused endpoint: POST /api/insights/refresh/batch"}, "properties": {"repobilityId": "c667f9ae37cc008f", "scanner": "scanner-primary", "fingerprint": "28f8163bdfdff842", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6a56c6ccc07d4162", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/refresh-earnings-history"}, "properties": {"repobilityId": "69549a156520392b", "scanner": "scanner-primary", "fingerprint": "6a56c6ccc07d4162", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7ef180012dac02cc", "level": "note", "message": {"text": "Unused endpoint: POST /api/insights/refresh/{ticker}"}, "properties": {"repobilityId": "8370495e179ec1f1", "scanner": "scanner-primary", "fingerprint": "7ef180012dac02cc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5aa26d02face9f0b", "level": "note", "message": {"text": "Unused endpoint: ANY /api/insights/cache/clear"}, "properties": {"repobilityId": "3adc784244aa1b13", "scanner": "scanner-primary", "fingerprint": "5aa26d02face9f0b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-063a8fbe9339cce2", "level": "note", "message": {"text": "Unused endpoint: ANY /api/av/cache/clear"}, "properties": {"repobilityId": "90069930297c9865", "scanner": "scanner-primary", "fingerprint": "063a8fbe9339cce2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-295df4d3d93d97bd", "level": "note", "message": {"text": "Unused endpoint: POST /api/cron/cup-scan"}, "properties": {"repobilityId": "8406c0381d9de02b", "scanner": "scanner-primary", "fingerprint": "295df4d3d93d97bd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4d3a408080cec0b6", "level": "note", "message": {"text": "Unused endpoint: POST /api/cron/pattern-signals-cleanup"}, "properties": {"repobilityId": "7281875b5330ecf4", "scanner": "scanner-primary", "fingerprint": "4d3a408080cec0b6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-227be0ae94c66856", "level": "note", "message": {"text": "Unused endpoint: POST /api/cron/cup-notify"}, "properties": {"repobilityId": "8d78083c03d0bc25", "scanner": "scanner-primary", "fingerprint": "227be0ae94c66856", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-faa7383cefda707b", "level": "note", "message": {"text": "Unused endpoint: POST /api/cron/article-notify"}, "properties": {"repobilityId": "45ed6f86a7dcba02", "scanner": "scanner-primary", "fingerprint": "faa7383cefda707b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-52f620728c401b27", "level": "note", "message": {"text": "Unused endpoint: POST /api/cron/rs-scan"}, "properties": {"repobilityId": "93682e028e0c44d3", "scanner": "scanner-primary", "fingerprint": "52f620728c401b27", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4c960edc87190ddd", "level": "note", "message": {"text": "Unused endpoint: POST /api/cron/consensus-snapshot"}, "properties": {"repobilityId": "9e12969c7b826fb9", "scanner": "scanner-primary", "fingerprint": "4c960edc87190ddd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a28ca24b80aa7cf8", "level": "note", "message": {"text": "Unused endpoint: POST /api/cron/guidance-snapshot"}, "properties": {"repobilityId": "19451800fecfcdbf", "scanner": "scanner-primary", "fingerprint": "a28ca24b80aa7cf8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8b6482c00ae262bb", "level": "note", "message": {"text": "Unused endpoint: POST /api/cron/guidance-backfill"}, "properties": {"repobilityId": "a886097def8e8638", "scanner": "scanner-primary", "fingerprint": "8b6482c00ae262bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a58676791626ce60", "level": "note", "message": {"text": "Unused endpoint: GET /api/scanner/canslim"}, "properties": {"repobilityId": "a9acd2c6d978e947", "scanner": "scanner-primary", "fingerprint": "a58676791626ce60", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}