{"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-a299ead5a9083317", "name": "Possibly dead Python function: fit_transform", "shortDescription": {"text": "Possibly dead Python function: fit_transform"}, "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-c97330271d14a7dc", "name": "Possibly dead Python function: forward", "shortDescription": {"text": "Possibly dead Python function: forward"}, "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-fb233b32c1a9acb5", "name": "Possibly dead Python function: direction_score", "shortDescription": {"text": "Possibly dead Python function: direction_score"}, "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-162e0672ef3f0d09", "name": "Possibly dead Python function: forward", "shortDescription": {"text": "Possibly dead Python function: forward"}, "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-ac6c3e76429dbac6", "name": "Possibly dead Python function: forward", "shortDescription": {"text": "Possibly dead Python function: forward"}, "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-d3d4f2fdc7d1ad70", "name": "Possibly dead Python function: intraday_paper_job", "shortDescription": {"text": "Possibly dead Python function: intraday_paper_job"}, "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-a304bfe361a4e783", "name": "Possibly dead Python function: refresh_universe_job", "shortDescription": {"text": "Possibly dead Python function: refresh_universe_job"}, "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-f452772cdcf483fd", "name": "Possibly dead Python function: longshort_signals_job", "shortDescription": {"text": "Possibly dead Python function: longshort_signals_job"}, "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-bdc861db0a2670fd", "name": "Possibly dead Python function: retrain_asset_models_job", "shortDescription": {"text": "Possibly dead Python function: retrain_asset_models_job"}, "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-a1165243155ad929", "name": "Possibly dead Python function: cross_check_data_job", "shortDescription": {"text": "Possibly dead Python function: cross_check_data_job"}, "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-1e21efc55504da04", "name": "Possibly dead Python function: backup_job", "shortDescription": {"text": "Possibly dead Python function: backup_job"}, "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-8542cf216771dfb7", "name": "Possibly dead Python function: refresh_signals_job", "shortDescription": {"text": "Possibly dead Python function: refresh_signals_job"}, "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-c1ed3e314ff2a88f", "name": "Possibly dead Python function: nightly_hpo_job", "shortDescription": {"text": "Possibly dead Python function: nightly_hpo_job"}, "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-d43f271f68dd4073", "name": "Possibly dead Python function: weekend_hpo_job", "shortDescription": {"text": "Possibly dead Python function: weekend_hpo_job"}, "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-47125fcf1b1073d7", "name": "Possibly dead Python function: summarize_importances", "shortDescription": {"text": "Possibly dead Python function: summarize_importances"}, "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-c6be6a6803cf2556", "name": "Possibly dead Python function: fold_cb", "shortDescription": {"text": "Possibly dead Python function: fold_cb"}, "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-8eeee20b437e8077", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/components/DriftPanel.tsx:35", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/components/DriftPanel.tsx:35"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e9926747724f755c", "name": "Privileged port 30 in use", "shortDescription": {"text": "Privileged port 30 in use"}, "fullDescription": {"text": "Port 30 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-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-de3c277c91b3c5c3", "name": "Very large file: frontend/app/changelog/page.tsx (923 lines)", "shortDescription": {"text": "Very large file: frontend/app/changelog/page.tsx (923 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-f1cc69faf65d6707", "name": "Very large file: src/berich/signals/paper.py (1385 lines)", "shortDescription": {"text": "Very large file: src/berich/signals/paper.py (1385 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-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 246 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-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-48ac813838428887", "name": "Commented-code block (5 lines) in frontend/app/brief/page.tsx:47", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/app/brief/page.tsx: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-feb4fef0a3fb3579", "name": "Commented-code block (6 lines) in frontend/app/components/TickerChart.tsx:83", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/app/components/TickerChart.tsx:83"}, "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-13bd6319e6b430aa", "name": "Commented-code block (5 lines) in frontend/app/components/TrainingInfo.tsx:14", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/app/components/TrainingInfo.tsx:14"}, "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-655df4d536dfd3e1", "name": "Commented-code block (5 lines) in frontend/app/components/SignalAdvice.tsx:6", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/app/components/SignalAdvice.tsx:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6f77f79035265b84", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/app/lib/api.ts:504", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/app/lib/api.ts:504"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-75c5346c3f031354", "name": "Commented-code block (5 lines) in frontend/app/lib/format.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/app/lib/format.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c0e8030713d26106", "name": "Legacy-named symbol `model_copy` in tests/test_backtest.py:140", "shortDescription": {"text": "Legacy-named symbol `model_copy` in tests/test_backtest.py:140"}, "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-829006d315858fc9", "name": "Legacy-named symbol `create_backup` in tests/test_backup.py:7", "shortDescription": {"text": "Legacy-named symbol `create_backup` in tests/test_backup.py:7"}, "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-0458ad8dc377d19d", "name": "Commented-code block (6 lines) in scripts/run_full_sweep.py:166", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/run_full_sweep.py:166"}, "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-f65505ca8f2630b7", "name": "Legacy-named symbol `create_backup` in src/berich/backup.py:53", "shortDescription": {"text": "Legacy-named symbol `create_backup` in src/berich/backup.py:53"}, "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-a3eb3e38da471c16", "name": "Commented-code block (5 lines) in src/berich/config.py:65", "shortDescription": {"text": "Commented-code block (5 lines) in src/berich/config.py:65"}, "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-d324e5d7a0c6d62f", "name": "Legacy-named symbol `model_copy` in src/berich/cli.py:78", "shortDescription": {"text": "Legacy-named symbol `model_copy` in src/berich/cli.py:78"}, "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-aecb74d646c979d6", "name": "Commented-code block (5 lines) in src/berich/models/registry.py:44", "shortDescription": {"text": "Commented-code block (5 lines) in src/berich/models/registry.py:44"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5f08c0527ef519e4", "name": "Legacy-named symbol `_signals_old` in src/berich/signals/store.py:154", "shortDescription": {"text": "Legacy-named symbol `_signals_old` in src/berich/signals/store.py:154"}, "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-d893156f4f4ed43e", "name": "Commented-code block (6 lines) in src/berich/signals/store.py:37", "shortDescription": {"text": "Commented-code block (6 lines) in src/berich/signals/store.py:37"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-948c52166a075be0", "name": "Legacy-named symbol `model_copy` in src/berich/signals/paper_intraday.py:283", "shortDescription": {"text": "Legacy-named symbol `model_copy` in src/berich/signals/paper_intraday.py:283"}, "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-9951db8f13e9de15", "name": "Legacy-named symbol `_paper_trades_old` in src/berich/signals/paper.py:191", "shortDescription": {"text": "Legacy-named symbol `_paper_trades_old` in src/berich/signals/paper.py:191"}, "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-d9cb02d01c564096", "name": "Commented-code block (5 lines) in src/berich/signals/paper.py:125", "shortDescription": {"text": "Commented-code block (5 lines) in src/berich/signals/paper.py:125"}, "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-c7be03968a9743c2", "name": "Legacy-named symbol `model_copy` in src/berich/signals/service.py:477", "shortDescription": {"text": "Legacy-named symbol `model_copy` in src/berich/signals/service.py:477"}, "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-b9ee10124f5448ae", "name": "Legacy-named symbol `create_backup` in src/berich/scheduler/jobs.py:443", "shortDescription": {"text": "Legacy-named symbol `create_backup` in src/berich/scheduler/jobs.py:443"}, "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-e9bbef2f9163f5f5", "name": "Commented-code block (5 lines) in src/berich/scheduler/runner.py:73", "shortDescription": {"text": "Commented-code block (5 lines) in src/berich/scheduler/runner.py:73"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c15232d5510b027b", "name": "Commented-code block (5 lines) in src/berich/features/build.py:63", "shortDescription": {"text": "Commented-code block (5 lines) in src/berich/features/build.py:63"}, "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-0e5ec59e7ea0633f", "name": "Legacy-named symbol `model_copy` in src/berich/training/tournament.py:184", "shortDescription": {"text": "Legacy-named symbol `model_copy` in src/berich/training/tournament.py:184"}, "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-860c1f228d212812", "name": "Commented-code block (6 lines) in src/berich/training/tournament.py:485", "shortDescription": {"text": "Commented-code block (6 lines) in src/berich/training/tournament.py:485"}, "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-f9e6bf000abe99ed", "name": "Legacy-named symbol `model_copy` in src/berich/training/hpo.py:197", "shortDescription": {"text": "Legacy-named symbol `model_copy` in src/berich/training/hpo.py:197"}, "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-0027e313ade46c8f", "name": "Near-duplicate function bodies in 7 places", "shortDescription": {"text": "Near-duplicate function bodies in 7 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nsrc/berich/models/ensemble.py:fit, src/berich/models/ensemble.py:fit, src/berich/models/lightgbm_model.py:fit, src/berich/models/sequence_base.py:fit\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:\nsrc/berich/models/ensemble.py:predict_proba, src/berich/models/ensemble.py:predict_proba, src/berich/models/sequence_base.py:predict_proba, src/berich/models/base.py:predict_proba\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-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:\nsrc/berich/models/tft.py:forward, src/berich/models/tft.py:forward\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:\nsrc/berich/signals/paper_intraday.py:get_open_intraday_positions, src/berich/signals/paper_intraday.py:get_intraday_equity_curve, src/berich/signals/paper_intraday.py:get_intraday_paper_metrics, src/berich/signals/paper.py:get_open_positions\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:\nsrc/berich/training/hpo.py:objective_for, src/berich/training/hpo.py:objective, src/berich/training/hpo.py:objective\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-7c773107502d609d", "name": "FastAPI POST `set_risk_profile` without auth dependency \u2014 src/berich/api/app.py:134", "shortDescription": {"text": "FastAPI POST `set_risk_profile` without auth dependency \u2014 src/berich/api/app.py:134"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-074f19cbee95ffdf", "name": "Unused endpoint: GET /watchlist", "shortDescription": {"text": "Unused endpoint: GET /watchlist"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /watchlist` 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-6c45b14190c8385b", "name": "Unused endpoint: GET /signals", "shortDescription": {"text": "Unused endpoint: GET /signals"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /signals` 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-b19e1c17c07c7741", "name": "Unused endpoint: GET /signals/{ticker}/history", "shortDescription": {"text": "Unused endpoint: GET /signals/{ticker}/history"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /signals/{ticker}/history` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2090a6105648a994", "name": "Unused endpoint: GET /signals/{ticker}/explain", "shortDescription": {"text": "Unused endpoint: GET /signals/{ticker}/explain"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /signals/{ticker}/explain` 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-0448307b3401dd69", "name": "Unused endpoint: GET /training", "shortDescription": {"text": "Unused endpoint: GET /training"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /training` 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-5fbd9922c85f58d4", "name": "Unused endpoint: GET /training/{ticker}", "shortDescription": {"text": "Unused endpoint: GET /training/{ticker}"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /training/{ticker}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5c1f829c35b35bb6", "name": "Unused endpoint: GET /risk-profile", "shortDescription": {"text": "Unused endpoint: GET /risk-profile"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /risk-profile` 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-1c1988f598ce5491", "name": "Unused endpoint: POST /risk-profile", "shortDescription": {"text": "Unused endpoint: POST /risk-profile"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `POST /risk-profile` 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-f93a09ffa9e263d8", "name": "Unused endpoint: GET /replication", "shortDescription": {"text": "Unused endpoint: GET /replication"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /replication` 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-de1b887c975727a8", "name": "Unused endpoint: GET /brief-plan", "shortDescription": {"text": "Unused endpoint: GET /brief-plan"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /brief-plan` 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-c65b2096245fc520", "name": "Unused endpoint: GET /video-script", "shortDescription": {"text": "Unused endpoint: GET /video-script"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /video-script` 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-584fdee3ada60f4b", "name": "Unused endpoint: GET /hpo-progress", "shortDescription": {"text": "Unused endpoint: GET /hpo-progress"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /hpo-progress` 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-19fd15f35c690f73", "name": "Unused endpoint: GET /ops", "shortDescription": {"text": "Unused endpoint: GET /ops"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /ops` 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-a6f48e60c30777ab", "name": "Unused endpoint: GET /config", "shortDescription": {"text": "Unused endpoint: GET /config"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /config` 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-4f5a0ecfdb46733b", "name": "Unused endpoint: GET /universes", "shortDescription": {"text": "Unused endpoint: GET /universes"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /universes` 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-f36c51e04836be54", "name": "Unused endpoint: GET /longshort/basket", "shortDescription": {"text": "Unused endpoint: GET /longshort/basket"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /longshort/basket` 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-2942190a3bb9bb15", "name": "Unused endpoint: GET /longshort/equity", "shortDescription": {"text": "Unused endpoint: GET /longshort/equity"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /longshort/equity` 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-352f6b45e012f449", "name": "Unused endpoint: GET /prices/{ticker}", "shortDescription": {"text": "Unused endpoint: GET /prices/{ticker}"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /prices/{ticker}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1083c154b57e9457", "name": "Unused endpoint: GET /drift", "shortDescription": {"text": "Unused endpoint: GET /drift"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /drift` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6ac4cd38d033e815", "name": "Unused endpoint: GET /backtest", "shortDescription": {"text": "Unused endpoint: GET /backtest"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /backtest` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5a29e13fc628cc3a", "name": "Unused endpoint: GET /paper/positions", "shortDescription": {"text": "Unused endpoint: GET /paper/positions"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /paper/positions` 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-d70d45e8588bcd91", "name": "Unused endpoint: GET /paper/concentration", "shortDescription": {"text": "Unused endpoint: GET /paper/concentration"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /paper/concentration` 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-fcae788fb70363c5", "name": "Unused endpoint: GET /paper/equity", "shortDescription": {"text": "Unused endpoint: GET /paper/equity"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /paper/equity` 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-9b564b06786ad92a", "name": "Unused endpoint: GET /paper/closed-trades", "shortDescription": {"text": "Unused endpoint: GET /paper/closed-trades"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /paper/closed-trades` 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-bd74dc43ee2ec6f7", "name": "Unused endpoint: GET /paper/calibration", "shortDescription": {"text": "Unused endpoint: GET /paper/calibration"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /paper/calibration` 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-0339f7b821d559a5", "name": "Unused endpoint: GET /paper/export.csv", "shortDescription": {"text": "Unused endpoint: GET /paper/export.csv"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /paper/export.csv` 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-ba31181b35ec36d6", "name": "Unused endpoint: GET /intraday/signals", "shortDescription": {"text": "Unused endpoint: GET /intraday/signals"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /intraday/signals` 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-544fb124697ae933", "name": "Unused endpoint: GET /intraday/brief-plan", "shortDescription": {"text": "Unused endpoint: GET /intraday/brief-plan"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /intraday/brief-plan` 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-20ddf572ec6a875b", "name": "Unused endpoint: GET /intraday/replication", "shortDescription": {"text": "Unused endpoint: GET /intraday/replication"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /intraday/replication` 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-c525bc7cf3139e91", "name": "Unused endpoint: GET /intraday/paper/positions", "shortDescription": {"text": "Unused endpoint: GET /intraday/paper/positions"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /intraday/paper/positions` 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-ad0461ba036cb594", "name": "Unused endpoint: GET /intraday/paper/equity", "shortDescription": {"text": "Unused endpoint: GET /intraday/paper/equity"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /intraday/paper/equity` 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-03396c89783908c3", "name": "Unused endpoint: GET /intraday/paper/closed-trades", "shortDescription": {"text": "Unused endpoint: GET /intraday/paper/closed-trades"}, "fullDescription": {"text": "`src/berich/api/app.py` declares `GET /intraday/paper/closed-trades` 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/20555"}, "properties": {"repository": "surpriz/BeRich", "repoUrl": "https://github.com/surpriz/BeRich", "branch": "main"}, "results": [{"ruleId": "scanner-a299ead5a9083317", "level": "note", "message": {"text": "Possibly dead Python function: fit_transform"}, "properties": {"repobilityId": "9ef31488d3148e9c", "scanner": "scanner-primary", "fingerprint": "a299ead5a9083317", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/berich/datasets/scaling.py:34"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c97330271d14a7dc", "level": "note", "message": {"text": "Possibly dead Python function: forward"}, "properties": {"repobilityId": "ea414cce7f8e5874", "scanner": "scanner-primary", "fingerprint": "c97330271d14a7dc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/berich/models/tft.py:78"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fb233b32c1a9acb5", "level": "note", "message": {"text": "Possibly dead Python function: direction_score"}, "properties": {"repobilityId": "8f82fdadb7ae5b6c", "scanner": "scanner-primary", "fingerprint": "fb233b32c1a9acb5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/berich/models/chronos_scorer.py:75"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-162e0672ef3f0d09", "level": "note", "message": {"text": "Possibly dead Python function: forward"}, "properties": {"repobilityId": "ea414cce7f8e5874", "scanner": "scanner-primary", "fingerprint": "162e0672ef3f0d09", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/berich/models/patchtst.py:77"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ac6c3e76429dbac6", "level": "note", "message": {"text": "Possibly dead Python function: forward"}, "properties": {"repobilityId": "ea414cce7f8e5874", "scanner": "scanner-primary", "fingerprint": "ac6c3e76429dbac6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/berich/models/lstm.py:49"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d3d4f2fdc7d1ad70", "level": "note", "message": {"text": "Possibly dead Python function: intraday_paper_job"}, "properties": {"repobilityId": "8db7aa3ca1f5f2d3", "scanner": "scanner-primary", "fingerprint": "d3d4f2fdc7d1ad70", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/berich/scheduler/jobs.py:144"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a304bfe361a4e783", "level": "note", "message": {"text": "Possibly dead Python function: refresh_universe_job"}, "properties": {"repobilityId": "90e0d58aee974691", "scanner": "scanner-primary", "fingerprint": "a304bfe361a4e783", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/berich/scheduler/jobs.py:242"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f452772cdcf483fd", "level": "note", "message": {"text": "Possibly dead Python function: longshort_signals_job"}, "properties": {"repobilityId": "369ad5aade5372fe", "scanner": "scanner-primary", "fingerprint": "f452772cdcf483fd", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/berich/scheduler/jobs.py:261"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bdc861db0a2670fd", "level": "note", "message": {"text": "Possibly dead Python function: retrain_asset_models_job"}, "properties": {"repobilityId": "d44750d359c18542", "scanner": "scanner-primary", "fingerprint": "bdc861db0a2670fd", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/berich/scheduler/jobs.py:373"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a1165243155ad929", "level": "note", "message": {"text": "Possibly dead Python function: cross_check_data_job"}, "properties": {"repobilityId": "de86f3d21716858d", "scanner": "scanner-primary", "fingerprint": "a1165243155ad929", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/berich/scheduler/jobs.py:391"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1e21efc55504da04", "level": "note", "message": {"text": "Possibly dead Python function: backup_job"}, "properties": {"repobilityId": "70797f083fcb8169", "scanner": "scanner-primary", "fingerprint": "1e21efc55504da04", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/berich/scheduler/jobs.py:435"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8542cf216771dfb7", "level": "note", "message": {"text": "Possibly dead Python function: refresh_signals_job"}, "properties": {"repobilityId": "88d6ecc164d47454", "scanner": "scanner-primary", "fingerprint": "8542cf216771dfb7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/berich/scheduler/jobs.py:699"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c1ed3e314ff2a88f", "level": "note", "message": {"text": "Possibly dead Python function: nightly_hpo_job"}, "properties": {"repobilityId": "b0c8dd2be8147bac", "scanner": "scanner-primary", "fingerprint": "c1ed3e314ff2a88f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/berich/scheduler/jobs.py:817"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d43f271f68dd4073", "level": "note", "message": {"text": "Possibly dead Python function: weekend_hpo_job"}, "properties": {"repobilityId": "a5deb4df545cb1c1", "scanner": "scanner-primary", "fingerprint": "d43f271f68dd4073", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/berich/scheduler/jobs.py:826"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-47125fcf1b1073d7", "level": "note", "message": {"text": "Possibly dead Python function: summarize_importances"}, "properties": {"repobilityId": "86e91776147e019f", "scanner": "scanner-primary", "fingerprint": "47125fcf1b1073d7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/berich/training/walk_forward.py:107"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c6be6a6803cf2556", "level": "note", "message": {"text": "Possibly dead Python function: fold_cb"}, "properties": {"repobilityId": "702c2bf5b424a60a", "scanner": "scanner-primary", "fingerprint": "c6be6a6803cf2556", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/berich/training/hpo.py:214"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8eeee20b437e8077", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/components/DriftPanel.tsx:35"}, "properties": {"repobilityId": "6f83234d35d43452", "scanner": "scanner-primary", "fingerprint": "8eeee20b437e8077", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e9926747724f755c", "level": "warning", "message": {"text": "Privileged port 30 in use"}, "properties": {"repobilityId": "54f172e7d16fc662", "scanner": "scanner-primary", "fingerprint": "e9926747724f755c", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/verify_sync.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-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-de3c277c91b3c5c3", "level": "note", "message": {"text": "Very large file: frontend/app/changelog/page.tsx (923 lines)"}, "properties": {"repobilityId": "8c1dde891178be06", "scanner": "scanner-primary", "fingerprint": "de3c277c91b3c5c3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f1cc69faf65d6707", "level": "note", "message": {"text": "Very large file: src/berich/signals/paper.py (1385 lines)"}, "properties": {"repobilityId": "176e574251cfecff", "scanner": "scanner-primary", "fingerprint": "f1cc69faf65d6707", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "88ff85e028ddd320", "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": "21a9b8ffcc42a271", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "5d8053167806b4bf", "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": "f31c9bc401270f9a", "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": "e2e7a0bf37839cea", "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": "dfb428199024a0c8", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-48ac813838428887", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/app/brief/page.tsx:47"}, "properties": {"repobilityId": "eaa3fa9f15c2d1b1", "scanner": "scanner-primary", "fingerprint": "48ac813838428887", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-feb4fef0a3fb3579", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/app/components/TickerChart.tsx:83"}, "properties": {"repobilityId": "996ddc9bb1c9925f", "scanner": "scanner-primary", "fingerprint": "feb4fef0a3fb3579", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-13bd6319e6b430aa", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/app/components/TrainingInfo.tsx:14"}, "properties": {"repobilityId": "ef76665954ab2f90", "scanner": "scanner-primary", "fingerprint": "13bd6319e6b430aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-655df4d536dfd3e1", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/app/components/SignalAdvice.tsx:6"}, "properties": {"repobilityId": "fc70c054fe872d82", "scanner": "scanner-primary", "fingerprint": "655df4d536dfd3e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6f77f79035265b84", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/app/lib/api.ts:504"}, "properties": {"repobilityId": "bc460a1ee1e4bec4", "scanner": "scanner-primary", "fingerprint": "6f77f79035265b84", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-75c5346c3f031354", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/app/lib/format.ts:1"}, "properties": {"repobilityId": "0eac0263a2026cac", "scanner": "scanner-primary", "fingerprint": "75c5346c3f031354", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c0e8030713d26106", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in tests/test_backtest.py:140"}, "properties": {"repobilityId": "39359552a55b25ec", "scanner": "scanner-primary", "fingerprint": "c0e8030713d26106", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-829006d315858fc9", "level": "note", "message": {"text": "Legacy-named symbol `create_backup` in tests/test_backup.py:7"}, "properties": {"repobilityId": "c1f5c7d00a81330c", "scanner": "scanner-primary", "fingerprint": "829006d315858fc9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0458ad8dc377d19d", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/run_full_sweep.py:166"}, "properties": {"repobilityId": "9c10df49fb76ffa0", "scanner": "scanner-primary", "fingerprint": "0458ad8dc377d19d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f65505ca8f2630b7", "level": "note", "message": {"text": "Legacy-named symbol `create_backup` in src/berich/backup.py:53"}, "properties": {"repobilityId": "de2c71172d5d6e2f", "scanner": "scanner-primary", "fingerprint": "f65505ca8f2630b7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a3eb3e38da471c16", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/berich/config.py:65"}, "properties": {"repobilityId": "8386ca21c5c80d3f", "scanner": "scanner-primary", "fingerprint": "a3eb3e38da471c16", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d324e5d7a0c6d62f", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in src/berich/cli.py:78"}, "properties": {"repobilityId": "1ee18af42179c454", "scanner": "scanner-primary", "fingerprint": "d324e5d7a0c6d62f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-aecb74d646c979d6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/berich/models/registry.py:44"}, "properties": {"repobilityId": "2a79de175b5ac92c", "scanner": "scanner-primary", "fingerprint": "aecb74d646c979d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5f08c0527ef519e4", "level": "note", "message": {"text": "Legacy-named symbol `_signals_old` in src/berich/signals/store.py:154"}, "properties": {"repobilityId": "8cb8908a7814baf6", "scanner": "scanner-primary", "fingerprint": "5f08c0527ef519e4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d893156f4f4ed43e", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/berich/signals/store.py:37"}, "properties": {"repobilityId": "2bdeb4c950361453", "scanner": "scanner-primary", "fingerprint": "d893156f4f4ed43e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-948c52166a075be0", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in src/berich/signals/paper_intraday.py:283"}, "properties": {"repobilityId": "d24254dd31cac403", "scanner": "scanner-primary", "fingerprint": "948c52166a075be0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9951db8f13e9de15", "level": "note", "message": {"text": "Legacy-named symbol `_paper_trades_old` in src/berich/signals/paper.py:191"}, "properties": {"repobilityId": "5883277aba1bec84", "scanner": "scanner-primary", "fingerprint": "9951db8f13e9de15", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d9cb02d01c564096", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/berich/signals/paper.py:125"}, "properties": {"repobilityId": "e89fffadbfecc602", "scanner": "scanner-primary", "fingerprint": "d9cb02d01c564096", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c7be03968a9743c2", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in src/berich/signals/service.py:477"}, "properties": {"repobilityId": "652abcc9da76fe68", "scanner": "scanner-primary", "fingerprint": "c7be03968a9743c2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b9ee10124f5448ae", "level": "note", "message": {"text": "Legacy-named symbol `create_backup` in src/berich/scheduler/jobs.py:443"}, "properties": {"repobilityId": "0408ffe0ac605cfc", "scanner": "scanner-primary", "fingerprint": "b9ee10124f5448ae", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e9bbef2f9163f5f5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/berich/scheduler/runner.py:73"}, "properties": {"repobilityId": "170831b56c5bfe7b", "scanner": "scanner-primary", "fingerprint": "e9bbef2f9163f5f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c15232d5510b027b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/berich/features/build.py:63"}, "properties": {"repobilityId": "636296451b146a29", "scanner": "scanner-primary", "fingerprint": "c15232d5510b027b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0e5ec59e7ea0633f", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in src/berich/training/tournament.py:184"}, "properties": {"repobilityId": "943baa943d47af28", "scanner": "scanner-primary", "fingerprint": "0e5ec59e7ea0633f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-860c1f228d212812", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/berich/training/tournament.py:485"}, "properties": {"repobilityId": "2e6fa30aec04fd9f", "scanner": "scanner-primary", "fingerprint": "860c1f228d212812", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f9e6bf000abe99ed", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in src/berich/training/hpo.py:197"}, "properties": {"repobilityId": "3cf9e44bb9f2ea60", "scanner": "scanner-primary", "fingerprint": "f9e6bf000abe99ed", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0027e313ade46c8f", "level": "note", "message": {"text": "Near-duplicate function bodies in 7 places"}, "properties": {"repobilityId": "dda02199caaa177e", "scanner": "scanner-primary", "fingerprint": "0027e313ade46c8f", "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": "03f26ac6c903d276", "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": "5c94f16ae06d1f10", "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": "7dcb3f5d68c33ded", "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": "85d92d750fe1662a", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "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": "898747823a11ab9d", "scanner": "scanner-primary", "fingerprint": "33a6b62e30ce7ab4", "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": "5fe03b8076d42dd1", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "864282b3f90d7c38", "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": "61f3f4d265b195e7", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-7c773107502d609d", "level": "error", "message": {"text": "FastAPI POST `set_risk_profile` without auth dependency \u2014 src/berich/api/app.py:134"}, "properties": {"repobilityId": "12171d97d946b64a", "scanner": "scanner-primary", "fingerprint": "7c773107502d609d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/berich/api/app.py"}, "region": {"startLine": 134}}}]}, {"ruleId": "scanner-074f19cbee95ffdf", "level": "note", "message": {"text": "Unused endpoint: GET /watchlist"}, "properties": {"repobilityId": "22789b19bb88bee2", "scanner": "scanner-primary", "fingerprint": "074f19cbee95ffdf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6c45b14190c8385b", "level": "note", "message": {"text": "Unused endpoint: GET /signals"}, "properties": {"repobilityId": "0924cfb4ff5a68fe", "scanner": "scanner-primary", "fingerprint": "6c45b14190c8385b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b19e1c17c07c7741", "level": "note", "message": {"text": "Unused endpoint: GET /signals/{ticker}/history"}, "properties": {"repobilityId": "083e69e6a0f85109", "scanner": "scanner-primary", "fingerprint": "b19e1c17c07c7741", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2090a6105648a994", "level": "note", "message": {"text": "Unused endpoint: GET /signals/{ticker}/explain"}, "properties": {"repobilityId": "6ba965022cee1f12", "scanner": "scanner-primary", "fingerprint": "2090a6105648a994", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0448307b3401dd69", "level": "note", "message": {"text": "Unused endpoint: GET /training"}, "properties": {"repobilityId": "e6d23b2f8c3523e4", "scanner": "scanner-primary", "fingerprint": "0448307b3401dd69", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5fbd9922c85f58d4", "level": "note", "message": {"text": "Unused endpoint: GET /training/{ticker}"}, "properties": {"repobilityId": "3e64ad8c52e88b94", "scanner": "scanner-primary", "fingerprint": "5fbd9922c85f58d4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5c1f829c35b35bb6", "level": "note", "message": {"text": "Unused endpoint: GET /risk-profile"}, "properties": {"repobilityId": "cf1dae3b5f922551", "scanner": "scanner-primary", "fingerprint": "5c1f829c35b35bb6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1c1988f598ce5491", "level": "note", "message": {"text": "Unused endpoint: POST /risk-profile"}, "properties": {"repobilityId": "0aea7f18d47be419", "scanner": "scanner-primary", "fingerprint": "1c1988f598ce5491", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f93a09ffa9e263d8", "level": "note", "message": {"text": "Unused endpoint: GET /replication"}, "properties": {"repobilityId": "ed034526b1babcb6", "scanner": "scanner-primary", "fingerprint": "f93a09ffa9e263d8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-de1b887c975727a8", "level": "note", "message": {"text": "Unused endpoint: GET /brief-plan"}, "properties": {"repobilityId": "19682d0fe523bfa0", "scanner": "scanner-primary", "fingerprint": "de1b887c975727a8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c65b2096245fc520", "level": "note", "message": {"text": "Unused endpoint: GET /video-script"}, "properties": {"repobilityId": "0865067bc0186e0e", "scanner": "scanner-primary", "fingerprint": "c65b2096245fc520", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-584fdee3ada60f4b", "level": "note", "message": {"text": "Unused endpoint: GET /hpo-progress"}, "properties": {"repobilityId": "a1e28f8c10b7506d", "scanner": "scanner-primary", "fingerprint": "584fdee3ada60f4b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-19fd15f35c690f73", "level": "note", "message": {"text": "Unused endpoint: GET /ops"}, "properties": {"repobilityId": "abf542440a4db303", "scanner": "scanner-primary", "fingerprint": "19fd15f35c690f73", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a6f48e60c30777ab", "level": "note", "message": {"text": "Unused endpoint: GET /config"}, "properties": {"repobilityId": "9061d65706b627c1", "scanner": "scanner-primary", "fingerprint": "a6f48e60c30777ab", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4f5a0ecfdb46733b", "level": "note", "message": {"text": "Unused endpoint: GET /universes"}, "properties": {"repobilityId": "861f3cf3ac9a3003", "scanner": "scanner-primary", "fingerprint": "4f5a0ecfdb46733b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f36c51e04836be54", "level": "note", "message": {"text": "Unused endpoint: GET /longshort/basket"}, "properties": {"repobilityId": "e1ce6eddaeb101f5", "scanner": "scanner-primary", "fingerprint": "f36c51e04836be54", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2942190a3bb9bb15", "level": "note", "message": {"text": "Unused endpoint: GET /longshort/equity"}, "properties": {"repobilityId": "a275888692b94b3b", "scanner": "scanner-primary", "fingerprint": "2942190a3bb9bb15", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-352f6b45e012f449", "level": "note", "message": {"text": "Unused endpoint: GET /prices/{ticker}"}, "properties": {"repobilityId": "f2e7a6c67b45f856", "scanner": "scanner-primary", "fingerprint": "352f6b45e012f449", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1083c154b57e9457", "level": "note", "message": {"text": "Unused endpoint: GET /drift"}, "properties": {"repobilityId": "bfb03b4dd9bf070b", "scanner": "scanner-primary", "fingerprint": "1083c154b57e9457", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6ac4cd38d033e815", "level": "note", "message": {"text": "Unused endpoint: GET /backtest"}, "properties": {"repobilityId": "5f4e301da1a26010", "scanner": "scanner-primary", "fingerprint": "6ac4cd38d033e815", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5a29e13fc628cc3a", "level": "note", "message": {"text": "Unused endpoint: GET /paper/positions"}, "properties": {"repobilityId": "b67721a8618044bd", "scanner": "scanner-primary", "fingerprint": "5a29e13fc628cc3a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d70d45e8588bcd91", "level": "note", "message": {"text": "Unused endpoint: GET /paper/concentration"}, "properties": {"repobilityId": "18297c9999ac253a", "scanner": "scanner-primary", "fingerprint": "d70d45e8588bcd91", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fcae788fb70363c5", "level": "note", "message": {"text": "Unused endpoint: GET /paper/equity"}, "properties": {"repobilityId": "a4f86328ebc75ba7", "scanner": "scanner-primary", "fingerprint": "fcae788fb70363c5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9b564b06786ad92a", "level": "note", "message": {"text": "Unused endpoint: GET /paper/closed-trades"}, "properties": {"repobilityId": "43fc8e7ef07fe384", "scanner": "scanner-primary", "fingerprint": "9b564b06786ad92a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bd74dc43ee2ec6f7", "level": "note", "message": {"text": "Unused endpoint: GET /paper/calibration"}, "properties": {"repobilityId": "7ac74b826e5a982a", "scanner": "scanner-primary", "fingerprint": "bd74dc43ee2ec6f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0339f7b821d559a5", "level": "note", "message": {"text": "Unused endpoint: GET /paper/export.csv"}, "properties": {"repobilityId": "b5829e364fae5bfc", "scanner": "scanner-primary", "fingerprint": "0339f7b821d559a5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ba31181b35ec36d6", "level": "note", "message": {"text": "Unused endpoint: GET /intraday/signals"}, "properties": {"repobilityId": "63738f832813e6a9", "scanner": "scanner-primary", "fingerprint": "ba31181b35ec36d6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-544fb124697ae933", "level": "note", "message": {"text": "Unused endpoint: GET /intraday/brief-plan"}, "properties": {"repobilityId": "52271547130c9180", "scanner": "scanner-primary", "fingerprint": "544fb124697ae933", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-20ddf572ec6a875b", "level": "note", "message": {"text": "Unused endpoint: GET /intraday/replication"}, "properties": {"repobilityId": "82fe7bd8a0fdd030", "scanner": "scanner-primary", "fingerprint": "20ddf572ec6a875b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c525bc7cf3139e91", "level": "note", "message": {"text": "Unused endpoint: GET /intraday/paper/positions"}, "properties": {"repobilityId": "550c120a7ebc783f", "scanner": "scanner-primary", "fingerprint": "c525bc7cf3139e91", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ad0461ba036cb594", "level": "note", "message": {"text": "Unused endpoint: GET /intraday/paper/equity"}, "properties": {"repobilityId": "bb7c04a2b188115a", "scanner": "scanner-primary", "fingerprint": "ad0461ba036cb594", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-03396c89783908c3", "level": "note", "message": {"text": "Unused endpoint: GET /intraday/paper/closed-trades"}, "properties": {"repobilityId": "b28efbbee92663c9", "scanner": "scanner-primary", "fingerprint": "03396c89783908c3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}