{"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-dd760b94b22745ef", "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-8910023fb4e39c24", "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-840e557ecf1ef55c", "name": "Stray `console.log` in TS/JS \u2014 farzandim-backend/scripts/last-locations.js:43", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 farzandim-backend/scripts/last-locations.js:43"}, "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-29a7a99b125f6076", "name": "Stray `console.log` in TS/JS \u2014 farzandim-backend/scripts/cleanup-content-orphans.ts:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 farzandim-backend/scripts/cleanup-content-orphans.ts:60"}, "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-8c9369952fb611cb", "name": "Stray `console.log` in TS/JS \u2014 farzandim-backend/prisma/seed-content.ts:72", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 farzandim-backend/prisma/seed-content.ts:72"}, "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-847ae065510c7cd5", "name": "Stray `console.log` in TS/JS \u2014 farzandim-backend/prisma/seed-monetization.ts:133", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 farzandim-backend/prisma/seed-monetization.ts:133"}, "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-885fd2f7cf6a4529", "name": "Stray `console.log` in TS/JS \u2014 farzandim-backend/prisma/seed-admin.ts:92", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 farzandim-backend/prisma/seed-admin.ts:92"}, "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-d4aedd666ff82518", "name": "Stray `console.log` in TS/JS \u2014 farzandim-backend/prisma/seed-notifications.ts:106", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 farzandim-backend/prisma/seed-notifications.ts:106"}, "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-e9ca06aa52b79378", "name": "Stray `console.log` in TS/JS \u2014 farzandim-backend/prisma/seed-olympiads.ts:160", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 farzandim-backend/prisma/seed-olympiads.ts:160"}, "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-0104d43043711b41", "name": "Stray `console.log` in TS/JS \u2014 farzandim-backend/src/lib/minio.ts:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 farzandim-backend/src/lib/minio.ts:64"}, "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-fb5532b235726c0f", "name": "TODO/FIXME marker in shipping code \u2014 farzandim-backend/src/modules/admin-content/videos.ts:248", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 farzandim-backend/src/modules/admin-content/videos.ts:248"}, "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-83e2cf7e9233ef09", "name": "Stray `console.log` in TS/JS \u2014 farzandim-backend/src/modules/admin-notifications/routes.ts:347", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 farzandim-backend/src/modules/admin-notifications/routes.ts:347"}, "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-683bc288e1e102b5", "name": "Stray `console.log` in TS/JS \u2014 Farzandim/tool/fix_const_appcolors.js:125", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 Farzandim/tool/fix_const_appcolors.js:125"}, "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-b14cf3d7da5beb95", "name": "TODO/FIXME marker in shipping code \u2014 frontend-web/src/app/(dashboard)/dashboard/page.tsx:225", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend-web/src/app/(dashboard)/dashboard/page.tsx:225"}, "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-ba8537f0f6661c26", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend-web/src/app/(dashboard)/children/page.tsx:144", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend-web/src/app/(dashboard)/children/page.tsx:144"}, "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-649b84d3250dbc6e", "name": "TODO/FIXME marker in shipping code \u2014 frontend-web/src/app/(dashboard)/children/page.tsx:168", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend-web/src/app/(dashboard)/children/page.tsx:168"}, "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-1fab11890354ce95", "name": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/components/layout/sidebar.tsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/components/layout/sidebar.tsx:130"}, "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-5ea3101d932e0b00", "name": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/components/common/file-dropzone.tsx:61", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/components/common/file-dropzone.tsx:61"}, "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-b8c047d022bb6dbc", "name": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/app/(dashboard)/users/page.tsx:193", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/app/(dashboard)/users/page.tsx:193"}, "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-d4825b21c6a5a1dc", "name": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/app/(dashboard)/notifications/page.tsx:132", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/app/(dashboard)/notifications/page.tsx:132"}, "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-fda51aeaa74dd4fb", "name": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/app/(dashboard)/moderators/page.tsx:203", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/app/(dashboard)/moderators/page.tsx:203"}, "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-2d69d4b1900bed0e", "name": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/app/(dashboard)/content/audiobooks/page.tsx:193", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/app/(dashboard)/content/audiobooks/page.tsx:193"}, "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-d64e87ed73ba24a9", "name": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/app/(dashboard)/content/books/page.tsx:178", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/app/(dashboard)/content/books/page.tsx:178"}, "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-d8518e2668aded39", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/seed-admin-quick.ts:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/seed-admin-quick.ts:45"}, "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-7f6c68ae55a3b957", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/seed-test-user.ts:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/seed-test-user.ts:30"}, "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-476cc0fb4db4cef7", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/seed-admin.js:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/seed-admin.js:50"}, "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-70dfb6d52f3d6915", "name": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed-content.ts:72", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed-content.ts:72"}, "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-555256673c8430b0", "name": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed-monetization.ts:133", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed-monetization.ts:133"}, "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-018b223243a7fbfa", "name": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed-admin.ts:92", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed-admin.ts:92"}, "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-2eae30ab12cfe021", "name": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed-notifications.ts:106", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed-notifications.ts:106"}, "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-b09e31aa0fbcac35", "name": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed-olympiads.ts:160", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed-olympiads.ts:160"}, "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-ca827e87e9927588", "name": "Insecure pattern 'weak_hash' in README.md:67", "shortDescription": {"text": "Insecure pattern 'weak_hash' in README.md:67"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-608f0d360dbea771", "name": "Possible secret in farzandim-backend/scripts/deploy-sprint-5.1.sh", "shortDescription": {"text": "Possible secret in farzandim-backend/scripts/deploy-sprint-5.1.sh"}, "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-194e2346cba653f2", "name": "Insecure pattern 'node_child_process' in farzandim-backend/src/lib/video-thumbnail.ts:18", "shortDescription": {"text": "Insecure pattern 'node_child_process' in farzandim-backend/src/lib/video-thumbnail.ts:18"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c0c02b52939c2785", "name": "Insecure pattern 'local_storage_auth_token' in _archive/admin_panel_legacy/app/login/page.tsx:27", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in _archive/admin_panel_legacy/app/login/page.tsx:27"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5e545d6fea47fa1d", "name": "Insecure pattern 'local_storage_auth_token' in admin_panel/app/login/page.tsx:27", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in admin_panel/app/login/page.tsx:27"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3c0cee68064ee4fb", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/cache@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "11 test file(s) for 490 source file(s) (ratio 0.02). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 98 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 64 placeholder/mock markers across 32 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b264ff3b28f6336c", "name": "Commented-code block (5 lines) in farzandim-backend/scripts/cleanup-content-orphans.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in farzandim-backend/scripts/cleanup-content-orphans.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f4d412dbea54b860", "name": "Commented-code block (7 lines) in farzandim-backend/src/server.ts:50", "shortDescription": {"text": "Commented-code block (7 lines) in farzandim-backend/src/server.ts:50"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6b1148864b5c8c2c", "name": "Commented-code block (5 lines) in farzandim-backend/src/config/env.ts:38", "shortDescription": {"text": "Commented-code block (5 lines) in farzandim-backend/src/config/env.ts:38"}, "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-6fb711f9c813c7fe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 farzandim-backend/src/lib/sms.ts:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 farzandim-backend/src/lib/sms.ts:24"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-feec791524477a44", "name": "Commented-code block (5 lines) in farzandim-backend/src/lib/admin-content-upload.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in farzandim-backend/src/lib/admin-content-upload.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dbf47c6626e17801", "name": "Commented-code block (6 lines) in farzandim-backend/src/lib/gamification-rules.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in farzandim-backend/src/lib/gamification-rules.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5d24053d52083561", "name": "Commented-code block (5 lines) in farzandim-backend/src/lib/two-factor.ts:9", "shortDescription": {"text": "Commented-code block (5 lines) in farzandim-backend/src/lib/two-factor.ts:9"}, "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-ab9b5d3a261a984d", "name": "Commented-code block (5 lines) in farzandim-backend/src/lib/video-thumbnail.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in farzandim-backend/src/lib/video-thumbnail.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f4f7d291ccf32244", "name": "Commented-code block (5 lines) in farzandim-backend/src/lib/realtime.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in farzandim-backend/src/lib/realtime.ts:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1d34942c886d1d60", "name": "Commented-code block (5 lines) in farzandim-backend/src/lib/payments/providers/uzum.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in farzandim-backend/src/lib/payments/providers/uzum.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5d542def9b1a57fb", "name": "Commented-code block (5 lines) in farzandim-backend/src/lib/payments/providers/payme.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in farzandim-backend/src/lib/payments/providers/payme.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7e9d3f5261670b93", "name": "Commented-code block (5 lines) in farzandim-backend/src/lib/payments/providers/click.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in farzandim-backend/src/lib/payments/providers/click.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-44854a7a03ff505a", "name": "Commented-code block (5 lines) in farzandim-backend/src/modules/app-version/routes.ts:14", "shortDescription": {"text": "Commented-code block (5 lines) in farzandim-backend/src/modules/app-version/routes.ts: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-2359406c8d0ab3cb", "name": "Commented-code block (5 lines) in farzandim-backend/src/modules/app-limits/routes.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in farzandim-backend/src/modules/app-limits/routes.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cc7efaa8ef376b15", "name": "Commented-code block (6 lines) in farzandim-backend/src/modules/admin-content/books.ts:103", "shortDescription": {"text": "Commented-code block (6 lines) in farzandim-backend/src/modules/admin-content/books.ts:103"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4b1904cd2b6f3c57", "name": "Commented-code block (7 lines) in farzandim-backend/src/modules/admin-content/videos.ts:168", "shortDescription": {"text": "Commented-code block (7 lines) in farzandim-backend/src/modules/admin-content/videos.ts:168"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cff90fbd330dde0d", "name": "Commented-code block (7 lines) in farzandim-backend/src/modules/admin-content/audiobooks.ts:145", "shortDescription": {"text": "Commented-code block (7 lines) in farzandim-backend/src/modules/admin-content/audiobooks.ts:145"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1dc92acecb0989ed", "name": "Commented-code block (9 lines) in farzandim-backend/src/modules/child-pair-requests/routes.ts:8", "shortDescription": {"text": "Commented-code block (9 lines) in farzandim-backend/src/modules/child-pair-requests/routes.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-036cf631e70ea212", "name": "Commented-code block (7 lines) in farzandim-backend/src/modules/photo-requests/routes.ts:11", "shortDescription": {"text": "Commented-code block (7 lines) in farzandim-backend/src/modules/photo-requests/routes.ts:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-db400f56cc1a0136", "name": "Commented-code block (5 lines) in farzandim-backend/src/modules/geo-zones/routes.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in farzandim-backend/src/modules/geo-zones/routes.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-15aa39292cc93737", "name": "`fetch()` without try/.catch or AbortSignal \u2014 _archive/admin_panel_legacy/app/login/page.tsx:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 _archive/admin_panel_legacy/app/login/page.tsx:16"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-acb5ab52d379532a", "name": "Commented-code block (7 lines) in Farzandim/serve_preview.py:1", "shortDescription": {"text": "Commented-code block (7 lines) in Farzandim/serve_preview.py: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-d526c79db2b7aa15", "name": "Stub function `log_message` (body is just `pass`/`return`) \u2014 Farzandim/serve_preview.py:24", "shortDescription": {"text": "Stub function `log_message` (body is just `pass`/`return`) \u2014 Farzandim/serve_preview.py:24"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a7000bde570dd939", "name": "Network/subprocess call without timeout or try/except \u2014 Farzandim/tool/comments_only_check.py:67", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 Farzandim/tool/comments_only_check.py:67"}, "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-dd334cf00221accc", "name": "Network/subprocess call without timeout or try/except \u2014 Farzandim/tool/i18n_verify_uz.py:9", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 Farzandim/tool/i18n_verify_uz.py:9"}, "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-2ce748175f936883", "name": "Commented-code block (5 lines) in frontend-web/src/app/layout.tsx:7", "shortDescription": {"text": "Commented-code block (5 lines) in frontend-web/src/app/layout.tsx:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-96747507c3c97ca5", "name": "Commented-code block (7 lines) in admin-web/src/components/olympiads/olympiad-wizard.tsx:104", "shortDescription": {"text": "Commented-code block (7 lines) in admin-web/src/components/olympiads/olympiad-wizard.tsx:104"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9bbb6d431467649a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 admin_panel/app/login/page.tsx:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin_panel/app/login/page.tsx:16"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c0791163003a555e", "name": "Commented-code block (7 lines) in backend/src/main.ts:27", "shortDescription": {"text": "Commented-code block (7 lines) in backend/src/main.ts:27"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-22460eae8559cddc", "name": "Commented-code block (5 lines) in backend/src/modules/app-limits/dto/create-app-limit.dto.ts:29", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/modules/app-limits/dto/create-app-limit.dto.ts:29"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-886059b4b0aa4f8b", "name": "Commented-code block (8 lines) in backend/src/modules/auth/auth.service.ts:172", "shortDescription": {"text": "Commented-code block (8 lines) in backend/src/modules/auth/auth.service.ts:172"}, "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-3fc762152229a6df", "name": "Commented-code block (6 lines) in backend/src/modules/child-pair-requests/child-pair-requests.service.ts:82", "shortDescription": {"text": "Commented-code block (6 lines) in backend/src/modules/child-pair-requests/child-pair-requests.service.ts:82"}, "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-0f3cc7454945e1ee", "name": "Commented-code block (6 lines) in backend/src/modules/consumer-content/consumer-content.controller.ts:130", "shortDescription": {"text": "Commented-code block (6 lines) in backend/src/modules/consumer-content/consumer-content.controller.ts:130"}, "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-f86ad20a019612d6", "name": "Commented-code block (6 lines) in backend/src/modules/voice-messages/voice-messages.service.ts:178", "shortDescription": {"text": "Commented-code block (6 lines) in backend/src/modules/voice-messages/voice-messages.service.ts:178"}, "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-829734b53278bc5d", "name": "Commented-code block (6 lines) in backend/src/modules/location/location.service.ts:110", "shortDescription": {"text": "Commented-code block (6 lines) in backend/src/modules/location/location.service.ts:110"}, "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-ca945def54a288ab", "name": "Commented-code block (5 lines) in backend/src/modules/support/telegram-support.service.ts:522", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/modules/support/telegram-support.service.ts:522"}, "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-550c24ea07fc76bd", "name": "Commented-code block (5 lines) in backend/src/modules/app-usage/app-usage.service.ts:18", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/modules/app-usage/app-usage.service.ts:18"}, "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-af022f937dd5b7fd", "name": "9 env vars used in code but missing from .env.example", "shortDescription": {"text": "9 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ADMIN_2FA_CHALLENGE_SECRET`, `ADMIN_EMAIL`, `ADMIN_NAME`, `ADMIN_PASSWORD`, `ADMIN_SEED_PASSWORD`, `FFMPEG_BIN`, `NEXT_PUBLIC_API_BASE_URL`, `NEXT_PUBLIC_API_URL` + 1 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-39f4a44d62a77de8", "name": "Dangling fetch: POST https://api.telegram.org/bot${this.token}/${method} (backend/src/modules/support/telegram-support.s", "shortDescription": {"text": "Dangling fetch: POST https://api.telegram.org/bot${this.token}/${method} (backend/src/modules/support/telegram-support.service.ts:93)"}, "fullDescription": {"text": "`backend/src/modules/support/telegram-support.service.ts:93` calls `POST https://api.telegram.org/bot${this.token}/${method}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.telegram.org/bot/<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-16fdcf6eefbde7d3", "name": "Dangling fetch: POST https://api.telegram.org/bot${this.token}/${method} (backend/src/modules/support/telegram-support.s", "shortDescription": {"text": "Dangling fetch: POST https://api.telegram.org/bot${this.token}/${method} (backend/src/modules/support/telegram-support.service.ts:125)"}, "fullDescription": {"text": "`backend/src/modules/support/telegram-support.service.ts:125` calls `POST https://api.telegram.org/bot${this.token}/${method}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.telegram.org/bot/<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-4756b4c4da7d2088", "name": "Unused endpoint: GET /api/health", "shortDescription": {"text": "Unused endpoint: GET /api/health"}, "fullDescription": {"text": "`farzandim-backend/src/server.ts` declares `GET /api/health` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8f5614c18a2feac7", "name": "Unused endpoint: GET /api", "shortDescription": {"text": "Unused endpoint: GET /api"}, "fullDescription": {"text": "`farzandim-backend/src/server.ts` declares `GET /api` 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-fd1dc91abf32142d", "name": "Unused endpoint: GET /me", "shortDescription": {"text": "Unused endpoint: GET /me"}, "fullDescription": {"text": "`farzandim-backend/src/modules/users/routes.ts` declares `GET /me` 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-ba7ee282b4bfa59a", "name": "Unused endpoint: POST /me/avatar", "shortDescription": {"text": "Unused endpoint: POST /me/avatar"}, "fullDescription": {"text": "`farzandim-backend/src/modules/users/routes.ts` declares `POST /me/avatar` 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-380780ae47e04514", "name": "Unused endpoint: DELETE /me", "shortDescription": {"text": "Unused endpoint: DELETE /me"}, "fullDescription": {"text": "`farzandim-backend/src/modules/users/routes.ts` declares `DELETE /me` 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-3a6dc402c9f6cbc4", "name": "Unused endpoint: PUT /me", "shortDescription": {"text": "Unused endpoint: PUT /me"}, "fullDescription": {"text": "`farzandim-backend/src/modules/users/routes.ts` declares `PUT /me` 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-d02007478872bbc5", "name": "Unused endpoint: POST /me/phone", "shortDescription": {"text": "Unused endpoint: POST /me/phone"}, "fullDescription": {"text": "`farzandim-backend/src/modules/users/routes.ts` declares `POST /me/phone` 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-57f748241201a140", "name": "Unused endpoint: POST /me/phone/verify", "shortDescription": {"text": "Unused endpoint: POST /me/phone/verify"}, "fullDescription": {"text": "`farzandim-backend/src/modules/users/routes.ts` declares `POST /me/phone/verify` 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-a2ad8a606e157795", "name": "Unused endpoint: POST /telegram", "shortDescription": {"text": "Unused endpoint: POST /telegram"}, "fullDescription": {"text": "`farzandim-backend/src/modules/auth/routes.ts` declares `POST /telegram` 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-7ce17d6b092a81ca", "name": "Unused endpoint: POST /refresh", "shortDescription": {"text": "Unused endpoint: POST /refresh"}, "fullDescription": {"text": "`farzandim-backend/src/modules/auth/routes.ts` declares `POST /refresh` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3e191dbecfd458d3", "name": "Unused endpoint: POST /child-pair", "shortDescription": {"text": "Unused endpoint: POST /child-pair"}, "fullDescription": {"text": "`farzandim-backend/src/modules/auth/routes.ts` declares `POST /child-pair` 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-99fc36db98c134ce", "name": "Unused endpoint: POST /logout", "shortDescription": {"text": "Unused endpoint: POST /logout"}, "fullDescription": {"text": "`farzandim-backend/src/modules/auth/routes.ts` declares `POST /logout` 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-6236b283b79811b8", "name": "Unused endpoint: POST /upload", "shortDescription": {"text": "Unused endpoint: POST /upload"}, "fullDescription": {"text": "`farzandim-backend/src/modules/admin-content/books.ts` declares `POST /upload` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`farzandim-backend/src/modules/admin-content/books.ts` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-599114e2a4d7d26d", "name": "Unused endpoint: POST /create", "shortDescription": {"text": "Unused endpoint: POST /create"}, "fullDescription": {"text": "`farzandim-backend/src/modules/admin-content/books.ts` declares `POST /create` 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-5fbc954f63526821", "name": "Unused endpoint: PATCH /:id", "shortDescription": {"text": "Unused endpoint: PATCH /:id"}, "fullDescription": {"text": "`farzandim-backend/src/modules/admin-content/books.ts` declares `PATCH /: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-df23478917b686af", "name": "Unused endpoint: PATCH /:id/approve", "shortDescription": {"text": "Unused endpoint: PATCH /:id/approve"}, "fullDescription": {"text": "`farzandim-backend/src/modules/admin-content/books.ts` declares `PATCH /:id/approve` 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-2899a6bfb5a91c2f", "name": "Unused endpoint: PATCH /:id/reject", "shortDescription": {"text": "Unused endpoint: PATCH /:id/reject"}, "fullDescription": {"text": "`farzandim-backend/src/modules/admin-content/books.ts` declares `PATCH /:id/reject` 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-7a61c112b611f4bb", "name": "Unused endpoint: DELETE /:id", "shortDescription": {"text": "Unused endpoint: DELETE /:id"}, "fullDescription": {"text": "`farzandim-backend/src/modules/admin-content/books.ts` declares `DELETE /: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-90631dcf4fb49f54", "name": "Unused endpoint: POST /bulk", "shortDescription": {"text": "Unused endpoint: POST /bulk"}, "fullDescription": {"text": "`farzandim-backend/src/modules/admin-content/videos.ts` declares `POST /bulk` 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-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`farzandim-backend/src/modules/admin-content/audiobooks.ts` declares `POST /` 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-ca5756175765b49d", "name": "Unused endpoint: GET /:id", "shortDescription": {"text": "Unused endpoint: GET /:id"}, "fullDescription": {"text": "`farzandim-backend/src/modules/admin-users/routes.ts` declares `GET /: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-032ddac057cdeecd", "name": "Unused endpoint: GET /child-profiles/:id", "shortDescription": {"text": "Unused endpoint: GET /child-profiles/:id"}, "fullDescription": {"text": "`farzandim-backend/src/modules/admin-users/routes.ts` declares `GET /child-profiles/: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-60cfa7dcf35ec65c", "name": "Unused endpoint: GET /videos", "shortDescription": {"text": "Unused endpoint: GET /videos"}, "fullDescription": {"text": "`farzandim-backend/src/modules/consumer-content/routes.ts` declares `GET /videos` 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-ef111010c7296bfe", "name": "Unused endpoint: GET /audiobooks", "shortDescription": {"text": "Unused endpoint: GET /audiobooks"}, "fullDescription": {"text": "`farzandim-backend/src/modules/consumer-content/routes.ts` declares `GET /audiobooks` 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-1a3628ad8571821c", "name": "Unused endpoint: GET /books", "shortDescription": {"text": "Unused endpoint: GET /books"}, "fullDescription": {"text": "`farzandim-backend/src/modules/consumer-content/routes.ts` declares `GET /books` 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-9260174de75b32ba", "name": "Unused endpoint: GET /categories", "shortDescription": {"text": "Unused endpoint: GET /categories"}, "fullDescription": {"text": "`farzandim-backend/src/modules/consumer-content/routes.ts` declares `GET /categories` 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-a6b0664b3f2ae614", "name": "Unused endpoint: POST /videos/:id/view", "shortDescription": {"text": "Unused endpoint: POST /videos/:id/view"}, "fullDescription": {"text": "`farzandim-backend/src/modules/consumer-content/routes.ts` declares `POST /videos/:id/view` 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-0b7d81760eaddbd9", "name": "Unused endpoint: POST /videos/:id/like", "shortDescription": {"text": "Unused endpoint: POST /videos/:id/like"}, "fullDescription": {"text": "`farzandim-backend/src/modules/consumer-content/routes.ts` declares `POST /videos/:id/like` 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-e0bfe3b27f348b84", "name": "Unused endpoint: POST /audiobooks/:id/play", "shortDescription": {"text": "Unused endpoint: POST /audiobooks/:id/play"}, "fullDescription": {"text": "`farzandim-backend/src/modules/consumer-content/routes.ts` declares `POST /audiobooks/:id/play` 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-ec3dcfef81618b7d", "name": "Unused endpoint: POST /books/:id/read", "shortDescription": {"text": "Unused endpoint: POST /books/:id/read"}, "fullDescription": {"text": "`farzandim-backend/src/modules/consumer-content/routes.ts` declares `POST /books/:id/read` 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-224f4cd67ebc1418", "name": "Unused endpoint: POST /location", "shortDescription": {"text": "Unused endpoint: POST /location"}, "fullDescription": {"text": "`farzandim-backend/src/modules/location/routes.ts` declares `POST /location` 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-f5cae3068724f9d3", "name": "Unused endpoint: GET /plans", "shortDescription": {"text": "Unused endpoint: GET /plans"}, "fullDescription": {"text": "`farzandim-backend/src/modules/payments/routes.ts` declares `GET /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-6385cd0e163a390f", "name": "Unused endpoint: POST /checkout", "shortDescription": {"text": "Unused endpoint: POST /checkout"}, "fullDescription": {"text": "`farzandim-backend/src/modules/payments/routes.ts` declares `POST /checkout` 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-0f86fe08327ef0bf", "name": "Unused endpoint: POST /webhook/payme", "shortDescription": {"text": "Unused endpoint: POST /webhook/payme"}, "fullDescription": {"text": "`farzandim-backend/src/modules/payments/routes.ts` declares `POST /webhook/payme` 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-bc897fb546f13a86", "name": "Unused endpoint: POST /webhook/click", "shortDescription": {"text": "Unused endpoint: POST /webhook/click"}, "fullDescription": {"text": "`farzandim-backend/src/modules/payments/routes.ts` declares `POST /webhook/click` 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-014f883d114ebf9c", "name": "Unused endpoint: POST /webhook/uzum", "shortDescription": {"text": "Unused endpoint: POST /webhook/uzum"}, "fullDescription": {"text": "`farzandim-backend/src/modules/payments/routes.ts` declares `POST /webhook/uzum` 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-0af622f8aad5633c", "name": "Unused endpoint: GET /ranking", "shortDescription": {"text": "Unused endpoint: GET /ranking"}, "fullDescription": {"text": "`farzandim-backend/src/modules/consumer-olympiads/routes.ts` declares `GET /ranking` 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-f50587b43f3c7597", "name": "Unused endpoint: POST /:id/start", "shortDescription": {"text": "Unused endpoint: POST /:id/start"}, "fullDescription": {"text": "`farzandim-backend/src/modules/consumer-olympiads/routes.ts` declares `POST /:id/start` 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-a18a4544141923b3", "name": "Unused endpoint: POST /attempts/:id/answer", "shortDescription": {"text": "Unused endpoint: POST /attempts/:id/answer"}, "fullDescription": {"text": "`farzandim-backend/src/modules/consumer-olympiads/routes.ts` declares `POST /attempts/:id/answer` 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-3874bd5b41c27a59", "name": "Unused endpoint: POST /attempts/:id/submit", "shortDescription": {"text": "Unused endpoint: POST /attempts/:id/submit"}, "fullDescription": {"text": "`farzandim-backend/src/modules/consumer-olympiads/routes.ts` declares `POST /attempts/:id/submit` 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-cfe75e429a604960", "name": "Unused endpoint: POST /:id/block", "shortDescription": {"text": "Unused endpoint: POST /:id/block"}, "fullDescription": {"text": "`farzandim-backend/src/modules/admin-moderators/routes.ts` declares `POST /:id/block` 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-ecf701d94130bd6e", "name": "Unused endpoint: POST /:id/unblock", "shortDescription": {"text": "Unused endpoint: POST /:id/unblock"}, "fullDescription": {"text": "`farzandim-backend/src/modules/admin-moderators/routes.ts` declares `POST /:id/unblock` 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-34e6cf7dddc9af0f", "name": "Unused endpoint: POST /plans", "shortDescription": {"text": "Unused endpoint: POST /plans"}, "fullDescription": {"text": "`farzandim-backend/src/modules/admin-monetization/routes.ts` declares `POST /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-4cd4bc88769c0c05", "name": "Unused endpoint: PATCH /plans/:id", "shortDescription": {"text": "Unused endpoint: PATCH /plans/:id"}, "fullDescription": {"text": "`farzandim-backend/src/modules/admin-monetization/routes.ts` declares `PATCH /plans/: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-0c5ab8e2c3a951a4", "name": "Unused endpoint: DELETE /plans/:id", "shortDescription": {"text": "Unused endpoint: DELETE /plans/:id"}, "fullDescription": {"text": "`farzandim-backend/src/modules/admin-monetization/routes.ts` declares `DELETE /plans/: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-3b47011927e7798e", "name": "Unused endpoint: GET /promocodes", "shortDescription": {"text": "Unused endpoint: GET /promocodes"}, "fullDescription": {"text": "`farzandim-backend/src/modules/admin-monetization/routes.ts` declares `GET /promocodes` 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-0a5b31ea08ca2f24", "name": "Unused endpoint: POST /promocodes", "shortDescription": {"text": "Unused endpoint: POST /promocodes"}, "fullDescription": {"text": "`farzandim-backend/src/modules/admin-monetization/routes.ts` declares `POST /promocodes` 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-7e79266d54ba04a3", "name": "Unused endpoint: PATCH /promocodes/:id", "shortDescription": {"text": "Unused endpoint: PATCH /promocodes/:id"}, "fullDescription": {"text": "`farzandim-backend/src/modules/admin-monetization/routes.ts` declares `PATCH /promocodes/: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-102cab16e012fda5", "name": "Unused endpoint: DELETE /promocodes/:id", "shortDescription": {"text": "Unused endpoint: DELETE /promocodes/:id"}, "fullDescription": {"text": "`farzandim-backend/src/modules/admin-monetization/routes.ts` declares `DELETE /promocodes/: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}}]}}, "automationDetails": {"id": "repobility/23696"}, "properties": {"repository": "Ziyodillokh/farzandim_app", "repoUrl": "https://github.com/Ziyodillokh/farzandim_app", "branch": "main"}, "results": [{"ruleId": "scanner-dd760b94b22745ef", "level": "note", "message": {"text": "Possibly dead Python function: log_message"}, "properties": {"repobilityId": "965f3150b4af5b2e", "scanner": "scanner-primary", "fingerprint": "dd760b94b22745ef", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Farzandim/serve_preview.py:24"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8910023fb4e39c24", "level": "note", "message": {"text": "Possibly dead Python function: do_GET"}, "properties": {"repobilityId": "2d943bb45e4f13bd", "scanner": "scanner-primary", "fingerprint": "8910023fb4e39c24", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Farzandim/serve_preview.py:27"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-840e557ecf1ef55c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 farzandim-backend/scripts/last-locations.js:43"}, "properties": {"repobilityId": "bd03602711e87af7", "scanner": "scanner-primary", "fingerprint": "840e557ecf1ef55c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-29a7a99b125f6076", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 farzandim-backend/scripts/cleanup-content-orphans.ts:60"}, "properties": {"repobilityId": "f4dd784604384aef", "scanner": "scanner-primary", "fingerprint": "29a7a99b125f6076", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8c9369952fb611cb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 farzandim-backend/prisma/seed-content.ts:72"}, "properties": {"repobilityId": "1b587d6e372d5f39", "scanner": "scanner-primary", "fingerprint": "8c9369952fb611cb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-847ae065510c7cd5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 farzandim-backend/prisma/seed-monetization.ts:133"}, "properties": {"repobilityId": "bb7029d05e2afbd9", "scanner": "scanner-primary", "fingerprint": "847ae065510c7cd5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-885fd2f7cf6a4529", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 farzandim-backend/prisma/seed-admin.ts:92"}, "properties": {"repobilityId": "c3c3a10d811facc9", "scanner": "scanner-primary", "fingerprint": "885fd2f7cf6a4529", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d4aedd666ff82518", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 farzandim-backend/prisma/seed-notifications.ts:106"}, "properties": {"repobilityId": "a14e38b247d5c4bc", "scanner": "scanner-primary", "fingerprint": "d4aedd666ff82518", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e9ca06aa52b79378", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 farzandim-backend/prisma/seed-olympiads.ts:160"}, "properties": {"repobilityId": "1d575be359dfe734", "scanner": "scanner-primary", "fingerprint": "e9ca06aa52b79378", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0104d43043711b41", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 farzandim-backend/src/lib/minio.ts:64"}, "properties": {"repobilityId": "54a73a3433d915fc", "scanner": "scanner-primary", "fingerprint": "0104d43043711b41", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fb5532b235726c0f", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 farzandim-backend/src/modules/admin-content/videos.ts:248"}, "properties": {"repobilityId": "a5d8e7897f3dadfb", "scanner": "scanner-primary", "fingerprint": "fb5532b235726c0f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-83e2cf7e9233ef09", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 farzandim-backend/src/modules/admin-notifications/routes.ts:347"}, "properties": {"repobilityId": "c9078413ef0f4bec", "scanner": "scanner-primary", "fingerprint": "83e2cf7e9233ef09", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-683bc288e1e102b5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 Farzandim/tool/fix_const_appcolors.js:125"}, "properties": {"repobilityId": "ad006e783744aac6", "scanner": "scanner-primary", "fingerprint": "683bc288e1e102b5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b14cf3d7da5beb95", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend-web/src/app/(dashboard)/dashboard/page.tsx:225"}, "properties": {"repobilityId": "76f7043866c60deb", "scanner": "scanner-primary", "fingerprint": "b14cf3d7da5beb95", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-ba8537f0f6661c26", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend-web/src/app/(dashboard)/children/page.tsx:144"}, "properties": {"repobilityId": "2959b4fb8495412c", "scanner": "scanner-primary", "fingerprint": "ba8537f0f6661c26", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-649b84d3250dbc6e", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend-web/src/app/(dashboard)/children/page.tsx:168"}, "properties": {"repobilityId": "89f5ee7fd795aa40", "scanner": "scanner-primary", "fingerprint": "649b84d3250dbc6e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-1fab11890354ce95", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/components/layout/sidebar.tsx:130"}, "properties": {"repobilityId": "7dbb2eda7a960b9d", "scanner": "scanner-primary", "fingerprint": "1fab11890354ce95", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5ea3101d932e0b00", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/components/common/file-dropzone.tsx:61"}, "properties": {"repobilityId": "6afe8a0e4ad62e45", "scanner": "scanner-primary", "fingerprint": "5ea3101d932e0b00", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b8c047d022bb6dbc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/app/(dashboard)/users/page.tsx:193"}, "properties": {"repobilityId": "90c8d41a5d42e1ca", "scanner": "scanner-primary", "fingerprint": "b8c047d022bb6dbc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4825b21c6a5a1dc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/app/(dashboard)/notifications/page.tsx:132"}, "properties": {"repobilityId": "d6a951d30c14f9d8", "scanner": "scanner-primary", "fingerprint": "d4825b21c6a5a1dc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fda51aeaa74dd4fb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/app/(dashboard)/moderators/page.tsx:203"}, "properties": {"repobilityId": "e17fae3be23e79d8", "scanner": "scanner-primary", "fingerprint": "fda51aeaa74dd4fb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2d69d4b1900bed0e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/app/(dashboard)/content/audiobooks/page.tsx:193"}, "properties": {"repobilityId": "2e29dd1fb732ce80", "scanner": "scanner-primary", "fingerprint": "2d69d4b1900bed0e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d64e87ed73ba24a9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 admin-web/src/app/(dashboard)/content/books/page.tsx:178"}, "properties": {"repobilityId": "039f08fadfb09926", "scanner": "scanner-primary", "fingerprint": "d64e87ed73ba24a9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d8518e2668aded39", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/seed-admin-quick.ts:45"}, "properties": {"repobilityId": "eb2a528ed1f2b95d", "scanner": "scanner-primary", "fingerprint": "d8518e2668aded39", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7f6c68ae55a3b957", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/seed-test-user.ts:30"}, "properties": {"repobilityId": "762661db7c0f6700", "scanner": "scanner-primary", "fingerprint": "7f6c68ae55a3b957", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-476cc0fb4db4cef7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/seed-admin.js:50"}, "properties": {"repobilityId": "8f72625310c2b2ab", "scanner": "scanner-primary", "fingerprint": "476cc0fb4db4cef7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-70dfb6d52f3d6915", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed-content.ts:72"}, "properties": {"repobilityId": "d5f10202dd594772", "scanner": "scanner-primary", "fingerprint": "70dfb6d52f3d6915", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-555256673c8430b0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed-monetization.ts:133"}, "properties": {"repobilityId": "52e1a7f310103bac", "scanner": "scanner-primary", "fingerprint": "555256673c8430b0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-018b223243a7fbfa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed-admin.ts:92"}, "properties": {"repobilityId": "c90e4257eae86691", "scanner": "scanner-primary", "fingerprint": "018b223243a7fbfa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2eae30ab12cfe021", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed-notifications.ts:106"}, "properties": {"repobilityId": "2fedb2dd56ea54cf", "scanner": "scanner-primary", "fingerprint": "2eae30ab12cfe021", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b09e31aa0fbcac35", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/prisma/seed-olympiads.ts:160"}, "properties": {"repobilityId": "e133e2241c5a7178", "scanner": "scanner-primary", "fingerprint": "b09e31aa0fbcac35", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ca827e87e9927588", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in README.md:67"}, "properties": {"repobilityId": "5388562008acceec", "scanner": "scanner-primary", "fingerprint": "ca827e87e9927588", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "README.md"}, "region": {"startLine": 67}}}]}, {"ruleId": "scanner-608f0d360dbea771", "level": "error", "message": {"text": "Possible secret in farzandim-backend/scripts/deploy-sprint-5.1.sh"}, "properties": {"repobilityId": "a59cc98f8296c59b", "scanner": "scanner-primary", "fingerprint": "608f0d360dbea771", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "farzandim-backend/scripts/deploy-sprint-5.1.sh"}, "region": {"startLine": 59}}}]}, {"ruleId": "scanner-194e2346cba653f2", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in farzandim-backend/src/lib/video-thumbnail.ts:18"}, "properties": {"repobilityId": "c860553f403783d8", "scanner": "scanner-primary", "fingerprint": "194e2346cba653f2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "farzandim-backend/src/lib/video-thumbnail.ts"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-c0c02b52939c2785", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in _archive/admin_panel_legacy/app/login/page.tsx:27"}, "properties": {"repobilityId": "32ca5a03af95692b", "scanner": "scanner-primary", "fingerprint": "c0c02b52939c2785", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "_archive/admin_panel_legacy/app/login/page.tsx"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-5e545d6fea47fa1d", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in admin_panel/app/login/page.tsx:27"}, "properties": {"repobilityId": "241e028a37a1a538", "scanner": "scanner-primary", "fingerprint": "5e545d6fea47fa1d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "admin_panel/app/login/page.tsx"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-3c0cee68064ee4fb", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "45b86500e862dd19", "scanner": "scanner-primary", "fingerprint": "3c0cee68064ee4fb", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-test.yml"}, "region": {"startLine": 328}}}]}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "b686bd258144141b", "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": "c17e39a36f031fcf", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "180401bfefa29a35", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "b719566185b02dba", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "8acf4a7574dad736", "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": "0029fdf3c23080bc", "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": "66f27f1a50ad58e0", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-b264ff3b28f6336c", "level": "none", "message": {"text": "Commented-code block (5 lines) in farzandim-backend/scripts/cleanup-content-orphans.ts:5"}, "properties": {"repobilityId": "ea036e9522365fae", "scanner": "scanner-primary", "fingerprint": "b264ff3b28f6336c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f4d412dbea54b860", "level": "none", "message": {"text": "Commented-code block (7 lines) in farzandim-backend/src/server.ts:50"}, "properties": {"repobilityId": "46e069221ec437bf", "scanner": "scanner-primary", "fingerprint": "f4d412dbea54b860", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b1148864b5c8c2c", "level": "none", "message": {"text": "Commented-code block (5 lines) in farzandim-backend/src/config/env.ts:38"}, "properties": {"repobilityId": "5c7cd0950128eb2a", "scanner": "scanner-primary", "fingerprint": "6b1148864b5c8c2c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6fb711f9c813c7fe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 farzandim-backend/src/lib/sms.ts:24"}, "properties": {"repobilityId": "98113eced0bdbff8", "scanner": "scanner-primary", "fingerprint": "6fb711f9c813c7fe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-feec791524477a44", "level": "none", "message": {"text": "Commented-code block (5 lines) in farzandim-backend/src/lib/admin-content-upload.ts:7"}, "properties": {"repobilityId": "4d4ff5bf154f003b", "scanner": "scanner-primary", "fingerprint": "feec791524477a44", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dbf47c6626e17801", "level": "none", "message": {"text": "Commented-code block (6 lines) in farzandim-backend/src/lib/gamification-rules.ts:4"}, "properties": {"repobilityId": "27c3602c09bdc6b9", "scanner": "scanner-primary", "fingerprint": "dbf47c6626e17801", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d24053d52083561", "level": "none", "message": {"text": "Commented-code block (5 lines) in farzandim-backend/src/lib/two-factor.ts:9"}, "properties": {"repobilityId": "fc192a873225d6f1", "scanner": "scanner-primary", "fingerprint": "5d24053d52083561", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ab9b5d3a261a984d", "level": "none", "message": {"text": "Commented-code block (5 lines) in farzandim-backend/src/lib/video-thumbnail.ts:8"}, "properties": {"repobilityId": "39c6700da88d5f32", "scanner": "scanner-primary", "fingerprint": "ab9b5d3a261a984d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f4f7d291ccf32244", "level": "none", "message": {"text": "Commented-code block (5 lines) in farzandim-backend/src/lib/realtime.ts:7"}, "properties": {"repobilityId": "16c3e882876384c9", "scanner": "scanner-primary", "fingerprint": "f4f7d291ccf32244", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1d34942c886d1d60", "level": "none", "message": {"text": "Commented-code block (5 lines) in farzandim-backend/src/lib/payments/providers/uzum.ts:3"}, "properties": {"repobilityId": "6358cca50c2a06ec", "scanner": "scanner-primary", "fingerprint": "1d34942c886d1d60", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d542def9b1a57fb", "level": "none", "message": {"text": "Commented-code block (5 lines) in farzandim-backend/src/lib/payments/providers/payme.ts:4"}, "properties": {"repobilityId": "6e0ccda171298889", "scanner": "scanner-primary", "fingerprint": "5d542def9b1a57fb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7e9d3f5261670b93", "level": "none", "message": {"text": "Commented-code block (5 lines) in farzandim-backend/src/lib/payments/providers/click.ts:4"}, "properties": {"repobilityId": "97853db0485dc3ad", "scanner": "scanner-primary", "fingerprint": "7e9d3f5261670b93", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-44854a7a03ff505a", "level": "none", "message": {"text": "Commented-code block (5 lines) in farzandim-backend/src/modules/app-version/routes.ts:14"}, "properties": {"repobilityId": "297526a8078ee458", "scanner": "scanner-primary", "fingerprint": "44854a7a03ff505a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2359406c8d0ab3cb", "level": "none", "message": {"text": "Commented-code block (5 lines) in farzandim-backend/src/modules/app-limits/routes.ts:8"}, "properties": {"repobilityId": "5a21691c8a7390d4", "scanner": "scanner-primary", "fingerprint": "2359406c8d0ab3cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cc7efaa8ef376b15", "level": "none", "message": {"text": "Commented-code block (6 lines) in farzandim-backend/src/modules/admin-content/books.ts:103"}, "properties": {"repobilityId": "437ab0c31c678344", "scanner": "scanner-primary", "fingerprint": "cc7efaa8ef376b15", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4b1904cd2b6f3c57", "level": "none", "message": {"text": "Commented-code block (7 lines) in farzandim-backend/src/modules/admin-content/videos.ts:168"}, "properties": {"repobilityId": "1cec4bd340f1f4ee", "scanner": "scanner-primary", "fingerprint": "4b1904cd2b6f3c57", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cff90fbd330dde0d", "level": "none", "message": {"text": "Commented-code block (7 lines) in farzandim-backend/src/modules/admin-content/audiobooks.ts:145"}, "properties": {"repobilityId": "d379d9125bbdcce4", "scanner": "scanner-primary", "fingerprint": "cff90fbd330dde0d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1dc92acecb0989ed", "level": "none", "message": {"text": "Commented-code block (9 lines) in farzandim-backend/src/modules/child-pair-requests/routes.ts:8"}, "properties": {"repobilityId": "187548b7c43784f9", "scanner": "scanner-primary", "fingerprint": "1dc92acecb0989ed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-036cf631e70ea212", "level": "none", "message": {"text": "Commented-code block (7 lines) in farzandim-backend/src/modules/photo-requests/routes.ts:11"}, "properties": {"repobilityId": "0a35363b86976561", "scanner": "scanner-primary", "fingerprint": "036cf631e70ea212", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-db400f56cc1a0136", "level": "none", "message": {"text": "Commented-code block (5 lines) in farzandim-backend/src/modules/geo-zones/routes.ts:8"}, "properties": {"repobilityId": "48a28798560f2722", "scanner": "scanner-primary", "fingerprint": "db400f56cc1a0136", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-15aa39292cc93737", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 _archive/admin_panel_legacy/app/login/page.tsx:16"}, "properties": {"repobilityId": "b89e2a901cf520ba", "scanner": "scanner-primary", "fingerprint": "15aa39292cc93737", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-acb5ab52d379532a", "level": "none", "message": {"text": "Commented-code block (7 lines) in Farzandim/serve_preview.py:1"}, "properties": {"repobilityId": "65fc783afc9de7a5", "scanner": "scanner-primary", "fingerprint": "acb5ab52d379532a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d526c79db2b7aa15", "level": "note", "message": {"text": "Stub function `log_message` (body is just `pass`/`return`) \u2014 Farzandim/serve_preview.py:24"}, "properties": {"repobilityId": "00e150a9a4907b6e", "scanner": "scanner-primary", "fingerprint": "d526c79db2b7aa15", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-a7000bde570dd939", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 Farzandim/tool/comments_only_check.py:67"}, "properties": {"repobilityId": "373ccf935156983d", "scanner": "scanner-primary", "fingerprint": "a7000bde570dd939", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dd334cf00221accc", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 Farzandim/tool/i18n_verify_uz.py:9"}, "properties": {"repobilityId": "bb40bcb0bccee71e", "scanner": "scanner-primary", "fingerprint": "dd334cf00221accc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2ce748175f936883", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend-web/src/app/layout.tsx:7"}, "properties": {"repobilityId": "e3b0e8e8fbea5547", "scanner": "scanner-primary", "fingerprint": "2ce748175f936883", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-96747507c3c97ca5", "level": "none", "message": {"text": "Commented-code block (7 lines) in admin-web/src/components/olympiads/olympiad-wizard.tsx:104"}, "properties": {"repobilityId": "b02e54e4f6ae9920", "scanner": "scanner-primary", "fingerprint": "96747507c3c97ca5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9bbb6d431467649a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 admin_panel/app/login/page.tsx:16"}, "properties": {"repobilityId": "6f6b0fa11219d79f", "scanner": "scanner-primary", "fingerprint": "9bbb6d431467649a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c0791163003a555e", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/src/main.ts:27"}, "properties": {"repobilityId": "59f8f77443fdfe71", "scanner": "scanner-primary", "fingerprint": "c0791163003a555e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-22460eae8559cddc", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/modules/app-limits/dto/create-app-limit.dto.ts:29"}, "properties": {"repobilityId": "af2a9cb4d501a45f", "scanner": "scanner-primary", "fingerprint": "22460eae8559cddc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-886059b4b0aa4f8b", "level": "none", "message": {"text": "Commented-code block (8 lines) in backend/src/modules/auth/auth.service.ts:172"}, "properties": {"repobilityId": "f6044d46a7e86c4e", "scanner": "scanner-primary", "fingerprint": "886059b4b0aa4f8b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3fc762152229a6df", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/src/modules/child-pair-requests/child-pair-requests.service.ts:82"}, "properties": {"repobilityId": "6cdb81d7ea8c2f94", "scanner": "scanner-primary", "fingerprint": "3fc762152229a6df", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f3cc7454945e1ee", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/src/modules/consumer-content/consumer-content.controller.ts:130"}, "properties": {"repobilityId": "37ba87dbb90a8156", "scanner": "scanner-primary", "fingerprint": "0f3cc7454945e1ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f86ad20a019612d6", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/src/modules/voice-messages/voice-messages.service.ts:178"}, "properties": {"repobilityId": "0a9669ae61a0f0fd", "scanner": "scanner-primary", "fingerprint": "f86ad20a019612d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-829734b53278bc5d", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/src/modules/location/location.service.ts:110"}, "properties": {"repobilityId": "b391adb6ec56a5fa", "scanner": "scanner-primary", "fingerprint": "829734b53278bc5d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ca945def54a288ab", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/modules/support/telegram-support.service.ts:522"}, "properties": {"repobilityId": "c3bcbc0f3ef2dcef", "scanner": "scanner-primary", "fingerprint": "ca945def54a288ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-550c24ea07fc76bd", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/modules/app-usage/app-usage.service.ts:18"}, "properties": {"repobilityId": "bfdef5ad9816d303", "scanner": "scanner-primary", "fingerprint": "550c24ea07fc76bd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af022f937dd5b7fd", "level": "note", "message": {"text": "9 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "5597384795dea7a4", "scanner": "scanner-primary", "fingerprint": "af022f937dd5b7fd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-39f4a44d62a77de8", "level": "error", "message": {"text": "Dangling fetch: POST https://api.telegram.org/bot${this.token}/${method} (backend/src/modules/support/telegram-support.service.ts:93)"}, "properties": {"repobilityId": "7d1a33572bfa46af", "scanner": "scanner-primary", "fingerprint": "39f4a44d62a77de8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-16fdcf6eefbde7d3", "level": "error", "message": {"text": "Dangling fetch: POST https://api.telegram.org/bot${this.token}/${method} (backend/src/modules/support/telegram-support.service.ts:125)"}, "properties": {"repobilityId": "e2b331420610e41d", "scanner": "scanner-primary", "fingerprint": "16fdcf6eefbde7d3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4756b4c4da7d2088", "level": "note", "message": {"text": "Unused endpoint: GET /api/health"}, "properties": {"repobilityId": "d09b3c05ac8a50dc", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8f5614c18a2feac7", "level": "note", "message": {"text": "Unused endpoint: GET /api"}, "properties": {"repobilityId": "331ba3f6d25f27b3", "scanner": "scanner-primary", "fingerprint": "8f5614c18a2feac7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "0d371c23014dc64d", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ba7ee282b4bfa59a", "level": "note", "message": {"text": "Unused endpoint: POST /me/avatar"}, "properties": {"repobilityId": "434856916c2bf753", "scanner": "scanner-primary", "fingerprint": "ba7ee282b4bfa59a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-380780ae47e04514", "level": "note", "message": {"text": "Unused endpoint: DELETE /me"}, "properties": {"repobilityId": "37fbbf42c37c38b3", "scanner": "scanner-primary", "fingerprint": "380780ae47e04514", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3a6dc402c9f6cbc4", "level": "note", "message": {"text": "Unused endpoint: PUT /me"}, "properties": {"repobilityId": "903b0d2229a8eace", "scanner": "scanner-primary", "fingerprint": "3a6dc402c9f6cbc4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d02007478872bbc5", "level": "note", "message": {"text": "Unused endpoint: POST /me/phone"}, "properties": {"repobilityId": "a5b4b6ef738114ac", "scanner": "scanner-primary", "fingerprint": "d02007478872bbc5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-57f748241201a140", "level": "note", "message": {"text": "Unused endpoint: POST /me/phone/verify"}, "properties": {"repobilityId": "3b01cfb29ada121e", "scanner": "scanner-primary", "fingerprint": "57f748241201a140", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a2ad8a606e157795", "level": "note", "message": {"text": "Unused endpoint: POST /telegram"}, "properties": {"repobilityId": "e009f6d1a7d203e2", "scanner": "scanner-primary", "fingerprint": "a2ad8a606e157795", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7ce17d6b092a81ca", "level": "note", "message": {"text": "Unused endpoint: POST /refresh"}, "properties": {"repobilityId": "c27ba0f263b12dda", "scanner": "scanner-primary", "fingerprint": "7ce17d6b092a81ca", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3e191dbecfd458d3", "level": "note", "message": {"text": "Unused endpoint: POST /child-pair"}, "properties": {"repobilityId": "86d1ccf6d8b9f044", "scanner": "scanner-primary", "fingerprint": "3e191dbecfd458d3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-99fc36db98c134ce", "level": "note", "message": {"text": "Unused endpoint: POST /logout"}, "properties": {"repobilityId": "d9c07b96986be7d4", "scanner": "scanner-primary", "fingerprint": "99fc36db98c134ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6236b283b79811b8", "level": "note", "message": {"text": "Unused endpoint: POST /upload"}, "properties": {"repobilityId": "f27073111c0411b0", "scanner": "scanner-primary", "fingerprint": "6236b283b79811b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "b5ddfec9fe61e630", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-599114e2a4d7d26d", "level": "note", "message": {"text": "Unused endpoint: POST /create"}, "properties": {"repobilityId": "877b6af4e94a9682", "scanner": "scanner-primary", "fingerprint": "599114e2a4d7d26d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5fbc954f63526821", "level": "note", "message": {"text": "Unused endpoint: PATCH /:id"}, "properties": {"repobilityId": "b1432bc347e9e56f", "scanner": "scanner-primary", "fingerprint": "5fbc954f63526821", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-df23478917b686af", "level": "note", "message": {"text": "Unused endpoint: PATCH /:id/approve"}, "properties": {"repobilityId": "6a64fac161db006c", "scanner": "scanner-primary", "fingerprint": "df23478917b686af", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2899a6bfb5a91c2f", "level": "note", "message": {"text": "Unused endpoint: PATCH /:id/reject"}, "properties": {"repobilityId": "3be0c12caccbdc92", "scanner": "scanner-primary", "fingerprint": "2899a6bfb5a91c2f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a61c112b611f4bb", "level": "note", "message": {"text": "Unused endpoint: DELETE /:id"}, "properties": {"repobilityId": "d59396cbfab6d93f", "scanner": "scanner-primary", "fingerprint": "7a61c112b611f4bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-90631dcf4fb49f54", "level": "note", "message": {"text": "Unused endpoint: POST /bulk"}, "properties": {"repobilityId": "1885524e537b3014", "scanner": "scanner-primary", "fingerprint": "90631dcf4fb49f54", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "600dc626d35b7b06", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca5756175765b49d", "level": "note", "message": {"text": "Unused endpoint: GET /:id"}, "properties": {"repobilityId": "df91a8866a34d80e", "scanner": "scanner-primary", "fingerprint": "ca5756175765b49d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-032ddac057cdeecd", "level": "note", "message": {"text": "Unused endpoint: GET /child-profiles/:id"}, "properties": {"repobilityId": "c6c262593f69bb08", "scanner": "scanner-primary", "fingerprint": "032ddac057cdeecd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-60cfa7dcf35ec65c", "level": "note", "message": {"text": "Unused endpoint: GET /videos"}, "properties": {"repobilityId": "0d4726ffdf88bd22", "scanner": "scanner-primary", "fingerprint": "60cfa7dcf35ec65c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ef111010c7296bfe", "level": "note", "message": {"text": "Unused endpoint: GET /audiobooks"}, "properties": {"repobilityId": "eafb1a201d8acd51", "scanner": "scanner-primary", "fingerprint": "ef111010c7296bfe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1a3628ad8571821c", "level": "note", "message": {"text": "Unused endpoint: GET /books"}, "properties": {"repobilityId": "1389ab292c6eb18a", "scanner": "scanner-primary", "fingerprint": "1a3628ad8571821c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9260174de75b32ba", "level": "note", "message": {"text": "Unused endpoint: GET /categories"}, "properties": {"repobilityId": "761d1beff2bed621", "scanner": "scanner-primary", "fingerprint": "9260174de75b32ba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a6b0664b3f2ae614", "level": "note", "message": {"text": "Unused endpoint: POST /videos/:id/view"}, "properties": {"repobilityId": "0ef4c5fadbc31c81", "scanner": "scanner-primary", "fingerprint": "a6b0664b3f2ae614", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0b7d81760eaddbd9", "level": "note", "message": {"text": "Unused endpoint: POST /videos/:id/like"}, "properties": {"repobilityId": "bf83e25548984987", "scanner": "scanner-primary", "fingerprint": "0b7d81760eaddbd9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e0bfe3b27f348b84", "level": "note", "message": {"text": "Unused endpoint: POST /audiobooks/:id/play"}, "properties": {"repobilityId": "5d37db45c2903eb2", "scanner": "scanner-primary", "fingerprint": "e0bfe3b27f348b84", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec3dcfef81618b7d", "level": "note", "message": {"text": "Unused endpoint: POST /books/:id/read"}, "properties": {"repobilityId": "df6f59872f0e94a8", "scanner": "scanner-primary", "fingerprint": "ec3dcfef81618b7d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-224f4cd67ebc1418", "level": "note", "message": {"text": "Unused endpoint: POST /location"}, "properties": {"repobilityId": "57844ff6a4ae6714", "scanner": "scanner-primary", "fingerprint": "224f4cd67ebc1418", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f5cae3068724f9d3", "level": "note", "message": {"text": "Unused endpoint: GET /plans"}, "properties": {"repobilityId": "680b0b7be46e97db", "scanner": "scanner-primary", "fingerprint": "f5cae3068724f9d3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6385cd0e163a390f", "level": "note", "message": {"text": "Unused endpoint: POST /checkout"}, "properties": {"repobilityId": "7ae152d67db93095", "scanner": "scanner-primary", "fingerprint": "6385cd0e163a390f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0f86fe08327ef0bf", "level": "note", "message": {"text": "Unused endpoint: POST /webhook/payme"}, "properties": {"repobilityId": "acc5e028196298f1", "scanner": "scanner-primary", "fingerprint": "0f86fe08327ef0bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bc897fb546f13a86", "level": "note", "message": {"text": "Unused endpoint: POST /webhook/click"}, "properties": {"repobilityId": "7d35ecc5e8d8fa4b", "scanner": "scanner-primary", "fingerprint": "bc897fb546f13a86", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-014f883d114ebf9c", "level": "note", "message": {"text": "Unused endpoint: POST /webhook/uzum"}, "properties": {"repobilityId": "c92f90c721aa4a5a", "scanner": "scanner-primary", "fingerprint": "014f883d114ebf9c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0af622f8aad5633c", "level": "note", "message": {"text": "Unused endpoint: GET /ranking"}, "properties": {"repobilityId": "04e2c52b90f062ca", "scanner": "scanner-primary", "fingerprint": "0af622f8aad5633c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f50587b43f3c7597", "level": "note", "message": {"text": "Unused endpoint: POST /:id/start"}, "properties": {"repobilityId": "340247154e2f6031", "scanner": "scanner-primary", "fingerprint": "f50587b43f3c7597", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a18a4544141923b3", "level": "note", "message": {"text": "Unused endpoint: POST /attempts/:id/answer"}, "properties": {"repobilityId": "9f5f5f5eb9e42767", "scanner": "scanner-primary", "fingerprint": "a18a4544141923b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3874bd5b41c27a59", "level": "note", "message": {"text": "Unused endpoint: POST /attempts/:id/submit"}, "properties": {"repobilityId": "8aee997be91333aa", "scanner": "scanner-primary", "fingerprint": "3874bd5b41c27a59", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cfe75e429a604960", "level": "note", "message": {"text": "Unused endpoint: POST /:id/block"}, "properties": {"repobilityId": "1461d65ac09c7c32", "scanner": "scanner-primary", "fingerprint": "cfe75e429a604960", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ecf701d94130bd6e", "level": "note", "message": {"text": "Unused endpoint: POST /:id/unblock"}, "properties": {"repobilityId": "eeb2df197c02d23a", "scanner": "scanner-primary", "fingerprint": "ecf701d94130bd6e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-34e6cf7dddc9af0f", "level": "note", "message": {"text": "Unused endpoint: POST /plans"}, "properties": {"repobilityId": "8d7d9197407e0cfe", "scanner": "scanner-primary", "fingerprint": "34e6cf7dddc9af0f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4cd4bc88769c0c05", "level": "note", "message": {"text": "Unused endpoint: PATCH /plans/:id"}, "properties": {"repobilityId": "483b9dc0aef034c1", "scanner": "scanner-primary", "fingerprint": "4cd4bc88769c0c05", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0c5ab8e2c3a951a4", "level": "note", "message": {"text": "Unused endpoint: DELETE /plans/:id"}, "properties": {"repobilityId": "90cf2d97a061da5f", "scanner": "scanner-primary", "fingerprint": "0c5ab8e2c3a951a4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3b47011927e7798e", "level": "note", "message": {"text": "Unused endpoint: GET /promocodes"}, "properties": {"repobilityId": "5fcdbe16ded0b9d4", "scanner": "scanner-primary", "fingerprint": "3b47011927e7798e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0a5b31ea08ca2f24", "level": "note", "message": {"text": "Unused endpoint: POST /promocodes"}, "properties": {"repobilityId": "2908938b04819cb8", "scanner": "scanner-primary", "fingerprint": "0a5b31ea08ca2f24", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7e79266d54ba04a3", "level": "note", "message": {"text": "Unused endpoint: PATCH /promocodes/:id"}, "properties": {"repobilityId": "80ac6e318adad669", "scanner": "scanner-primary", "fingerprint": "7e79266d54ba04a3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-102cab16e012fda5", "level": "note", "message": {"text": "Unused endpoint: DELETE /promocodes/:id"}, "properties": {"repobilityId": "efcaeaf8c918c802", "scanner": "scanner-primary", "fingerprint": "102cab16e012fda5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}