{"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-b1155292421b8371", "name": "Possibly dead Python function: extract_volume", "shortDescription": {"text": "Possibly dead Python function: extract_volume"}, "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-c3a412e86caa242e", "name": "Possibly dead Python function: fetch_ops", "shortDescription": {"text": "Possibly dead Python function: fetch_ops"}, "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-c6e413e4ba292f63", "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-3ad5c6c300112fef", "name": "Possibly dead Python function: assign_abc_revenue", "shortDescription": {"text": "Possibly dead Python function: assign_abc_revenue"}, "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-ed716cca62691315", "name": "Possibly dead Python function: assign_abc_markup", "shortDescription": {"text": "Possibly dead Python function: assign_abc_markup"}, "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-11ae58038cba6dcb", "name": "Possibly dead Python function: assign_abc_margin", "shortDescription": {"text": "Possibly dead Python function: assign_abc_margin"}, "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-49fe77e62096dea0", "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-d5a6ea528e9da4c7", "name": "Possibly dead Python function: do_GET", "shortDescription": {"text": "Possibly dead Python function: do_GET"}, "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-ce655361cf1043fd", "name": "Possibly dead Python function: do_POST", "shortDescription": {"text": "Possibly dead Python function: do_POST"}, "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-a623887ec35554e3", "name": "Possibly dead Python function: log_message", "shortDescription": {"text": "Possibly dead Python function: log_message"}, "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-329790aca3fb05ea", "name": "Possibly dead Python function: analyze_trend", "shortDescription": {"text": "Possibly dead Python function: analyze_trend"}, "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-a045e790f8831283", "name": "Possibly dead Python function: compare_to_average", "shortDescription": {"text": "Possibly dead Python function: compare_to_average"}, "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-b6a6c6cb2aaeeac7", "name": "Possibly dead Python function: detect_seasonality", "shortDescription": {"text": "Possibly dead Python function: detect_seasonality"}, "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-2789e46d7318d99a", "name": "Possibly dead Python function: validate_venue_key", "shortDescription": {"text": "Possibly dead Python function: validate_venue_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-19c294528255bebd", "name": "Possibly dead Python function: aggregate_metrics", "shortDescription": {"text": "Possibly dead Python function: aggregate_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-03fed7d6e19fa9a5", "name": "Possibly dead Python function: compare_periods", "shortDescription": {"text": "Possibly dead Python function: compare_periods"}, "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-5bb154dc89801d02", "name": "Possibly dead Python function: compare_venues", "shortDescription": {"text": "Possibly dead Python function: compare_venues"}, "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-25bd948cf2f65768", "name": "Possibly dead Python function: generate_for_month", "shortDescription": {"text": "Possibly dead Python function: generate_for_month"}, "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-cfcd5a8dd8ed8327", "name": "Possibly dead Python function: regenerate_for_period", "shortDescription": {"text": "Possibly dead Python function: regenerate_for_period"}, "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-5910b65a1a9504d1", "name": "Possibly dead Python function: regenerate_daily_plans", "shortDescription": {"text": "Possibly dead Python function: regenerate_daily_plans"}, "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-3408795cb59e7f10", "name": "Stray `console.log` in TS/JS \u2014 static/service-worker.js:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 static/service-worker.js:29"}, "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-af20ce8ec3afe991", "name": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/main.js:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/main.js:33"}, "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-4d088ff3453aa1cb", "name": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/export.js:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/export.js:27"}, "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-de462482e261de19", "name": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/comments.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/comments.js:20"}, "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-76256ac2c9253930", "name": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/week_selector.js:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/week_selector.js:32"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bd6a7e5e0beacc1b", "name": "TODO/FIXME marker in shipping code \u2014 static/js/dashboard/modules/charts.js:146", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 static/js/dashboard/modules/charts.js:146"}, "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-21038fa973b85438", "name": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/charts.js:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/charts.js:28"}, "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-25f4c1caaaef400d", "name": "TODO/FIXME marker in shipping code \u2014 static/js/dashboard/modules/venue_selector.js:144", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 static/js/dashboard/modules/venue_selector.js:144"}, "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-a624ae6b35672a23", "name": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/comparison.js:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/comparison.js:26"}, "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-e86e509f2063cb94", "name": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/trends.js:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/trends.js:23"}, "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-fabba30749c5fbcc", "name": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/revenue_metrics.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/revenue_metrics.js:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2fba68e11a2468b1", "name": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/datepicker.js:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/datepicker.js:35"}, "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-6c29cb8fac07099c", "name": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/analytics.js:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/analytics.js:66"}, "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-421a7cf9ac595367", "name": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/monthly_report.js:77", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/monthly_report.js:77"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d762e46ce1d8ff01", "name": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/core/api.js:86", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/core/api.js:86"}, "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-6b89f5635f480d1c", "name": "Stray `console.log` in TS/JS \u2014 static/js/widget/revenue_widget.js:87", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 static/js/widget/revenue_widget.js:87"}, "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-2278ca88266e5649", "name": "Privileged port 14 in use", "shortDescription": {"text": "Privileged port 14 in use"}, "fullDescription": {"text": "Port 14 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-0feca8a5413b4323", "name": "Privileged port 59 in use", "shortDescription": {"text": "Privileged port 59 in use"}, "fullDescription": {"text": "Port 59 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-13574893d2ffdb15", "name": "Docker base image is tag-pinned but not digest-pinned: mcr.microsoft.com/playwright/python:v1.49.1-jammy", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: mcr.microsoft.com/playwright/python:v1.49.1-jammy"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9710c8d059e53154", "name": "No frontend routes/components detected", "shortDescription": {"text": "No frontend routes/components detected"}, "fullDescription": {"text": "No React/Vue/Next routes were found. This is fine for backend-only repos."}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4d446827fa62a980", "name": "Insecure pattern 'subprocess_shell_true' in sync_push.py:14", "shortDescription": {"text": "Insecure pattern 'subprocess_shell_true' in sync_push.py:14"}, "fullDescription": {"text": "Found a known-risky pattern (subprocess_shell_true). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7a179e5f1f8f2f99", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/schedule/edit.js:115", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/schedule/edit.js:115"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e1ebe3580a5598da", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/schedule/common.js:156", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/schedule/common.js:156"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a132c8bd14f8f03d", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/main.js:182", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/main.js:182"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c705d984a2eca53d", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/plans.js:335", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/plans.js:335"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d041ac9d77bf5cb3", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/week_selector.js:100", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/week_selector.js:100"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-58b442b0070a2e88", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/meeting_notes.js:127", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/meeting_notes.js:127"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-82ed4c8b2557579d", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/venue_selector.js:70", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/venue_selector.js:70"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2ba16891f5107187", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/comparison.js:64", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/comparison.js:64"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cc4e436f7c99de8b", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/trends.js:297", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/trends.js:297"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d3b9c2a0b12e518e", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/revenue_metrics.js:149", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/revenue_metrics.js:149"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6339e7d57b23def0", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/daily_plans.js:150", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/daily_plans.js:150"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3b29febaaf60980c", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/analytics.js:163", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/analytics.js:163"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e17cf06e48cef2ac", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/monthly_report.js:86", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/monthly_report.js:86"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9863aed60d0eb6a1", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/js/widget/revenue_widget.js:232", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/widget/revenue_widget.js:232"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-937e8455ecb191fe", "name": "Insecure pattern 'direct_innerhtml_assignment' in static/libs/flexidatepicker.umd.min.js:16", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/libs/flexidatepicker.umd.min.js:16"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5329fa9cd1e60089", "name": "Insecure pattern 'debug_true' in menu_tool/app.py:25", "shortDescription": {"text": "Insecure pattern 'debug_true' in menu_tool/app.py:25"}, "fullDescription": {"text": "Found a known-risky pattern (debug_true). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d5a12b24aa7693f1", "name": "Insecure pattern 'debug_true' in knowledge_graph/chat_server.py:321", "shortDescription": {"text": "Insecure pattern 'debug_true' in knowledge_graph/chat_server.py:321"}, "fullDescription": {"text": "Found a known-risky pattern (debug_true). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-44e7651bafdc7e16", "name": "Possible secret in chz_test/README.md", "shortDescription": {"text": "Possible secret in chz_test/README.md"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-82cf1a9ee2ea6184", "name": "Very large file: routes/dashboard.py (1622 lines)", "shortDescription": {"text": "Very large file: routes/dashboard.py (1622 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-c452c71cf4b25de8", "name": "Very large file: routes/employee.py (1081 lines)", "shortDescription": {"text": "Very large file: routes/employee.py (1081 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-fc4d52a1ce5b4d71", "name": "Very large file: routes/analysis.py (1333 lines)", "shortDescription": {"text": "Very large file: routes/analysis.py (1333 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-f43e2702b58064cf", "name": "Very large file: routes/stocks.py (1378 lines)", "shortDescription": {"text": "Very large file: routes/stocks.py (1378 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-eb517211173ba3c0", "name": "Very large file: core/olap_reports.py (2149 lines)", "shortDescription": {"text": "Very large file: core/olap_reports.py (2149 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "17 tests / 161 src (ratio 0.11)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9a62f795d57aa246", "name": "343 TODO/FIXME markers", "shortDescription": {"text": "343 TODO/FIXME markers"}, "fullDescription": {"text": "High count of TODO/FIXME/HACK markers \u2014 track them as issues so they're not forgotten."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "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 2138 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-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. 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-521f80bf3a9ed8b7", "name": "Agent authority lacks a verifier contract: .claude/docs/INDEX.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/docs/INDEX.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-5829406e77bec590", "name": "Agent authority lacks a verifier contract: .claude/docs/stocks.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/docs/stocks.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-4586aa16b7c293ea", "name": "Agent authority lacks a verifier contract: .claude/docs/CHANGELOG.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/docs/CHANGELOG.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-0ee9e54003532d10", "name": "Agent authority lacks a verifier contract: .claude/skills/web-design-reviewer/references/framework-fixes.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/web-design-reviewer/references/framework-fixes.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-68c07d16c192958d", "name": "Network/subprocess call without timeout or try/except \u2014 sync_push.py:14", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 sync_push.py:14"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9a61068da4079f3", "name": "Legacy-named symbol `test_migration_v2_to_v3_preserves_data_and_makes_backup` in tests/test_schedule_v3.py:96", "shortDescription": {"text": "Legacy-named symbol `test_migration_v2_to_v3_preserves_data_and_makes_backup` in tests/test_schedule_v3.py:96"}, "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-da31a71d3f36565c", "name": "Commented-code block (5 lines) in static/js/dashboard/modules/analytics.js:42", "shortDescription": {"text": "Commented-code block (5 lines) in static/js/dashboard/modules/analytics.js:42"}, "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-b342ffef1a8b5c24", "name": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/widget/revenue_widget.js:197", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/widget/revenue_widget.js:197"}, "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-d2ff44e2f4815281", "name": "Legacy-named symbol `l4l_draft_ytd_v2` in scripts/l4l_draft.py:207", "shortDescription": {"text": "Legacy-named symbol `l4l_draft_ytd_v2` in scripts/l4l_draft.py:207"}, "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-e09469405f8b940c", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/check/check_dashboard_simple.py:34", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/check/check_dashboard_simple.py:34"}, "fullDescription": {"text": "`requests.post(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8476635b3a957b09", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/check/comprehensive_dashboard_check.py:50", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/check/comprehensive_dashboard_check.py:50"}, "fullDescription": {"text": "`requests.post(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-349cd0d43488312a", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_all_bars.py:6", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_all_bars.py:6"}, "fullDescription": {"text": "`requests.post(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0aa7378d87f61ac3", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_ligovskiy.py:6", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_ligovskiy.py:6"}, "fullDescription": {"text": "`requests.post(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-295cddb1743c5a66", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_varshavskaya.py:6", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_varshavskaya.py:6"}, "fullDescription": {"text": "`requests.post(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-979b61a93125aec1", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_loyalty_kremenchugskaya.py:4", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_loyalty_kremenchugskaya.py:4"}, "fullDescription": {"text": "`requests.post(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fd742744375baa27", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_loyalty_all_bars.py:15", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_loyalty_all_bars.py:15"}, "fullDescription": {"text": "`requests.post(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4310d2ad5de52d91", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_bolshoy.py:6", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_bolshoy.py:6"}, "fullDescription": {"text": "`requests.post(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9da00a933cf5f964", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_sadovaya.py:6", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_sadovaya.py:6"}, "fullDescription": {"text": "`requests.post(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d34200ec762f795a", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_loyalty_v2.py:4", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_loyalty_v2.py:4"}, "fullDescription": {"text": "`requests.post(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27e25ed3172c0125", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_kremenchugskaya.py:6", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_kremenchugskaya.py:6"}, "fullDescription": {"text": "`requests.post(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-db6842b4de21d1a6", "name": "Network/subprocess call without timeout or try/except \u2014 utils/auto_add_new_dishes.py:187", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 utils/auto_add_new_dishes.py:187"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-668305fa3df98096", "name": "Legacy-named symbol `abc_df_copy` in routes/analysis.py:104", "shortDescription": {"text": "Legacy-named symbol `abc_df_copy` in routes/analysis.py:104"}, "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-b85003ce02d70d42", "name": "Commented-code block (5 lines) in routes/stocks.py:47", "shortDescription": {"text": "Commented-code block (5 lines) in routes/stocks.py: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-374a729860d8c4cf", "name": "Network/subprocess call without timeout or try/except \u2014 routes/stocks.py:843", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 routes/stocks.py:843"}, "fullDescription": {"text": "`subprocess.Popen(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-32344c2170afedb6", "name": "Legacy-named symbol `df_copy` in core/data_processor.py:69", "shortDescription": {"text": "Legacy-named symbol `df_copy` in core/data_processor.py:69"}, "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-1ee324330de2ab8d", "name": "Commented-code block (5 lines) in core/shifts_manager.py:142", "shortDescription": {"text": "Commented-code block (5 lines) in core/shifts_manager.py:142"}, "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-6ba114abf4411e3a", "name": "Legacy-named symbol `event_copy` in core/taps_manager.py:405", "shortDescription": {"text": "Legacy-named symbol `event_copy` in core/taps_manager.py:405"}, "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-9f9d6454dfb9e167", "name": "Legacy-named symbol `_restore_from_backup` in core/plans_manager.py:151", "shortDescription": {"text": "Legacy-named symbol `_restore_from_backup` in core/plans_manager.py:151"}, "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-acad78d678f29aa0", "name": "Commented-code block (5 lines) in core/olap_reports.py:842", "shortDescription": {"text": "Commented-code block (5 lines) in core/olap_reports.py:842"}, "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-477fad5e0f5c1fa6", "name": "Commented-code block (5 lines) in chz_test/export_bartender_list.py:22", "shortDescription": {"text": "Commented-code block (5 lines) in chz_test/export_bartender_list.py:22"}, "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-232754467bdc8f00", "name": "Commented-code block (7 lines) in chz_test/chz.py:69", "shortDescription": {"text": "Commented-code block (7 lines) in chz_test/chz.py:69"}, "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-5fa5af25316da646", "name": "16 env vars used in code but missing from .env.example", "shortDescription": {"text": "16 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `CHZ_REFRESH_URL`, `FLASK_DEBUG`, `GEMINI_API_KEY`, `LLM_API_KEY`, `LLM_MODEL`, `LLM_PROVIDER`, `MONTHLY_REPORT_HOUR`, `MONTHLY_REPORT_MINUTE` + 8 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:\ntelegram_webhook.py:find_beer_info_local, routes/taps.py:find_beer_info\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-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/debug/debug_beer_products.py:main, scripts/debug/debug_product_groups.py:main, scripts/debug/debug_categories.py:main, scripts/debug/debug_full_product_fields.py:main\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nroutes/analysis.py:assign_abc_revenue, routes/analysis.py:assign_abc_revenue, routes/analysis.py:assign_abc_revenue\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-33a6b62e30ce7ab4", "name": "Near-duplicate function bodies in 6 places", "shortDescription": {"text": "Near-duplicate function bodies in 6 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nroutes/analysis.py:assign_abc_markup, routes/analysis.py:assign_abc_margin, routes/analysis.py:assign_abc_markup, routes/analysis.py:assign_abc_margin\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-27ac92ff793e1d8f", "name": "Dangling fetch: GET /api/analyze-period/${venueKey}/${periodKey} (static/js/dashboard/modules/comments.js:197)", "shortDescription": {"text": "Dangling fetch: GET /api/analyze-period/${venueKey}/${periodKey} (static/js/dashboard/modules/comments.js:197)"}, "fullDescription": {"text": "`static/js/dashboard/modules/comments.js:197` calls `GET /api/analyze-period/${venueKey}/${periodKey}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/analyze-period/<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-805a39c42847396e", "name": "Unused endpoint: ANY /static/manifest.json", "shortDescription": {"text": "Unused endpoint: ANY /static/manifest.json"}, "fullDescription": {"text": "`app.py` declares `ANY /static/manifest.json` 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-1a6d91f2236825bf", "name": "Unused endpoint: ANY /", "shortDescription": {"text": "Unused endpoint: ANY /"}, "fullDescription": {"text": "`menu_tool/menu_routes.py` declares `ANY /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3d47f5777840c8d6", "name": "Unused endpoint: ANY /library", "shortDescription": {"text": "Unused endpoint: ANY /library"}, "fullDescription": {"text": "`menu_tool/menu_routes.py` declares `ANY /library` 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-e4e94277346928b8", "name": "Unused endpoint: ANY /card", "shortDescription": {"text": "Unused endpoint: ANY /card"}, "fullDescription": {"text": "`menu_tool/menu_routes.py` declares `ANY /card` 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-9c583e3a531a8b48", "name": "Unused endpoint: ANY /api/items", "shortDescription": {"text": "Unused endpoint: ANY /api/items"}, "fullDescription": {"text": "`menu_tool/menu_routes.py` declares `ANY /api/items` 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-51f9659e33b8543a", "name": "Unused endpoint: ANY /api/items/<int:item_id>", "shortDescription": {"text": "Unused endpoint: ANY /api/items/<int:item_id>"}, "fullDescription": {"text": "`menu_tool/menu_routes.py` declares `ANY /api/items/<int:item_id>` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cca8483232bea4f0", "name": "Unused endpoint: ANY /api/settings", "shortDescription": {"text": "Unused endpoint: ANY /api/settings"}, "fullDescription": {"text": "`menu_tool/menu_routes.py` declares `ANY /api/settings` 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-8e6099cb301c956d", "name": "Unused endpoint: ANY /api/render", "shortDescription": {"text": "Unused endpoint: ANY /api/render"}, "fullDescription": {"text": "`menu_tool/menu_routes.py` declares `ANY /api/render` 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-2a03226f61e15b54", "name": "Unused endpoint: ANY /api/render-pdf", "shortDescription": {"text": "Unused endpoint: ANY /api/render-pdf"}, "fullDescription": {"text": "`menu_tool/menu_routes.py` declares `ANY /api/render-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-818872fe3e47da20", "name": "Unused endpoint: ANY /api/admin/open-check/run-now", "shortDescription": {"text": "Unused endpoint: ANY /api/admin/open-check/run-now"}, "fullDescription": {"text": "`routes/open_check.py` declares `ANY /api/admin/open-check/run-now` 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-592efdc77602a51e", "name": "Unused endpoint: ANY /telegram/openbot/setup-webhook", "shortDescription": {"text": "Unused endpoint: ANY /telegram/openbot/setup-webhook"}, "fullDescription": {"text": "`routes/open_check.py` declares `ANY /telegram/openbot/setup-webhook` 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-ea7445ba87dc2ea5", "name": "Unused endpoint: ANY /telegram/openbot/webhook-info", "shortDescription": {"text": "Unused endpoint: ANY /telegram/openbot/webhook-info"}, "fullDescription": {"text": "`routes/open_check.py` declares `ANY /telegram/openbot/webhook-info` 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-3d0ed796370f8843", "name": "Unused endpoint: ANY /telegram/openbot/delete-webhook", "shortDescription": {"text": "Unused endpoint: ANY /telegram/openbot/delete-webhook"}, "fullDescription": {"text": "`routes/open_check.py` declares `ANY /telegram/openbot/delete-webhook` 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-4f483a40afa350da", "name": "Unused endpoint: ANY /api/test", "shortDescription": {"text": "Unused endpoint: ANY /api/test"}, "fullDescription": {"text": "`routes/misc.py` declares `ANY /api/test` 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-71209d15a2fd59ed", "name": "Unused endpoint: ANY /wiki", "shortDescription": {"text": "Unused endpoint: ANY /wiki"}, "fullDescription": {"text": "`routes/misc.py` declares `ANY /wiki` 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-17e4d4466069f83e", "name": "Unused endpoint: ANY /test_modules", "shortDescription": {"text": "Unused endpoint: ANY /test_modules"}, "fullDescription": {"text": "`routes/misc.py` declares `ANY /test_modules` 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-cca4258212d33cc2", "name": "Unused endpoint: ANY /api/debug/taps-data", "shortDescription": {"text": "Unused endpoint: ANY /api/debug/taps-data"}, "fullDescription": {"text": "`routes/misc.py` declares `ANY /api/debug/taps-data` 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-22bd189963543b20", "name": "Unused endpoint: ANY /telegram/webhook", "shortDescription": {"text": "Unused endpoint: ANY /telegram/webhook"}, "fullDescription": {"text": "`routes/misc.py` declares `ANY /telegram/webhook` 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-cc8da8ea87fe3475", "name": "Unused endpoint: ANY /telegram/setup-webhook", "shortDescription": {"text": "Unused endpoint: ANY /telegram/setup-webhook"}, "fullDescription": {"text": "`routes/misc.py` declares `ANY /telegram/setup-webhook` 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-49d9c60addc22ba1", "name": "Unused endpoint: ANY /telegram/webhook-info", "shortDescription": {"text": "Unused endpoint: ANY /telegram/webhook-info"}, "fullDescription": {"text": "`routes/misc.py` declares `ANY /telegram/webhook-info` 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-6eca02f8fcbfa2fc", "name": "Unused endpoint: ANY /telegram/delete-webhook", "shortDescription": {"text": "Unused endpoint: ANY /telegram/delete-webhook"}, "fullDescription": {"text": "`routes/misc.py` declares `ANY /telegram/delete-webhook` 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-037e102783020f47", "name": "Unused endpoint: ANY /expiration", "shortDescription": {"text": "Unused endpoint: ANY /expiration"}, "fullDescription": {"text": "`routes/expiration.py` declares `ANY /expiration` 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-288ccb9bb91dc99d", "name": "Unused endpoint: ANY /api/expiration/board", "shortDescription": {"text": "Unused endpoint: ANY /api/expiration/board"}, "fullDescription": {"text": "`routes/expiration.py` declares `ANY /api/expiration/board` 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-42b65aa339ad32e1", "name": "Unused endpoint: ANY /explorer", "shortDescription": {"text": "Unused endpoint: ANY /explorer"}, "fullDescription": {"text": "`routes/explorer.py` declares `ANY /explorer` 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-8a3d199d0620665d", "name": "Unused endpoint: ANY /api/explorer/pivot", "shortDescription": {"text": "Unused endpoint: ANY /api/explorer/pivot"}, "fullDescription": {"text": "`routes/explorer.py` declares `ANY /api/explorer/pivot` 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-98d2c912f9f7d047", "name": "Unused endpoint: ANY /api/dashboard-analytics", "shortDescription": {"text": "Unused endpoint: ANY /api/dashboard-analytics"}, "fullDescription": {"text": "`routes/dashboard.py` declares `ANY /api/dashboard-analytics` 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-3c82e3e438086c1e", "name": "Unused endpoint: ANY /api/monthly-report", "shortDescription": {"text": "Unused endpoint: ANY /api/monthly-report"}, "fullDescription": {"text": "`routes/dashboard.py` declares `ANY /api/monthly-report` 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-893d9a2e15e000eb", "name": "Unused endpoint: ANY /api/monthly-report/loyalty", "shortDescription": {"text": "Unused endpoint: ANY /api/monthly-report/loyalty"}, "fullDescription": {"text": "`routes/dashboard.py` declares `ANY /api/monthly-report/loyalty` 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-a9952cbe448c86be", "name": "Unused endpoint: ANY /api/monthly-report/draft-liters", "shortDescription": {"text": "Unused endpoint: ANY /api/monthly-report/draft-liters"}, "fullDescription": {"text": "`routes/dashboard.py` declares `ANY /api/monthly-report/draft-liters` 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-6db87374118aa9da", "name": "Unused endpoint: ANY /api/monthly-report/top-guests", "shortDescription": {"text": "Unused endpoint: ANY /api/monthly-report/top-guests"}, "fullDescription": {"text": "`routes/dashboard.py` declares `ANY /api/monthly-report/top-guests` 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-d826b1f905098b16", "name": "Unused endpoint: ANY /api/venues", "shortDescription": {"text": "Unused endpoint: ANY /api/venues"}, "fullDescription": {"text": "`routes/dashboard.py` declares `ANY /api/venues` 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-c6fcd8209dede70a", "name": "Unused endpoint: ANY /api/weeks", "shortDescription": {"text": "Unused endpoint: ANY /api/weeks"}, "fullDescription": {"text": "`routes/dashboard.py` declares `ANY /api/weeks` 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-0729e88b25091894", "name": "Unused endpoint: ANY /api/plans/<venue_key>/<period_key>", "shortDescription": {"text": "Unused endpoint: ANY /api/plans/<venue_key>/<period_key>"}, "fullDescription": {"text": "`routes/dashboard.py` declares `ANY /api/plans/<venue_key>/<period_key>` 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-06c512aeeabc9b57", "name": "Unused endpoint: ANY /api/plans/calculate/<venue_key>/<start_date>/<end_date>", "shortDescription": {"text": "Unused endpoint: ANY /api/plans/calculate/<venue_key>/<start_date>/<end_date>"}, "fullDescription": {"text": "`routes/dashboard.py` declares `ANY /api/plans/calculate/<venue_key>/<start_date>/<end_date>` 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-99f95b7e982024a7", "name": "Unused endpoint: ANY /api/plans", "shortDescription": {"text": "Unused endpoint: ANY /api/plans"}, "fullDescription": {"text": "`routes/dashboard.py` declares `ANY /api/plans` 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-b07572dd89587b86", "name": "Unused endpoint: ANY /api/plans/daily/<venue_key>/<int:year>/<int:month>", "shortDescription": {"text": "Unused endpoint: ANY /api/plans/daily/<venue_key>/<int:year>/<int:month>"}, "fullDescription": {"text": "`routes/dashboard.py` declares `ANY /api/plans/daily/<venue_key>/<int:year>/<int:month>` 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-e7010531bcaf7b8b", "name": "Unused endpoint: ANY /api/plans/daily/<venue_key>/<int:year>/<int:month>/<date_str>", "shortDescription": {"text": "Unused endpoint: ANY /api/plans/daily/<venue_key>/<int:year>/<int:month>/<date_str>"}, "fullDescription": {"text": "`routes/dashboard.py` declares `ANY /api/plans/daily/<venue_key>/<int:year>/<int:month>/<date_str>` 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-0a71ff83b9f4747b", "name": "Unused endpoint: ANY /api/storage/diagnose", "shortDescription": {"text": "Unused endpoint: ANY /api/storage/diagnose"}, "fullDescription": {"text": "`routes/dashboard.py` declares `ANY /api/storage/diagnose` 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-454195c28e5dcca1", "name": "Unused endpoint: ANY /api/comments/<venue_key>/<period_key>", "shortDescription": {"text": "Unused endpoint: ANY /api/comments/<venue_key>/<period_key>"}, "fullDescription": {"text": "`routes/dashboard.py` declares `ANY /api/comments/<venue_key>/<period_key>` 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-89695836df8157d8", "name": "Unused endpoint: ANY /api/comparison/periods", "shortDescription": {"text": "Unused endpoint: ANY /api/comparison/periods"}, "fullDescription": {"text": "`routes/dashboard.py` declares `ANY /api/comparison/periods` 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-e1275f6628778a62", "name": "Unused endpoint: ANY /api/export/text", "shortDescription": {"text": "Unused endpoint: ANY /api/export/text"}, "fullDescription": {"text": "`routes/dashboard.py` declares `ANY /api/export/text` 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-b35015321118bf25", "name": "Unused endpoint: ANY /api/schedule/employees", "shortDescription": {"text": "Unused endpoint: ANY /api/schedule/employees"}, "fullDescription": {"text": "`routes/schedule.py` declares `ANY /api/schedule/employees` 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-ae00af97dd67e70a", "name": "Unused endpoint: ANY /api/schedule/employees/sync", "shortDescription": {"text": "Unused endpoint: ANY /api/schedule/employees/sync"}, "fullDescription": {"text": "`routes/schedule.py` declares `ANY /api/schedule/employees/sync` 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-600979426a0e328d", "name": "Unused endpoint: ANY /api/schedule/employee/<name>", "shortDescription": {"text": "Unused endpoint: ANY /api/schedule/employee/<name>"}, "fullDescription": {"text": "`routes/schedule.py` declares `ANY /api/schedule/employee/<name>` 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-17bf1379d7fe838b", "name": "Unused endpoint: ANY /api/schedule/roles", "shortDescription": {"text": "Unused endpoint: ANY /api/schedule/roles"}, "fullDescription": {"text": "`routes/schedule.py` declares `ANY /api/schedule/roles` 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-4ee301f12a4c703b", "name": "Unused endpoint: ANY /api/schedule/locations", "shortDescription": {"text": "Unused endpoint: ANY /api/schedule/locations"}, "fullDescription": {"text": "`routes/schedule.py` declares `ANY /api/schedule/locations` 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-550d5181c330258e", "name": "Unused endpoint: ANY /api/schedule/<int:year>/<int:month>", "shortDescription": {"text": "Unused endpoint: ANY /api/schedule/<int:year>/<int:month>"}, "fullDescription": {"text": "`routes/schedule.py` declares `ANY /api/schedule/<int:year>/<int:month>` 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-aa354e8bbd257da4", "name": "Unused endpoint: ANY /api/schedule/shift", "shortDescription": {"text": "Unused endpoint: ANY /api/schedule/shift"}, "fullDescription": {"text": "`routes/schedule.py` declares `ANY /api/schedule/shift` 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-c949987f525e6acc", "name": "Unused endpoint: ANY /api/schedule/shift/<int:shift_id>", "shortDescription": {"text": "Unused endpoint: ANY /api/schedule/shift/<int:shift_id>"}, "fullDescription": {"text": "`routes/schedule.py` declares `ANY /api/schedule/shift/<int:shift_id>` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7af7e432906cf572", "name": "Unused endpoint: ANY /api/schedule/shift/<int:shift_id>/fact", "shortDescription": {"text": "Unused endpoint: ANY /api/schedule/shift/<int:shift_id>/fact"}, "fullDescription": {"text": "`routes/schedule.py` declares `ANY /api/schedule/shift/<int:shift_id>/fact` 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/22908"}, "properties": {"repository": "wwworm666/beer-abc-analysis", "repoUrl": "https://github.com/wwworm666/beer-abc-analysis", "branch": "main"}, "results": [{"ruleId": "scanner-b1155292421b8371", "level": "note", "message": {"text": "Possibly dead Python function: extract_volume"}, "properties": {"repobilityId": "4e584a5603803493", "scanner": "scanner-primary", "fingerprint": "b1155292421b8371", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/analysis/calculate_real_consumption.py:37"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c3a412e86caa242e", "level": "note", "message": {"text": "Possibly dead Python function: fetch_ops"}, "properties": {"repobilityId": "f4c63e1edff72113", "scanner": "scanner-primary", "fingerprint": "c3a412e86caa242e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/expiration.py:210"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c6e413e4ba292f63", "level": "note", "message": {"text": "Possibly dead Python function: sort_key"}, "properties": {"repobilityId": "ac2a4181eae38738", "scanner": "scanner-primary", "fingerprint": "c6e413e4ba292f63", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/expiration.py:349"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ad5c6c300112fef", "level": "note", "message": {"text": "Possibly dead Python function: assign_abc_revenue"}, "properties": {"repobilityId": "72753d302a5269b5", "scanner": "scanner-primary", "fingerprint": "3ad5c6c300112fef", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/analysis.py:691"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ed716cca62691315", "level": "note", "message": {"text": "Possibly dead Python function: assign_abc_markup"}, "properties": {"repobilityId": "26b7ccb70a1f9e83", "scanner": "scanner-primary", "fingerprint": "ed716cca62691315", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/analysis.py:706"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-11ae58038cba6dcb", "level": "note", "message": {"text": "Possibly dead Python function: assign_abc_margin"}, "properties": {"repobilityId": "c5682d46fa09a746", "scanner": "scanner-primary", "fingerprint": "11ae58038cba6dcb", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/analysis.py:722"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-49fe77e62096dea0", "level": "note", "message": {"text": "Possibly dead Python function: sort_key"}, "properties": {"repobilityId": "ac2a4181eae38738", "scanner": "scanner-primary", "fingerprint": "49fe77e62096dea0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/stocks.py:1348"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d5a6ea528e9da4c7", "level": "note", "message": {"text": "Possibly dead Python function: do_GET"}, "properties": {"repobilityId": "2d943bb45e4f13bd", "scanner": "scanner-primary", "fingerprint": "d5a6ea528e9da4c7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/chz_receiver.py:17"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ce655361cf1043fd", "level": "note", "message": {"text": "Possibly dead Python function: do_POST"}, "properties": {"repobilityId": "53357410ca9379a9", "scanner": "scanner-primary", "fingerprint": "ce655361cf1043fd", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/chz_receiver.py:27"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a623887ec35554e3", "level": "note", "message": {"text": "Possibly dead Python function: log_message"}, "properties": {"repobilityId": "965f3150b4af5b2e", "scanner": "scanner-primary", "fingerprint": "a623887ec35554e3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/chz_receiver.py:54"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-329790aca3fb05ea", "level": "note", "message": {"text": "Possibly dead Python function: analyze_trend"}, "properties": {"repobilityId": "a240e55f1949d426", "scanner": "scanner-primary", "fingerprint": "329790aca3fb05ea", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "core/trends_analyzer.py:16"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a045e790f8831283", "level": "note", "message": {"text": "Possibly dead Python function: compare_to_average"}, "properties": {"repobilityId": "2202cbc0e4a2864b", "scanner": "scanner-primary", "fingerprint": "a045e790f8831283", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "core/trends_analyzer.py:94"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b6a6c6cb2aaeeac7", "level": "note", "message": {"text": "Possibly dead Python function: detect_seasonality"}, "properties": {"repobilityId": "cd0ba0c6dafc08a8", "scanner": "scanner-primary", "fingerprint": "b6a6c6cb2aaeeac7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "core/trends_analyzer.py:134"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2789e46d7318d99a", "level": "note", "message": {"text": "Possibly dead Python function: validate_venue_key"}, "properties": {"repobilityId": "cfacb6aa32a938a5", "scanner": "scanner-primary", "fingerprint": "2789e46d7318d99a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "core/venues_manager.py:51"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-19c294528255bebd", "level": "note", "message": {"text": "Possibly dead Python function: aggregate_metrics"}, "properties": {"repobilityId": "7c5a1658e29892d5", "scanner": "scanner-primary", "fingerprint": "19c294528255bebd", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "core/venues_manager.py:132"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-03fed7d6e19fa9a5", "level": "note", "message": {"text": "Possibly dead Python function: compare_periods"}, "properties": {"repobilityId": "069c55a3e8eec7f8", "scanner": "scanner-primary", "fingerprint": "03fed7d6e19fa9a5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "core/comparison_calculator.py:16"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5bb154dc89801d02", "level": "note", "message": {"text": "Possibly dead Python function: compare_venues"}, "properties": {"repobilityId": "4aba3f6beff26277", "scanner": "scanner-primary", "fingerprint": "5bb154dc89801d02", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "core/comparison_calculator.py:64"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-25bd948cf2f65768", "level": "note", "message": {"text": "Possibly dead Python function: generate_for_month"}, "properties": {"repobilityId": "0d8f2a48e620cf44", "scanner": "scanner-primary", "fingerprint": "25bd948cf2f65768", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "core/daily_plans_generator.py:184"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cfcd5a8dd8ed8327", "level": "note", "message": {"text": "Possibly dead Python function: regenerate_for_period"}, "properties": {"repobilityId": "14dcd634e4c77a0f", "scanner": "scanner-primary", "fingerprint": "cfcd5a8dd8ed8327", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "core/daily_plans_generator.py:254"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5910b65a1a9504d1", "level": "note", "message": {"text": "Possibly dead Python function: regenerate_daily_plans"}, "properties": {"repobilityId": "fc18841f632ee898", "scanner": "scanner-primary", "fingerprint": "5910b65a1a9504d1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "core/daily_plans_generator.py:366"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3408795cb59e7f10", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 static/service-worker.js:29"}, "properties": {"repobilityId": "08be1247c627f035", "scanner": "scanner-primary", "fingerprint": "3408795cb59e7f10", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-af20ce8ec3afe991", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/main.js:33"}, "properties": {"repobilityId": "b24b7ca3205649fd", "scanner": "scanner-primary", "fingerprint": "af20ce8ec3afe991", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4d088ff3453aa1cb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/export.js:27"}, "properties": {"repobilityId": "7482324071657e90", "scanner": "scanner-primary", "fingerprint": "4d088ff3453aa1cb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-de462482e261de19", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/comments.js:20"}, "properties": {"repobilityId": "5fe501cb7ac0bbec", "scanner": "scanner-primary", "fingerprint": "de462482e261de19", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-76256ac2c9253930", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/week_selector.js:32"}, "properties": {"repobilityId": "d642121125be49e1", "scanner": "scanner-primary", "fingerprint": "76256ac2c9253930", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bd6a7e5e0beacc1b", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 static/js/dashboard/modules/charts.js:146"}, "properties": {"repobilityId": "a6cbaa8d760a71da", "scanner": "scanner-primary", "fingerprint": "bd6a7e5e0beacc1b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-21038fa973b85438", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/charts.js:28"}, "properties": {"repobilityId": "6fc4d19f451bf00a", "scanner": "scanner-primary", "fingerprint": "21038fa973b85438", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-25f4c1caaaef400d", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 static/js/dashboard/modules/venue_selector.js:144"}, "properties": {"repobilityId": "04895c3dd4daeae0", "scanner": "scanner-primary", "fingerprint": "25f4c1caaaef400d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-a624ae6b35672a23", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/comparison.js:26"}, "properties": {"repobilityId": "7c36d5a4ed2da364", "scanner": "scanner-primary", "fingerprint": "a624ae6b35672a23", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e86e509f2063cb94", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/trends.js:23"}, "properties": {"repobilityId": "5858a8e4a638b10c", "scanner": "scanner-primary", "fingerprint": "e86e509f2063cb94", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fabba30749c5fbcc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/revenue_metrics.js:22"}, "properties": {"repobilityId": "a8b0a90f67590766", "scanner": "scanner-primary", "fingerprint": "fabba30749c5fbcc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2fba68e11a2468b1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/datepicker.js:35"}, "properties": {"repobilityId": "577d53cd45443b30", "scanner": "scanner-primary", "fingerprint": "2fba68e11a2468b1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6c29cb8fac07099c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/analytics.js:66"}, "properties": {"repobilityId": "8d3b138b5c1b9fcb", "scanner": "scanner-primary", "fingerprint": "6c29cb8fac07099c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-421a7cf9ac595367", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/modules/monthly_report.js:77"}, "properties": {"repobilityId": "fcf6d1eb6f3d37b1", "scanner": "scanner-primary", "fingerprint": "421a7cf9ac595367", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d762e46ce1d8ff01", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 static/js/dashboard/core/api.js:86"}, "properties": {"repobilityId": "b31f0f6efc181378", "scanner": "scanner-primary", "fingerprint": "d762e46ce1d8ff01", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6b89f5635f480d1c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 static/js/widget/revenue_widget.js:87"}, "properties": {"repobilityId": "f0af1aaa13d19641", "scanner": "scanner-primary", "fingerprint": "6b89f5635f480d1c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2278ca88266e5649", "level": "warning", "message": {"text": "Privileged port 14 in use"}, "properties": {"repobilityId": "2dbd4b719a1412ff", "scanner": "scanner-primary", "fingerprint": "2278ca88266e5649", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "render.yaml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0feca8a5413b4323", "level": "warning", "message": {"text": "Privileged port 59 in use"}, "properties": {"repobilityId": "6c14a9dab4958e92", "scanner": "scanner-primary", "fingerprint": "0feca8a5413b4323", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "render.yaml"}, "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-13574893d2ffdb15", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: mcr.microsoft.com/playwright/python:v1.49.1-jammy"}, "properties": {"repobilityId": "54994b84c00040b4", "scanner": "scanner-primary", "fingerprint": "13574893d2ffdb15", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 1}}}]}, {"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-9710c8d059e53154", "level": "none", "message": {"text": "No frontend routes/components detected"}, "properties": {"repobilityId": "44ca61485762e494", "scanner": "scanner-primary", "fingerprint": "9710c8d059e53154", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-4d446827fa62a980", "level": "warning", "message": {"text": "Insecure pattern 'subprocess_shell_true' in sync_push.py:14"}, "properties": {"repobilityId": "1cf5948d423c8c32", "scanner": "scanner-primary", "fingerprint": "4d446827fa62a980", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "subprocess_shell_true"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sync_push.py"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-7a179e5f1f8f2f99", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/schedule/edit.js:115"}, "properties": {"repobilityId": "d7ab779fb44096bc", "scanner": "scanner-primary", "fingerprint": "7a179e5f1f8f2f99", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/schedule/edit.js"}, "region": {"startLine": 115}}}]}, {"ruleId": "scanner-e1ebe3580a5598da", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/schedule/common.js:156"}, "properties": {"repobilityId": "a6de675b50a899a8", "scanner": "scanner-primary", "fingerprint": "e1ebe3580a5598da", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/schedule/common.js"}, "region": {"startLine": 156}}}]}, {"ruleId": "scanner-a132c8bd14f8f03d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/main.js:182"}, "properties": {"repobilityId": "b44e0b46ec045a8c", "scanner": "scanner-primary", "fingerprint": "a132c8bd14f8f03d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/dashboard/main.js"}, "region": {"startLine": 182}}}]}, {"ruleId": "scanner-c705d984a2eca53d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/plans.js:335"}, "properties": {"repobilityId": "80453293cf2d5371", "scanner": "scanner-primary", "fingerprint": "c705d984a2eca53d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/dashboard/modules/plans.js"}, "region": {"startLine": 335}}}]}, {"ruleId": "scanner-d041ac9d77bf5cb3", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/week_selector.js:100"}, "properties": {"repobilityId": "f545ef3ad0da358b", "scanner": "scanner-primary", "fingerprint": "d041ac9d77bf5cb3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/dashboard/modules/week_selector.js"}, "region": {"startLine": 100}}}]}, {"ruleId": "scanner-58b442b0070a2e88", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/meeting_notes.js:127"}, "properties": {"repobilityId": "ae1a39c73ad6d3b2", "scanner": "scanner-primary", "fingerprint": "58b442b0070a2e88", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/dashboard/modules/meeting_notes.js"}, "region": {"startLine": 127}}}]}, {"ruleId": "scanner-82ed4c8b2557579d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/venue_selector.js:70"}, "properties": {"repobilityId": "8edb0761057aae67", "scanner": "scanner-primary", "fingerprint": "82ed4c8b2557579d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/dashboard/modules/venue_selector.js"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-2ba16891f5107187", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/comparison.js:64"}, "properties": {"repobilityId": "ab71d46f63d9649c", "scanner": "scanner-primary", "fingerprint": "2ba16891f5107187", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/dashboard/modules/comparison.js"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-cc4e436f7c99de8b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/trends.js:297"}, "properties": {"repobilityId": "9db209de8319ba72", "scanner": "scanner-primary", "fingerprint": "cc4e436f7c99de8b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/dashboard/modules/trends.js"}, "region": {"startLine": 297}}}]}, {"ruleId": "scanner-d3b9c2a0b12e518e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/revenue_metrics.js:149"}, "properties": {"repobilityId": "42d9770e96c430fd", "scanner": "scanner-primary", "fingerprint": "d3b9c2a0b12e518e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/dashboard/modules/revenue_metrics.js"}, "region": {"startLine": 149}}}]}, {"ruleId": "scanner-6339e7d57b23def0", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/daily_plans.js:150"}, "properties": {"repobilityId": "b1e6637df1b9716e", "scanner": "scanner-primary", "fingerprint": "6339e7d57b23def0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/dashboard/modules/daily_plans.js"}, "region": {"startLine": 150}}}]}, {"ruleId": "scanner-3b29febaaf60980c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/analytics.js:163"}, "properties": {"repobilityId": "a446fca3651dc549", "scanner": "scanner-primary", "fingerprint": "3b29febaaf60980c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/dashboard/modules/analytics.js"}, "region": {"startLine": 163}}}]}, {"ruleId": "scanner-e17cf06e48cef2ac", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/dashboard/modules/monthly_report.js:86"}, "properties": {"repobilityId": "f8da2319fd922971", "scanner": "scanner-primary", "fingerprint": "e17cf06e48cef2ac", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/dashboard/modules/monthly_report.js"}, "region": {"startLine": 86}}}]}, {"ruleId": "scanner-9863aed60d0eb6a1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/js/widget/revenue_widget.js:232"}, "properties": {"repobilityId": "36ddda8650041b10", "scanner": "scanner-primary", "fingerprint": "9863aed60d0eb6a1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/js/widget/revenue_widget.js"}, "region": {"startLine": 232}}}]}, {"ruleId": "scanner-937e8455ecb191fe", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in static/libs/flexidatepicker.umd.min.js:16"}, "properties": {"repobilityId": "363da66b09a97bbe", "scanner": "scanner-primary", "fingerprint": "937e8455ecb191fe", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "static/libs/flexidatepicker.umd.min.js"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-5329fa9cd1e60089", "level": "note", "message": {"text": "Insecure pattern 'debug_true' in menu_tool/app.py:25"}, "properties": {"repobilityId": "e455a50eae106fb8", "scanner": "scanner-primary", "fingerprint": "5329fa9cd1e60089", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "debug_true"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "menu_tool/app.py"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-d5a12b24aa7693f1", "level": "note", "message": {"text": "Insecure pattern 'debug_true' in knowledge_graph/chat_server.py:321"}, "properties": {"repobilityId": "9d5b2ff7856aa22f", "scanner": "scanner-primary", "fingerprint": "d5a12b24aa7693f1", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "debug_true"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "knowledge_graph/chat_server.py"}, "region": {"startLine": 321}}}]}, {"ruleId": "scanner-44e7651bafdc7e16", "level": "error", "message": {"text": "Possible secret in chz_test/README.md"}, "properties": {"repobilityId": "7e5af530ec51eb41", "scanner": "scanner-primary", "fingerprint": "44e7651bafdc7e16", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "chz_test/README.md"}, "region": {"startLine": 281}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-82cf1a9ee2ea6184", "level": "note", "message": {"text": "Very large file: routes/dashboard.py (1622 lines)"}, "properties": {"repobilityId": "40b39d336bf77c69", "scanner": "scanner-primary", "fingerprint": "82cf1a9ee2ea6184", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c452c71cf4b25de8", "level": "note", "message": {"text": "Very large file: routes/employee.py (1081 lines)"}, "properties": {"repobilityId": "c1dde29e3a529488", "scanner": "scanner-primary", "fingerprint": "c452c71cf4b25de8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fc4d52a1ce5b4d71", "level": "note", "message": {"text": "Very large file: routes/analysis.py (1333 lines)"}, "properties": {"repobilityId": "9b3f6edfe92c1342", "scanner": "scanner-primary", "fingerprint": "fc4d52a1ce5b4d71", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f43e2702b58064cf", "level": "note", "message": {"text": "Very large file: routes/stocks.py (1378 lines)"}, "properties": {"repobilityId": "c5cecb19598b12de", "scanner": "scanner-primary", "fingerprint": "f43e2702b58064cf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-eb517211173ba3c0", "level": "note", "message": {"text": "Very large file: core/olap_reports.py (2149 lines)"}, "properties": {"repobilityId": "c750e8ae6663cbe6", "scanner": "scanner-primary", "fingerprint": "eb517211173ba3c0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-9a62f795d57aa246", "level": "note", "message": {"text": "343 TODO/FIXME markers"}, "properties": {"repobilityId": "4b38c118003e07d2", "scanner": "scanner-primary", "fingerprint": "9a62f795d57aa246", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["maintenance"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "5a31d81594272fa3", "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": "424c2299ec9cea41", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "6e313d0606d25805", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "a8cf4de59670e5fe", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "8c39e41c355610ee", "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": "840c4214d25ef3f5", "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": "dfdb1d12644668f9", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-521f80bf3a9ed8b7", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/docs/INDEX.md"}, "properties": {"repobilityId": "f875c6e80dc7733e", "scanner": "scanner-primary", "fingerprint": "521f80bf3a9ed8b7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/docs/INDEX.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5829406e77bec590", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/docs/stocks.md"}, "properties": {"repobilityId": "0267d93cf630b435", "scanner": "scanner-primary", "fingerprint": "5829406e77bec590", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/docs/stocks.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4586aa16b7c293ea", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/docs/CHANGELOG.md"}, "properties": {"repobilityId": "752d5baf14e2b354", "scanner": "scanner-primary", "fingerprint": "4586aa16b7c293ea", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/docs/CHANGELOG.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0ee9e54003532d10", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/web-design-reviewer/references/framework-fixes.md"}, "properties": {"repobilityId": "514afd03d4c9607b", "scanner": "scanner-primary", "fingerprint": "0ee9e54003532d10", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/web-design-reviewer/references/framework-fixes.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-68c07d16c192958d", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 sync_push.py:14"}, "properties": {"repobilityId": "89eeff9ac243802c", "scanner": "scanner-primary", "fingerprint": "68c07d16c192958d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b9a61068da4079f3", "level": "note", "message": {"text": "Legacy-named symbol `test_migration_v2_to_v3_preserves_data_and_makes_backup` in tests/test_schedule_v3.py:96"}, "properties": {"repobilityId": "38b5a0dc5395a555", "scanner": "scanner-primary", "fingerprint": "b9a61068da4079f3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-da31a71d3f36565c", "level": "none", "message": {"text": "Commented-code block (5 lines) in static/js/dashboard/modules/analytics.js:42"}, "properties": {"repobilityId": "56ff4f34f8c1f17c", "scanner": "scanner-primary", "fingerprint": "da31a71d3f36565c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b342ffef1a8b5c24", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 static/js/widget/revenue_widget.js:197"}, "properties": {"repobilityId": "cf1ff6871282eede", "scanner": "scanner-primary", "fingerprint": "b342ffef1a8b5c24", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d2ff44e2f4815281", "level": "note", "message": {"text": "Legacy-named symbol `l4l_draft_ytd_v2` in scripts/l4l_draft.py:207"}, "properties": {"repobilityId": "ef0512dada69bd11", "scanner": "scanner-primary", "fingerprint": "d2ff44e2f4815281", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e09469405f8b940c", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/check/check_dashboard_simple.py:34"}, "properties": {"repobilityId": "98d527408f20b518", "scanner": "scanner-primary", "fingerprint": "e09469405f8b940c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8476635b3a957b09", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/check/comprehensive_dashboard_check.py:50"}, "properties": {"repobilityId": "d2687e2e80e206e0", "scanner": "scanner-primary", "fingerprint": "8476635b3a957b09", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-349cd0d43488312a", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_all_bars.py:6"}, "properties": {"repobilityId": "b24ec5d5805c29f4", "scanner": "scanner-primary", "fingerprint": "349cd0d43488312a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0aa7378d87f61ac3", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_ligovskiy.py:6"}, "properties": {"repobilityId": "9695b47c239a5d42", "scanner": "scanner-primary", "fingerprint": "0aa7378d87f61ac3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-295cddb1743c5a66", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_varshavskaya.py:6"}, "properties": {"repobilityId": "b6c877ce187c7497", "scanner": "scanner-primary", "fingerprint": "295cddb1743c5a66", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-979b61a93125aec1", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_loyalty_kremenchugskaya.py:4"}, "properties": {"repobilityId": "aad0e67e2850b49e", "scanner": "scanner-primary", "fingerprint": "979b61a93125aec1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fd742744375baa27", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_loyalty_all_bars.py:15"}, "properties": {"repobilityId": "9db426367f2cf346", "scanner": "scanner-primary", "fingerprint": "fd742744375baa27", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4310d2ad5de52d91", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_bolshoy.py:6"}, "properties": {"repobilityId": "4c669ddc6b259d78", "scanner": "scanner-primary", "fingerprint": "4310d2ad5de52d91", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9da00a933cf5f964", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_sadovaya.py:6"}, "properties": {"repobilityId": "174689d8c20e8ca8", "scanner": "scanner-primary", "fingerprint": "9da00a933cf5f964", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d34200ec762f795a", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_loyalty_v2.py:4"}, "properties": {"repobilityId": "bd5db1580ceed0a0", "scanner": "scanner-primary", "fingerprint": "d34200ec762f795a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-27e25ed3172c0125", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/debug/debug_kremenchugskaya.py:6"}, "properties": {"repobilityId": "289139fdbb605856", "scanner": "scanner-primary", "fingerprint": "27e25ed3172c0125", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-db6842b4de21d1a6", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 utils/auto_add_new_dishes.py:187"}, "properties": {"repobilityId": "32c83e2ce670c142", "scanner": "scanner-primary", "fingerprint": "db6842b4de21d1a6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-668305fa3df98096", "level": "note", "message": {"text": "Legacy-named symbol `abc_df_copy` in routes/analysis.py:104"}, "properties": {"repobilityId": "5c766d4be9ccf280", "scanner": "scanner-primary", "fingerprint": "668305fa3df98096", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b85003ce02d70d42", "level": "none", "message": {"text": "Commented-code block (5 lines) in routes/stocks.py:47"}, "properties": {"repobilityId": "0cf97b7b45b8fbf6", "scanner": "scanner-primary", "fingerprint": "b85003ce02d70d42", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-374a729860d8c4cf", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 routes/stocks.py:843"}, "properties": {"repobilityId": "0042f3b61124fa83", "scanner": "scanner-primary", "fingerprint": "374a729860d8c4cf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-32344c2170afedb6", "level": "note", "message": {"text": "Legacy-named symbol `df_copy` in core/data_processor.py:69"}, "properties": {"repobilityId": "68af096e2d652b3c", "scanner": "scanner-primary", "fingerprint": "32344c2170afedb6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1ee324330de2ab8d", "level": "none", "message": {"text": "Commented-code block (5 lines) in core/shifts_manager.py:142"}, "properties": {"repobilityId": "fc743afca32e910e", "scanner": "scanner-primary", "fingerprint": "1ee324330de2ab8d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ba114abf4411e3a", "level": "note", "message": {"text": "Legacy-named symbol `event_copy` in core/taps_manager.py:405"}, "properties": {"repobilityId": "a680b017819ab55b", "scanner": "scanner-primary", "fingerprint": "6ba114abf4411e3a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9f9d6454dfb9e167", "level": "note", "message": {"text": "Legacy-named symbol `_restore_from_backup` in core/plans_manager.py:151"}, "properties": {"repobilityId": "187cdded9110782e", "scanner": "scanner-primary", "fingerprint": "9f9d6454dfb9e167", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-acad78d678f29aa0", "level": "none", "message": {"text": "Commented-code block (5 lines) in core/olap_reports.py:842"}, "properties": {"repobilityId": "64e02d82d84a600f", "scanner": "scanner-primary", "fingerprint": "acad78d678f29aa0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-477fad5e0f5c1fa6", "level": "none", "message": {"text": "Commented-code block (5 lines) in chz_test/export_bartender_list.py:22"}, "properties": {"repobilityId": "c36095e771e48b77", "scanner": "scanner-primary", "fingerprint": "477fad5e0f5c1fa6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-232754467bdc8f00", "level": "none", "message": {"text": "Commented-code block (7 lines) in chz_test/chz.py:69"}, "properties": {"repobilityId": "09530dd7c3f5e9ce", "scanner": "scanner-primary", "fingerprint": "232754467bdc8f00", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5fa5af25316da646", "level": "note", "message": {"text": "16 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "e0919a3f6a45e8c2", "scanner": "scanner-primary", "fingerprint": "5fa5af25316da646", "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": "377282509ec073a0", "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": "fb1c30df4ae3e3d6", "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": "dfa6bff66db67af4", "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": "a4d1026cd67081a9", "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": "53702b67d2244df6", "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": "4728a20ae03e5b93", "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": "4d28d8cfbe7d3bcb", "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": "9fd56ac15cd182ab", "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": "54bd5e32f748f7ef", "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": "64c4e4f57ee889be", "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": "f1e1e74589f31945", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "6fbc636bfe63c65b", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "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": "6a5f4c99ad87a9eb", "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": "e3531dbdb3cb3c1f", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "96eb7b1e12c5243c", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-33a6b62e30ce7ab4", "level": "note", "message": {"text": "Near-duplicate function bodies in 6 places"}, "properties": {"repobilityId": "79f6589895d7063a", "scanner": "scanner-primary", "fingerprint": "33a6b62e30ce7ab4", "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": "6185452ad99c8c56", "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": "767d857655e66442", "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": "13070f9b948fdc52", "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": "904f329ee27bf47f", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-27ac92ff793e1d8f", "level": "error", "message": {"text": "Dangling fetch: GET /api/analyze-period/${venueKey}/${periodKey} (static/js/dashboard/modules/comments.js:197)"}, "properties": {"repobilityId": "c2131708bb3c454b", "scanner": "scanner-primary", "fingerprint": "27ac92ff793e1d8f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-805a39c42847396e", "level": "note", "message": {"text": "Unused endpoint: ANY /static/manifest.json"}, "properties": {"repobilityId": "a2c7781b33c44e55", "scanner": "scanner-primary", "fingerprint": "805a39c42847396e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1a6d91f2236825bf", "level": "note", "message": {"text": "Unused endpoint: ANY /"}, "properties": {"repobilityId": "2472148e486f2238", "scanner": "scanner-primary", "fingerprint": "1a6d91f2236825bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3d47f5777840c8d6", "level": "note", "message": {"text": "Unused endpoint: ANY /library"}, "properties": {"repobilityId": "0ebd0e8c4cc2a3ed", "scanner": "scanner-primary", "fingerprint": "3d47f5777840c8d6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e4e94277346928b8", "level": "note", "message": {"text": "Unused endpoint: ANY /card"}, "properties": {"repobilityId": "77549f869a145fae", "scanner": "scanner-primary", "fingerprint": "e4e94277346928b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9c583e3a531a8b48", "level": "note", "message": {"text": "Unused endpoint: ANY /api/items"}, "properties": {"repobilityId": "1a0694d3805b6032", "scanner": "scanner-primary", "fingerprint": "9c583e3a531a8b48", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-51f9659e33b8543a", "level": "note", "message": {"text": "Unused endpoint: ANY /api/items/<int:item_id>"}, "properties": {"repobilityId": "024f946a0f5f13f3", "scanner": "scanner-primary", "fingerprint": "51f9659e33b8543a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cca8483232bea4f0", "level": "note", "message": {"text": "Unused endpoint: ANY /api/settings"}, "properties": {"repobilityId": "08b6427fdba39495", "scanner": "scanner-primary", "fingerprint": "cca8483232bea4f0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8e6099cb301c956d", "level": "note", "message": {"text": "Unused endpoint: ANY /api/render"}, "properties": {"repobilityId": "07d325901b08dce2", "scanner": "scanner-primary", "fingerprint": "8e6099cb301c956d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2a03226f61e15b54", "level": "note", "message": {"text": "Unused endpoint: ANY /api/render-pdf"}, "properties": {"repobilityId": "7915d568c6e6790d", "scanner": "scanner-primary", "fingerprint": "2a03226f61e15b54", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-818872fe3e47da20", "level": "note", "message": {"text": "Unused endpoint: ANY /api/admin/open-check/run-now"}, "properties": {"repobilityId": "b6a92b2ef87fdd44", "scanner": "scanner-primary", "fingerprint": "818872fe3e47da20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-592efdc77602a51e", "level": "note", "message": {"text": "Unused endpoint: ANY /telegram/openbot/setup-webhook"}, "properties": {"repobilityId": "c8a22393703195b4", "scanner": "scanner-primary", "fingerprint": "592efdc77602a51e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ea7445ba87dc2ea5", "level": "note", "message": {"text": "Unused endpoint: ANY /telegram/openbot/webhook-info"}, "properties": {"repobilityId": "5f0e1254c7f9e99f", "scanner": "scanner-primary", "fingerprint": "ea7445ba87dc2ea5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3d0ed796370f8843", "level": "note", "message": {"text": "Unused endpoint: ANY /telegram/openbot/delete-webhook"}, "properties": {"repobilityId": "a7f26affeccb6e52", "scanner": "scanner-primary", "fingerprint": "3d0ed796370f8843", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4f483a40afa350da", "level": "note", "message": {"text": "Unused endpoint: ANY /api/test"}, "properties": {"repobilityId": "a9293a4b7ffc4a03", "scanner": "scanner-primary", "fingerprint": "4f483a40afa350da", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-71209d15a2fd59ed", "level": "note", "message": {"text": "Unused endpoint: ANY /wiki"}, "properties": {"repobilityId": "cfc84481bad8dc33", "scanner": "scanner-primary", "fingerprint": "71209d15a2fd59ed", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-17e4d4466069f83e", "level": "note", "message": {"text": "Unused endpoint: ANY /test_modules"}, "properties": {"repobilityId": "330e081bcc206b46", "scanner": "scanner-primary", "fingerprint": "17e4d4466069f83e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cca4258212d33cc2", "level": "note", "message": {"text": "Unused endpoint: ANY /api/debug/taps-data"}, "properties": {"repobilityId": "55732c718770db33", "scanner": "scanner-primary", "fingerprint": "cca4258212d33cc2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-22bd189963543b20", "level": "note", "message": {"text": "Unused endpoint: ANY /telegram/webhook"}, "properties": {"repobilityId": "c2bad70c9e69d1ed", "scanner": "scanner-primary", "fingerprint": "22bd189963543b20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cc8da8ea87fe3475", "level": "note", "message": {"text": "Unused endpoint: ANY /telegram/setup-webhook"}, "properties": {"repobilityId": "3fd081017f179a73", "scanner": "scanner-primary", "fingerprint": "cc8da8ea87fe3475", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-49d9c60addc22ba1", "level": "note", "message": {"text": "Unused endpoint: ANY /telegram/webhook-info"}, "properties": {"repobilityId": "8785eec86d1f6fee", "scanner": "scanner-primary", "fingerprint": "49d9c60addc22ba1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6eca02f8fcbfa2fc", "level": "note", "message": {"text": "Unused endpoint: ANY /telegram/delete-webhook"}, "properties": {"repobilityId": "3d2acb3d2d36549f", "scanner": "scanner-primary", "fingerprint": "6eca02f8fcbfa2fc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-037e102783020f47", "level": "note", "message": {"text": "Unused endpoint: ANY /expiration"}, "properties": {"repobilityId": "7892427c3e2e7c1e", "scanner": "scanner-primary", "fingerprint": "037e102783020f47", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-288ccb9bb91dc99d", "level": "note", "message": {"text": "Unused endpoint: ANY /api/expiration/board"}, "properties": {"repobilityId": "dd153d20d6b3a219", "scanner": "scanner-primary", "fingerprint": "288ccb9bb91dc99d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-42b65aa339ad32e1", "level": "note", "message": {"text": "Unused endpoint: ANY /explorer"}, "properties": {"repobilityId": "9ad4ea00016c31ef", "scanner": "scanner-primary", "fingerprint": "42b65aa339ad32e1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8a3d199d0620665d", "level": "note", "message": {"text": "Unused endpoint: ANY /api/explorer/pivot"}, "properties": {"repobilityId": "be3db66151ff5831", "scanner": "scanner-primary", "fingerprint": "8a3d199d0620665d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-98d2c912f9f7d047", "level": "note", "message": {"text": "Unused endpoint: ANY /api/dashboard-analytics"}, "properties": {"repobilityId": "473da84ea6503c93", "scanner": "scanner-primary", "fingerprint": "98d2c912f9f7d047", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3c82e3e438086c1e", "level": "note", "message": {"text": "Unused endpoint: ANY /api/monthly-report"}, "properties": {"repobilityId": "a9db6b4b7a1f2283", "scanner": "scanner-primary", "fingerprint": "3c82e3e438086c1e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-893d9a2e15e000eb", "level": "note", "message": {"text": "Unused endpoint: ANY /api/monthly-report/loyalty"}, "properties": {"repobilityId": "e698341f6856550e", "scanner": "scanner-primary", "fingerprint": "893d9a2e15e000eb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a9952cbe448c86be", "level": "note", "message": {"text": "Unused endpoint: ANY /api/monthly-report/draft-liters"}, "properties": {"repobilityId": "bed212b49613aa53", "scanner": "scanner-primary", "fingerprint": "a9952cbe448c86be", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6db87374118aa9da", "level": "note", "message": {"text": "Unused endpoint: ANY /api/monthly-report/top-guests"}, "properties": {"repobilityId": "57b99c93b49f18cd", "scanner": "scanner-primary", "fingerprint": "6db87374118aa9da", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d826b1f905098b16", "level": "note", "message": {"text": "Unused endpoint: ANY /api/venues"}, "properties": {"repobilityId": "f131fbd489877fe7", "scanner": "scanner-primary", "fingerprint": "d826b1f905098b16", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c6fcd8209dede70a", "level": "note", "message": {"text": "Unused endpoint: ANY /api/weeks"}, "properties": {"repobilityId": "e7f5242c314f7820", "scanner": "scanner-primary", "fingerprint": "c6fcd8209dede70a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0729e88b25091894", "level": "note", "message": {"text": "Unused endpoint: ANY /api/plans/<venue_key>/<period_key>"}, "properties": {"repobilityId": "d45413286220b1ca", "scanner": "scanner-primary", "fingerprint": "0729e88b25091894", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-06c512aeeabc9b57", "level": "note", "message": {"text": "Unused endpoint: ANY /api/plans/calculate/<venue_key>/<start_date>/<end_date>"}, "properties": {"repobilityId": "b7888dadd4b9f17b", "scanner": "scanner-primary", "fingerprint": "06c512aeeabc9b57", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-99f95b7e982024a7", "level": "note", "message": {"text": "Unused endpoint: ANY /api/plans"}, "properties": {"repobilityId": "8e2226a942c9735c", "scanner": "scanner-primary", "fingerprint": "99f95b7e982024a7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b07572dd89587b86", "level": "note", "message": {"text": "Unused endpoint: ANY /api/plans/daily/<venue_key>/<int:year>/<int:month>"}, "properties": {"repobilityId": "9f3a48e2864ce3b9", "scanner": "scanner-primary", "fingerprint": "b07572dd89587b86", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e7010531bcaf7b8b", "level": "note", "message": {"text": "Unused endpoint: ANY /api/plans/daily/<venue_key>/<int:year>/<int:month>/<date_str>"}, "properties": {"repobilityId": "ab0de66898305ae8", "scanner": "scanner-primary", "fingerprint": "e7010531bcaf7b8b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0a71ff83b9f4747b", "level": "note", "message": {"text": "Unused endpoint: ANY /api/storage/diagnose"}, "properties": {"repobilityId": "1d9e0bed6670535b", "scanner": "scanner-primary", "fingerprint": "0a71ff83b9f4747b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-454195c28e5dcca1", "level": "note", "message": {"text": "Unused endpoint: ANY /api/comments/<venue_key>/<period_key>"}, "properties": {"repobilityId": "437fd5d9c04d577c", "scanner": "scanner-primary", "fingerprint": "454195c28e5dcca1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-89695836df8157d8", "level": "note", "message": {"text": "Unused endpoint: ANY /api/comparison/periods"}, "properties": {"repobilityId": "3510890a9cc9a92b", "scanner": "scanner-primary", "fingerprint": "89695836df8157d8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e1275f6628778a62", "level": "note", "message": {"text": "Unused endpoint: ANY /api/export/text"}, "properties": {"repobilityId": "f92c2ac04f617d17", "scanner": "scanner-primary", "fingerprint": "e1275f6628778a62", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b35015321118bf25", "level": "note", "message": {"text": "Unused endpoint: ANY /api/schedule/employees"}, "properties": {"repobilityId": "b947f0c5ca465bc9", "scanner": "scanner-primary", "fingerprint": "b35015321118bf25", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ae00af97dd67e70a", "level": "note", "message": {"text": "Unused endpoint: ANY /api/schedule/employees/sync"}, "properties": {"repobilityId": "844a834b3d45d2b8", "scanner": "scanner-primary", "fingerprint": "ae00af97dd67e70a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-600979426a0e328d", "level": "note", "message": {"text": "Unused endpoint: ANY /api/schedule/employee/<name>"}, "properties": {"repobilityId": "530adfafed6c7f51", "scanner": "scanner-primary", "fingerprint": "600979426a0e328d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-17bf1379d7fe838b", "level": "note", "message": {"text": "Unused endpoint: ANY /api/schedule/roles"}, "properties": {"repobilityId": "017655b587c4c8a6", "scanner": "scanner-primary", "fingerprint": "17bf1379d7fe838b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4ee301f12a4c703b", "level": "note", "message": {"text": "Unused endpoint: ANY /api/schedule/locations"}, "properties": {"repobilityId": "c85e0760add8f9a0", "scanner": "scanner-primary", "fingerprint": "4ee301f12a4c703b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-550d5181c330258e", "level": "note", "message": {"text": "Unused endpoint: ANY /api/schedule/<int:year>/<int:month>"}, "properties": {"repobilityId": "46d93756797ef3c7", "scanner": "scanner-primary", "fingerprint": "550d5181c330258e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aa354e8bbd257da4", "level": "note", "message": {"text": "Unused endpoint: ANY /api/schedule/shift"}, "properties": {"repobilityId": "f63ffb124a98883b", "scanner": "scanner-primary", "fingerprint": "aa354e8bbd257da4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c949987f525e6acc", "level": "note", "message": {"text": "Unused endpoint: ANY /api/schedule/shift/<int:shift_id>"}, "properties": {"repobilityId": "e15c979993194cdf", "scanner": "scanner-primary", "fingerprint": "c949987f525e6acc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7af7e432906cf572", "level": "note", "message": {"text": "Unused endpoint: ANY /api/schedule/shift/<int:shift_id>/fact"}, "properties": {"repobilityId": "727eb643e3439a94", "scanner": "scanner-primary", "fingerprint": "7af7e432906cf572", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}