{"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": "foundry_blueprint_gap", "name": "Foundry mined blueprint gap alignment: said019/kala-Studio", "shortDescription": {"text": "Foundry mined blueprint gap alignment: said019/kala-Studio"}, "fullDescription": {"text": "Graph query export: Human feedback aligned with blueprint or architecture gaps\nQuery id: blueprint_gap_alignment\nQuery type: motif_query\nIntent: Curriculum-gap examples connecting issue threads to helicopter-view gaps.\nMotif: blueprint_gap_alignment\nTraining usage: curriculum_gap\nGraph gold label: weak_supervision_needs_review\nRepo: said019/kala-Studio\nThread: said019/kala-Studio#3\nEvidence:\nGraph motif: Human feedback aligns with blueprint or architecture gaps\nMotif id: blueprint_gap_alignment\nPolarity: mixed\nTraining usage: curriculum_gap\nSeverity: medium\nRepo: said019/kala-Studio\nThread: said019/kala-Studio#3\nGraph gold label: weak_supervision_needs_review\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: said019/kala-Studio#3\nRepo: said019/kala-Studio\nIssue/PR number: 3\nGraph consistency label: weak_supervision_needs_review\nNodes: 19\nEdges: 26\nNode types: {'commit': 5, 'link_quality': 4, 'pr_file': 2, 'thread': 1, 'repo': 1, 'comment': 1, 'comment_chain': 1, 'issue_c"}, "properties": {"scanner": "foundry_dataset", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "cwe": "", "owasp": ""}}, {"id": "foundry_assumption_check", "name": "Foundry mined assumption checks: said019/kala-Studio", "shortDescription": {"text": "Foundry mined assumption checks: said019/kala-Studio"}, "fullDescription": {"text": "Comment chain pattern product: assumption_checks\nRepo: said019/kala-Studio\nThread: said019/kala-Studio#3\nOutcome: claimed_resolved_unverified\nThread label: thread_has_human_issue_and_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_weak_supervision, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: said019/kala-Studio#3\nRepo: said019/kala-Studio\nThread label: thread_has_human_issue_and_fix_context\nOutcome: claimed_resolved_unverified\nComment count: 1\nLinked commit count: 5\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 2\nLabels: {'api_integration_gap': 1}\nPolarities: {'bad': 1}\nChanged file labels: {'api_or_backend': 1, 'ui_or_frontend': 1}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-fe9060bb6374f99a\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"api_integration_gap\",\n    \"polarity\": \"bad\","}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "medium", "confidence": 0.62, "cwe": "", "owasp": ""}}, {"id": "foundry_auth_guardrail_gap", "name": "Foundry mined security auth guardrail gaps: said019/kala-Studio", "shortDescription": {"text": "Foundry mined security auth guardrail gaps: said019/kala-Studio"}, "fullDescription": {"text": "Graph query export: Security/auth changes without enough guardrails\nQuery id: security_auth_guardrail_gaps\nQuery type: motif_query\nIntent: Assumption-check security/auth examples requiring stronger tests or CI.\nMotif: security_auth_without_guardrails\nTraining usage: assumption_check\nGraph gold label: weak_supervision_needs_review\nRepo: said019/kala-Studio\nThread: said019/kala-Studio#1\nEvidence:\nGraph motif: Security/auth change without enough guardrails\nMotif id: security_auth_without_guardrails\nPolarity: bad\nTraining usage: assumption_check\nSeverity: critical\nRepo: said019/kala-Studio\nThread: said019/kala-Studio#1\nGraph gold label: weak_supervision_needs_review\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: said019/kala-Studio#1\nRepo: said019/kala-Studio\nIssue/PR number: 1\nGraph consistency label: weak_supervision_needs_review\nNodes: 29\nEdges: 55\nNode types: {'pr_file': 15, 'commit': 5, 'link_quality': 3, 'thread': 1, 'repo': 1, 'comment': 1, 'comment_chain': 1, 'iss"}, "properties": {"scanner": "foundry_dataset", "category": "auth", "severity": "critical", "confidence": 0.78, "cwe": "", "owasp": ""}}, {"id": "scanner-8f9a1bb3ed239f13", "name": "Possibly dead Python function: replacer", "shortDescription": {"text": "Possibly dead Python function: replacer"}, "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-9fba6778ef6e7764", "name": "Stray `console.log` in TS/JS \u2014 server/emailService.js:173", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/emailService.js:173"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0c8bae573b7f0a19", "name": "TODO/FIXME marker in shipping code \u2014 server/index.js:12898", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 server/index.js:12898"}, "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-8955d177f342b86c", "name": "Stray `console.log` in TS/JS \u2014 server/index.js:768", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/index.js:768"}, "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-b209c77e83b119fd", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:70", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:70"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b8b5960f02291334", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/app/AppShell.tsx:188", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/app/AppShell.tsx:188"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-63bfeb437dd90bad", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/AdminClasses.tsx:224", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/AdminClasses.tsx:224"}, "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-5f88c4237d6727bf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/AdminLayout.tsx:271", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/AdminLayout.tsx:271"}, "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-07a419795e147328", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Index.tsx:494", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Index.tsx:494"}, "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-f46026d136bed5ff", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/client/Profile.tsx:85", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/client/Profile.tsx:85"}, "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-720b919a5a8b5553", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/client/Events.tsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/client/Events.tsx:145"}, "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-7f15dc47af5a5347", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/client/BookClasses.tsx:445", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/client/BookClasses.tsx:445"}, "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-e85dbddfca56d6e6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/client/Wallet.tsx:248", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/client/Wallet.tsx:248"}, "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-240c97f038767b08", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Dashboard.tsx:303", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Dashboard.tsx:303"}, "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-ae4d000c2bd8ec8f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/settings/SettingsPage.tsx:437", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/settings/SettingsPage.tsx:437"}, "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-b9efaa9977bb5d0d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/notifications/AdminNotifications.tsx:162", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/notifications/AdminNotifications.tsx:162"}, "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-54502b85af0e77b3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/bookings/BookingsList.tsx:398", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/bookings/BookingsList.tsx:398"}, "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-8cd5aa8452daa7cf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/bookings/Waitlist.tsx:125", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/bookings/Waitlist.tsx:125"}, "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-fa9fb29c2a36f4fb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/events/EventListView.tsx:143", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/events/EventListView.tsx:143"}, "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-448150dc5b8f9a8d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/events/EventDetailView.tsx:190", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/events/EventDetailView.tsx:190"}, "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-9806df015d9ab128", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/reviews/AdminReviewsDashboard.tsx:204", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/reviews/AdminReviewsDashboard.tsx:204"}, "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-06d47c1806030752", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/classes/ClassesCalendar.tsx:489", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/classes/ClassesCalendar.tsx:489"}, "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-40f0b5ef6621cf30", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/whatsapp/WhatsAppTemplatesPage.tsx:180", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/whatsapp/WhatsAppTemplatesPage.tsx:180"}, "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-2d1a477aa634e973", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/videos/VideoList.tsx:128", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/videos/VideoList.tsx:128"}, "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-84a5715afdbc6544", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/payments/PaymentsPage.tsx:164", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/payments/PaymentsPage.tsx:164"}, "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-86cd278e26e71a8d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/campaigns/CampaignsPage.tsx:308", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/campaigns/CampaignsPage.tsx:308"}, "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-35ffd26d8efec4b7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/pos/POSPage.tsx:213", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/pos/POSPage.tsx:213"}, "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-7b9fd1cabbbe742f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/reports/ReportsPage.tsx:225", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/reports/ReportsPage.tsx:225"}, "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-dba19fa8e055646d", "name": "Insecure pattern 'node_child_process' in server/index.js:17", "shortDescription": {"text": "Insecure pattern 'node_child_process' in server/index.js:17"}, "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-a941bb17e37a903c", "name": "Insecure pattern 'private_key_in_repo' in server/index.js:5436", "shortDescription": {"text": "Insecure pattern 'private_key_in_repo' in server/index.js:5436"}, "fullDescription": {"text": "Found a known-risky pattern (private_key_in_repo). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-999b53b6384094aa", "name": "Insecure pattern 'cors_wildcard' in endpoint-auditor/SKILL.md:113", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in endpoint-auditor/SKILL.md:113"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3d27a5c341535475", "name": "Insecure pattern 'cors_wildcard' in endpoint-auditor/scripts/audit_runner.py:232", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in endpoint-auditor/scripts/audit_runner.py:232"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-35b6f9da7d80b9ea", "name": "Insecure pattern 'local_storage_auth_token' in src/stores/authStore.ts:80", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in src/stores/authStore.ts:80"}, "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-93d0283845aa2c2d", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:70", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:70"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fbbc0154f9fad6cc", "name": "Very large file: server/index.js (17595 lines)", "shortDescription": {"text": "Very large file: server/index.js (17595 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6bc6f54e72bcab41", "name": "Very large file: src/pages/Index.tsx (2039 lines)", "shortDescription": {"text": "Very large file: src/pages/Index.tsx (2039 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0f39e66fc4b09b7f", "name": "Very large file: src/pages/admin/classes/ClassesCalendar.tsx (1805 lines)", "shortDescription": {"text": "Very large file: src/pages/admin/classes/ClassesCalendar.tsx (1805 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "12 test file(s) for 167 source file(s) (ratio 0.07). 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 112 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 186 placeholder/mock markers across 50 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-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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-d4ada9076acbdf7f", "name": "Legacy-named symbol `admin_phones_seed_v1` in server/index.js:1715", "shortDescription": {"text": "Legacy-named symbol `admin_phones_seed_v1` in server/index.js:1715"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0e2aecc8b70bd75a", "name": "Commented-code block (7 lines) in server/index.js:404", "shortDescription": {"text": "Commented-code block (7 lines) in server/index.js:404"}, "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-df8a134b843fdeb4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/index.js:13415", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/index.js:13415"}, "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-bafb38f2c9a4a2a1", "name": "Commented-code block (5 lines) in endpoint-auditor/audit/db-mutating-test.mjs:1", "shortDescription": {"text": "Commented-code block (5 lines) in endpoint-auditor/audit/db-mutating-test.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e2cb01e3261fdcf5", "name": "Commented-code block (5 lines) in endpoint-auditor/audit/smoke-test-puts.mjs:1", "shortDescription": {"text": "Commented-code block (5 lines) in endpoint-auditor/audit/smoke-test-puts.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-52405aff5f0cb80b", "name": "Legacy-named symbol `kala_video_upload_v1` in src/pages/admin/videos/VideoUpload.tsx:63", "shortDescription": {"text": "Legacy-named symbol `kala_video_upload_v1` in src/pages/admin/videos/VideoUpload.tsx:63"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8a59c26f5bc8898f", "name": "Commented-code block (6 lines) in src/pages/admin/videos/VideoUpload.tsx:258", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/admin/videos/VideoUpload.tsx:258"}, "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-ac6ce0e6d1dca97a", "name": "61 env vars used in code but missing from .env.example", "shortDescription": {"text": "61 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ADDON_ONLINE_PRICE`, `ADMIN_ID`, `APPLE_APNS_HOST`, `APPLE_APNS_KEY`, `APPLE_APNS_KEY_BASE64`, `APPLE_APNS_KEY_PATH`, `APPLE_APNS_KEY_PEM`, `APPLE_AUTH_TOKEN` + 53 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\ntools/generate_wallet_visual_assets.py:render_wallet_icon, tools/generate_wallet_visual_assets.py:render_wallet_thumb\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d674fedc105a40b0", "name": "Frontend route `/auth/reset-password` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/auth/reset-password` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-25d0c5669cd9b822", "name": "Frontend route `/auth` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/auth` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-04c0a1a33008053e", "name": "Frontend route `/app/classes/:classId` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/app/classes/:classId` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e33f663923aa78b7", "name": "Frontend route `/app/orders/:orderId` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/app/orders/:orderId` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a4fd0e46f8a681fb", "name": "Frontend route `/app/videos/:videoId` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/app/videos/:videoId` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3d47341344301241", "name": "Frontend route `/admin` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/admin` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2f23980be8e712d7", "name": "Frontend route `/admin/clients/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/admin/clients/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-eab4409ce16248d5", "name": "Frontend route `/admin/classes/types` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/admin/classes/types` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2555c1c1d105c946", "name": "Frontend route `/admin/classes/generate` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/admin/classes/generate` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-67a73c5575fcd908", "name": "Frontend route `/admin/schedules` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/admin/schedules` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-30c59f0fa7d1d511", "name": "Frontend route `/admin/bookings/waitlist` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/admin/bookings/waitlist` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b13c10bee7b6459f", "name": "Frontend route `/admin/referrals` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/admin/referrals` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6d9662c295ffcb6c", "name": "Frontend route `/admin/videos/ventas` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/admin/videos/ventas` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5f70be6430ca7009", "name": "Frontend route `/admin/reviews` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/admin/reviews` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-516109338c29be18", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (server/index.js:13415)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (server/index.js:13415)"}, "fullDescription": {"text": "`server/index.js:13415` calls `POST https://oauth2.googleapis.com/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/oauth2.googleapis.com/token`\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-495618054705096e", "name": "Dangling fetch: POST https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&fields=id (server/index.js:13", "shortDescription": {"text": "Dangling fetch: POST https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&fields=id (server/index.js:13439)"}, "fullDescription": {"text": "`server/index.js:13439` calls `POST https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&fields=id` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.googleapis.com/upload/drive/v3/files`\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-bd7fd18e047cecd7", "name": "Dangling fetch: POST https://www.googleapis.com/drive/v3/files/${uploadJson.id}/permissions (server/index.js:13448)", "shortDescription": {"text": "Dangling fetch: POST https://www.googleapis.com/drive/v3/files/${uploadJson.id}/permissions (server/index.js:13448)"}, "fullDescription": {"text": "`server/index.js:13448` calls `POST https://www.googleapis.com/drive/v3/files/${uploadJson.id}/permissions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.googleapis.com/drive/v3/files/<p>/permissions`\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-04fcb6612714d6c7", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (server/index.js:16110)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (server/index.js:16110)"}, "fullDescription": {"text": "`server/index.js:16110` calls `POST https://oauth2.googleapis.com/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/oauth2.googleapis.com/token`\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-0c3ada4272372b2d", "name": "Dangling fetch: POST https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&fields=id (server/index.js:16", "shortDescription": {"text": "Dangling fetch: POST https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&fields=id (server/index.js:16133)"}, "fullDescription": {"text": "`server/index.js:16133` calls `POST https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&fields=id` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.googleapis.com/upload/drive/v3/files`\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-e97d025f32dc3950", "name": "Dangling fetch: POST https://www.googleapis.com/drive/v3/files/${uploadJson.id}/permissions (server/index.js:16141)", "shortDescription": {"text": "Dangling fetch: POST https://www.googleapis.com/drive/v3/files/${uploadJson.id}/permissions (server/index.js:16141)"}, "fullDescription": {"text": "`server/index.js:16141` calls `POST https://www.googleapis.com/drive/v3/files/${uploadJson.id}/permissions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.googleapis.com/drive/v3/files/<p>/permissions`\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-804ed3c88808741e", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (server/index.js:422)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (server/index.js:422)"}, "fullDescription": {"text": "`server/index.js:422` calls `POST https://oauth2.googleapis.com/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/oauth2.googleapis.com/token`\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-b1489a44c704bbe7", "name": "Dangling fetch: POST https://www.googleapis.com/drive/v3/files/${fileId}/permissions (server/index.js:432)", "shortDescription": {"text": "Dangling fetch: POST https://www.googleapis.com/drive/v3/files/${fileId}/permissions (server/index.js:432)"}, "fullDescription": {"text": "`server/index.js:432` calls `POST https://www.googleapis.com/drive/v3/files/${fileId}/permissions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/www.googleapis.com/drive/v3/files/<p>/permissions`\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-d79703384afe48b6", "name": "Dangling fetch: POST https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&fields=id,webViewLink (server", "shortDescription": {"text": "Dangling fetch: POST https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&fields=id,webViewLink (server/index.js:471)"}, "fullDescription": {"text": "`server/index.js:471` calls `POST https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&fields=id,webViewLink` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/www.googleapis.com/upload/drive/v3/files`\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-83bb5064ec46a3fc", "name": "Dangling fetch: POST https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable&fields=id,webViewLink (server", "shortDescription": {"text": "Dangling fetch: POST https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable&fields=id,webViewLink (server/index.js:494)"}, "fullDescription": {"text": "`server/index.js:494` calls `POST https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable&fields=id,webViewLink` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/www.googleapis.com/upload/drive/v3/files`\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-6339b44de3ed7d1e", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (server/index.js:5473)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (server/index.js:5473)"}, "fullDescription": {"text": "`server/index.js:5473` calls `POST https://oauth2.googleapis.com/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/oauth2.googleapis.com/token`\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-2d2202c0c148597a", "name": "Dangling fetch: GET https://walletobjects.googleapis.com/walletobjects/v1/loyaltyClass/${GW_CLASS_ID} (server/index.js:5", "shortDescription": {"text": "Dangling fetch: GET https://walletobjects.googleapis.com/walletobjects/v1/loyaltyClass/${GW_CLASS_ID} (server/index.js:5506)"}, "fullDescription": {"text": "`server/index.js:5506` calls `GET https://walletobjects.googleapis.com/walletobjects/v1/loyaltyClass/${GW_CLASS_ID}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/walletobjects.googleapis.com/walletobjects/v1/loyaltyclass/<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-be7e4035508490c4", "name": "Dangling fetch: PUT https://walletobjects.googleapis.com/walletobjects/v1/loyaltyClass/${GW_CLASS_ID} (server/index.js:5", "shortDescription": {"text": "Dangling fetch: PUT https://walletobjects.googleapis.com/walletobjects/v1/loyaltyClass/${GW_CLASS_ID} (server/index.js:5510)"}, "fullDescription": {"text": "`server/index.js:5510` calls `PUT https://walletobjects.googleapis.com/walletobjects/v1/loyaltyClass/${GW_CLASS_ID}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/walletobjects.googleapis.com/walletobjects/v1/loyaltyclass/<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-4066c3065f566690", "name": "Dangling fetch: POST https://walletobjects.googleapis.com/walletobjects/v1/loyaltyClass (server/index.js:5517)", "shortDescription": {"text": "Dangling fetch: POST https://walletobjects.googleapis.com/walletobjects/v1/loyaltyClass (server/index.js:5517)"}, "fullDescription": {"text": "`server/index.js:5517` calls `POST https://walletobjects.googleapis.com/walletobjects/v1/loyaltyClass` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/walletobjects.googleapis.com/walletobjects/v1/loyaltyclass`\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-ae0b443fa575604a", "name": "Dangling fetch: PUT https://walletobjects.googleapis.com/walletobjects/v1/loyaltyObject/${objectIdPath} (server/index.js", "shortDescription": {"text": "Dangling fetch: PUT https://walletobjects.googleapis.com/walletobjects/v1/loyaltyObject/${objectIdPath} (server/index.js:6575)"}, "fullDescription": {"text": "`server/index.js:6575` calls `PUT https://walletobjects.googleapis.com/walletobjects/v1/loyaltyObject/${objectIdPath}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/walletobjects.googleapis.com/walletobjects/v1/loyaltyobject/<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-89a0dd713e365d1d", "name": "Dangling fetch: POST https://walletobjects.googleapis.com/walletobjects/v1/loyaltyObject (server/index.js:6583)", "shortDescription": {"text": "Dangling fetch: POST https://walletobjects.googleapis.com/walletobjects/v1/loyaltyObject (server/index.js:6583)"}, "fullDescription": {"text": "`server/index.js:6583` calls `POST https://walletobjects.googleapis.com/walletobjects/v1/loyaltyObject` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/walletobjects.googleapis.com/walletobjects/v1/loyaltyobject`\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-9825cd609d0ba721", "name": "Dangling fetch: POST https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable&fields=id,webViewLink (server", "shortDescription": {"text": "Dangling fetch: POST https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable&fields=id,webViewLink (server/index.js:13513)"}, "fullDescription": {"text": "`server/index.js:13513` calls `POST https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable&fields=id,webViewLink` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/www.googleapis.com/upload/drive/v3/files`\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-f3fce90efd95022c", "name": "Dangling fetch: GET https://www.googleapis.com/drive/v3/files/${fileId}?fields=mimeType,size,name (server/index.js:13661", "shortDescription": {"text": "Dangling fetch: GET https://www.googleapis.com/drive/v3/files/${fileId}?fields=mimeType,size,name (server/index.js:13661)"}, "fullDescription": {"text": "`server/index.js:13661` calls `GET https://www.googleapis.com/drive/v3/files/${fileId}?fields=mimeType,size,name` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/www.googleapis.com/drive/v3/files/<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-d539b944bf6bf7c7", "name": "Dangling fetch: GET https://www.googleapis.com/drive/v3/files/${fileId}?alt=media (server/index.js:13689)", "shortDescription": {"text": "Dangling fetch: GET https://www.googleapis.com/drive/v3/files/${fileId}?alt=media (server/index.js:13689)"}, "fullDescription": {"text": "`server/index.js:13689` calls `GET https://www.googleapis.com/drive/v3/files/${fileId}?alt=media` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/www.googleapis.com/drive/v3/files/<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-0cca6a16738fabb8", "name": "Dangling fetch: GET https://www.googleapis.com/drive/v3/files/${fileId}?fields=mimeType,name (server/index.js:13750)", "shortDescription": {"text": "Dangling fetch: GET https://www.googleapis.com/drive/v3/files/${fileId}?fields=mimeType,name (server/index.js:13750)"}, "fullDescription": {"text": "`server/index.js:13750` calls `GET https://www.googleapis.com/drive/v3/files/${fileId}?fields=mimeType,name` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/www.googleapis.com/drive/v3/files/<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-cfbcc61353c496dd", "name": "Dangling fetch: GET https://www.googleapis.com/drive/v3/files/${fileId}?alt=media (server/index.js:13755)", "shortDescription": {"text": "Dangling fetch: GET https://www.googleapis.com/drive/v3/files/${fileId}?alt=media (server/index.js:13755)"}, "fullDescription": {"text": "`server/index.js:13755` calls `GET https://www.googleapis.com/drive/v3/files/${fileId}?alt=media` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/www.googleapis.com/drive/v3/files/<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-a5b3437e64c8f7b4", "name": "Unused endpoint: POST /api/auth/register", "shortDescription": {"text": "Unused endpoint: POST /api/auth/register"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/auth/register` 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-fd55aa0818a7c897", "name": "Unused endpoint: POST /api/auth/login", "shortDescription": {"text": "Unused endpoint: POST /api/auth/login"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/auth/login` 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-ee4aa5ddab88c9dc", "name": "Unused endpoint: GET /api/auth/me", "shortDescription": {"text": "Unused endpoint: GET /api/auth/me"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/auth/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-866cfadefccd0b5c", "name": "Unused endpoint: POST /api/auth/change-password", "shortDescription": {"text": "Unused endpoint: POST /api/auth/change-password"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/auth/change-password` 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-a4ecf0c7955aed91", "name": "Unused endpoint: POST /api/auth/onboarding", "shortDescription": {"text": "Unused endpoint: POST /api/auth/onboarding"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/auth/onboarding` 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-a0e81858fbfe443b", "name": "Unused endpoint: POST /api/auth/forgot-password", "shortDescription": {"text": "Unused endpoint: POST /api/auth/forgot-password"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/auth/forgot-password` 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-deb991b140ed4125", "name": "Unused endpoint: POST /api/auth/reset-password", "shortDescription": {"text": "Unused endpoint: POST /api/auth/reset-password"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/auth/reset-password` 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-885de0fa0133f6c0", "name": "Unused endpoint: GET /api/plans", "shortDescription": {"text": "Unused endpoint: GET /api/plans"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/plans` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-902a356d37818b2b", "name": "Unused endpoint: GET /api/memberships/my", "shortDescription": {"text": "Unused endpoint: GET /api/memberships/my"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/memberships/my` 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-8acf6987d525b12d", "name": "Unused endpoint: GET /api/memberships/mine/all", "shortDescription": {"text": "Unused endpoint: GET /api/memberships/mine/all"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/memberships/mine/all` 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-023a3aee2c2ce6e5", "name": "Unused endpoint: GET /api/classes", "shortDescription": {"text": "Unused endpoint: GET /api/classes"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/classes` 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-9c3fd3efcaa6ec77", "name": "Unused endpoint: GET /api/classes/:id", "shortDescription": {"text": "Unused endpoint: GET /api/classes/:id"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/classes/: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-24a36bca6abc33bc", "name": "Unused endpoint: GET /api/bookings/my-bookings", "shortDescription": {"text": "Unused endpoint: GET /api/bookings/my-bookings"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/bookings/my-bookings` 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-7f3d49025ef21d12", "name": "Unused endpoint: POST /api/admin/memberships/:id/grant-weekly-extra", "shortDescription": {"text": "Unused endpoint: POST /api/admin/memberships/:id/grant-weekly-extra"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/admin/memberships/:id/grant-weekly-extra` 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-ccee92d99dd470cf", "name": "Unused endpoint: GET /api/bookings/weekly-status", "shortDescription": {"text": "Unused endpoint: GET /api/bookings/weekly-status"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/bookings/weekly-status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-684d9de580f46fc1", "name": "Unused endpoint: POST /api/bookings", "shortDescription": {"text": "Unused endpoint: POST /api/bookings"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/bookings` 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-d008d6f686cdaf50", "name": "Unused endpoint: DELETE /api/bookings/:id", "shortDescription": {"text": "Unused endpoint: DELETE /api/bookings/:id"}, "fullDescription": {"text": "`server/index.js` declares `DELETE /api/bookings/: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-220ebcfbe1af356c", "name": "Unused endpoint: POST /api/reviews", "shortDescription": {"text": "Unused endpoint: POST /api/reviews"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/reviews` 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-32ad19b4c239d621", "name": "Unused endpoint: GET /api/orders", "shortDescription": {"text": "Unused endpoint: GET /api/orders"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/orders` 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-f30ebc28e4bf18b5", "name": "Unused endpoint: GET /api/orders/:id", "shortDescription": {"text": "Unused endpoint: GET /api/orders/:id"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/orders/: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-f1249fa282282c3c", "name": "Unused endpoint: POST /api/orders", "shortDescription": {"text": "Unused endpoint: POST /api/orders"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/orders` 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-5ec2254463cacaff", "name": "Unused endpoint: POST /api/orders/:id/proof", "shortDescription": {"text": "Unused endpoint: POST /api/orders/:id/proof"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/orders/:id/proof` 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-ab9317ba2ba508fb", "name": "Unused endpoint: POST /api/discount-codes/validate", "shortDescription": {"text": "Unused endpoint: POST /api/discount-codes/validate"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/discount-codes/validate` 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-71b2281f1d223f7e", "name": "Unused endpoint: GET /api/wallet/pass", "shortDescription": {"text": "Unused endpoint: GET /api/wallet/pass"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/wallet/pass` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-23f1a59463616a56", "name": "Unused endpoint: GET /api/me/rings", "shortDescription": {"text": "Unused endpoint: GET /api/me/rings"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/me/rings` 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-38037e899e4fcabe", "name": "Unused endpoint: GET /api/admin/notifications", "shortDescription": {"text": "Unused endpoint: GET /api/admin/notifications"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/admin/notifications` 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-edeb98f67ae29e46", "name": "Unused endpoint: POST /api/admin/notifications/mark-read", "shortDescription": {"text": "Unused endpoint: POST /api/admin/notifications/mark-read"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/admin/notifications/mark-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-c40ca83ab656fdaa", "name": "Unused endpoint: GET /api/admin/notifications/unread-count", "shortDescription": {"text": "Unused endpoint: GET /api/admin/notifications/unread-count"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/admin/notifications/unread-count` 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-5d1213678c196e64", "name": "Unused endpoint: GET /api/me/notifications", "shortDescription": {"text": "Unused endpoint: GET /api/me/notifications"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/me/notifications` 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-e37decf51dc3ad23", "name": "Unused endpoint: POST /api/me/notifications/mark-read", "shortDescription": {"text": "Unused endpoint: POST /api/me/notifications/mark-read"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/me/notifications/mark-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-03679a9a16055865", "name": "Unused endpoint: GET /api/me/notifications/unread-count", "shortDescription": {"text": "Unused endpoint: GET /api/me/notifications/unread-count"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/me/notifications/unread-count` 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-24dcc64c2519d65f", "name": "Unused endpoint: GET /api/me/video-access", "shortDescription": {"text": "Unused endpoint: GET /api/me/video-access"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/me/video-access` 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-76fe2a4f47f4ab91", "name": "Unused endpoint: GET /api/admin/rings/users/:id", "shortDescription": {"text": "Unused endpoint: GET /api/admin/rings/users/:id"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/admin/rings/users/: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-0b640b5ff94036be", "name": "Unused endpoint: POST /api/admin/rings/community-events", "shortDescription": {"text": "Unused endpoint: POST /api/admin/rings/community-events"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/admin/rings/community-events` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-743708a4a0b01377", "name": "Unused endpoint: GET /api/loyalty/my-history", "shortDescription": {"text": "Unused endpoint: GET /api/loyalty/my-history"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/loyalty/my-history` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e8c49279e4004824", "name": "Unused endpoint: GET /api/loyalty/rewards", "shortDescription": {"text": "Unused endpoint: GET /api/loyalty/rewards"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/loyalty/rewards` 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-697b8c07682332db", "name": "Unused endpoint: POST /api/loyalty/redeem", "shortDescription": {"text": "Unused endpoint: POST /api/loyalty/redeem"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/loyalty/redeem` 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-f744f2d25a4f6096", "name": "Unused endpoint: GET /api/wallet/google/save-url", "shortDescription": {"text": "Unused endpoint: GET /api/wallet/google/save-url"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/wallet/google/save-url` 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-5686ea8de192b64a", "name": "Unused endpoint: GET /api/wallet/events/google/save-url", "shortDescription": {"text": "Unused endpoint: GET /api/wallet/events/google/save-url"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/wallet/events/google/save-url` 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-9c61556fc9e64f1d", "name": "Unused endpoint: GET /api/wallet/google/diagnostics", "shortDescription": {"text": "Unused endpoint: GET /api/wallet/google/diagnostics"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/wallet/google/diagnostics` 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-c95603edeab89611", "name": "Unused endpoint: GET /api/wallet/apple/pkpass", "shortDescription": {"text": "Unused endpoint: GET /api/wallet/apple/pkpass"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/wallet/apple/pkpass` 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-d9e6cc64c640ec10", "name": "Unused endpoint: GET /api/wallet/events/apple/pkpass", "shortDescription": {"text": "Unused endpoint: GET /api/wallet/events/apple/pkpass"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/wallet/events/apple/pkpass` 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-701541a095c0dbce", "name": "Unused endpoint: GET /api/wallet/apple/status", "shortDescription": {"text": "Unused endpoint: GET /api/wallet/apple/status"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/wallet/apple/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b4b5cbb3d4666acf", "name": "Unused endpoint: GET /api/wallet/apple/debug", "shortDescription": {"text": "Unused endpoint: GET /api/wallet/apple/debug"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/wallet/apple/debug` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4ab6e7a6b3ed13cc", "name": "Unused endpoint: POST /api/wallet/v1/devices/:deviceId/registrations/:passTypeId/:serial", "shortDescription": {"text": "Unused endpoint: POST /api/wallet/v1/devices/:deviceId/registrations/:passTypeId/:serial"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/wallet/v1/devices/:deviceId/registrations/:passTypeId/:serial` 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-b48a4c1b78dd92de", "name": "Unused endpoint: GET /api/wallet/v1/devices/:deviceId/registrations/:passTypeId", "shortDescription": {"text": "Unused endpoint: GET /api/wallet/v1/devices/:deviceId/registrations/:passTypeId"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/wallet/v1/devices/:deviceId/registrations/:passTypeId` 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-148163d8bf1ace07", "name": "Unused endpoint: GET /api/wallet/v1/passes/:passTypeId/:serial", "shortDescription": {"text": "Unused endpoint: GET /api/wallet/v1/passes/:passTypeId/:serial"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/wallet/v1/passes/:passTypeId/:serial` 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-7c81229b79854540", "name": "Unused endpoint: DELETE /api/wallet/v1/devices/:deviceId/registrations/:passTypeId/:serial", "shortDescription": {"text": "Unused endpoint: DELETE /api/wallet/v1/devices/:deviceId/registrations/:passTypeId/:serial"}, "fullDescription": {"text": "`server/index.js` declares `DELETE /api/wallet/v1/devices/:deviceId/registrations/:passTypeId/:serial` 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-cdf6047f93b215b5", "name": "Unused endpoint: POST /api/wallet/v1/log", "shortDescription": {"text": "Unused endpoint: POST /api/wallet/v1/log"}, "fullDescription": {"text": "`server/index.js` declares `POST /api/wallet/v1/log` 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-18c49d3a27ecd9b5", "name": "Unused endpoint: GET /api/admin/wallet/notifications", "shortDescription": {"text": "Unused endpoint: GET /api/admin/wallet/notifications"}, "fullDescription": {"text": "`server/index.js` declares `GET /api/admin/wallet/notifications` 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/18769"}, "properties": {"repository": "said019/kala-Studio", "repoUrl": "https://github.com/said019/kala-Studio", "branch": "main"}, "results": [{"ruleId": "foundry_blueprint_gap", "level": "warning", "message": {"text": "Foundry mined blueprint gap alignment: said019/kala-Studio"}, "properties": {"repobilityId": 403518, "scanner": "foundry_dataset", "fingerprint": "cbfb1db79490ad5e0f75073be5546a8c60bc62fd3ccad5721ef4d70aa2575fef", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Human feedback aligned with blueprint or architecture gaps", "intent": "Curriculum-gap examples connecting issue threads to helicopter-view gaps.", "labels": {"bug_fix": 5, "api_or_backend": 1, "ui_or_frontend": 1, "api_integration_gap": 1, "mostly follows blueprint": 1, "claimed_resolved_unverified": 3, "issue_or_pull_request_thread": 1, "blueprint_human_gap_disagreement": 1, "human_reported_issue_then_fix_attempt": 1, "thread_has_human_issue_and_fix_context": 2}, "source": "graph_query_export", "motif_id": "blueprint_gap_alignment", "outcomes": {"claimed_resolved_unverified": 6}, "polarity": "mixed", "query_id": "blueprint_gap_alignment", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 26, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 1, "thread_has_comment": 1, "thread_touches_file": 2, "alignment_uses_comment": 1, "alignment_uses_finding": 1, "chain_has_link_quality": 4, "comment_aligns_finding": 1, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 2, "thread_has_comment_chain": 1, "comment_chain_links_commit": 5, "comment_chain_touches_file": 2, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 1}, "node_count": 19, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 1, "pr_file": 2, "alignment": 1, "fix_outcome": 1, "issue_chain": 1, "link_quality": 4, "comment_chain": 1, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "said019/kala-Studio#3", "issue_number": "3", "quality_tiers": {"assumption_check": 1, "weak_supervision": 3}, "repo_full_name": "said019/kala-Studio", "training_usage": "curriculum_gap", "source_motif_id": "graph-pattern-motif-thread-d688d86d90bd8c0b", "graph_gold_label": "weak_supervision_needs_review", "changed_file_labels": {"api_or_backend": 4, "ui_or_frontend": 4}}, "text": "Graph query export: Human feedback aligned with blueprint or architecture gaps\nQuery id: blueprint_gap_alignment\nQuery type: motif_query\nIntent: Curriculum-gap examples connecting issue threads to helicopter-view gaps.\nMotif: blueprint_gap_alignment\nTraining usage: curriculum_gap\nGraph gold label: weak_supervision_needs_review\nRepo: said019/kala-Studio\nThread: said019/kala-Studio#3\nEvidence:\nGraph motif: Human feedback aligns with blueprint or architecture gaps\nMotif id: blueprint_gap_alignment\nPolarity: mixed\nTraining usage: curriculum_gap\nSeverity: medium\nRepo: said019/kala-Studio\nThread: said019/kala-Studio#3\nGraph gold label: weak_supervision_needs_review\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: said019/kala-Studio#3\nRepo: said019/kala-Studio\nIssue/PR number: 3\nGraph consistency label: weak_supervision_needs_review\nNodes: 19\nEdges: 26\nNode types: {'commit': 5, 'link_quality': 4, 'pr_file': 2, 'thread': 1, 'repo': 1, 'comment': 1, 'comment_chain': 1, 'issue_chain': 1, 'fix_outcome': 1, 'alignment': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_links_commit': 5, 'chain_has_link_quality': 4, 'thread_touches_file': 2, 'comment_chain_touches_file': 2, 'issue_chain_touches_file': 2, 'repo_has_thread': 1, 'thread_has_comment': 1, 'thread_has_comment_chain': 1, 'comment_has_chain': 1, 'thread_has_issue_chain': 1, 'issue_chain_has_comment_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1, 'alignment_uses_comment': 1, 'alignment_uses_finding': 1, 'comment_aligns_finding': 1}\nLabels: {'bug_fix': 5, 'claimed_resolved_unverified': 3, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'api_integration_gap': 1, 'api_or_backend': 1, 'ui_or_frontend': 1, 'human_reported_issue_then_fix_attempt': 1, 'blueprint_human_gap_disagreement': 1, 'mostly follows blueprint': 1}\nOutcomes: {'claimed_resolved_unverified': 6}\nQuality tiers: {'weak_supervision': 3, 'assumption_check': 1}\nCI labels: {}\nCurriculum targets:\n- Use helicopter-view architecture/schema/design evidence beside issue threads.\n- Teach models to compare requested product class against implementation layers.\nAssumption checks:\n- Which blueprint layer is absent: frontend, API, data, auth, tests, or deployment?\n- Does human feedback confirm the same architectural gap?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/said019/kala-Studio", "source_id": "graph-query-motif_query-4838f04b853d9ce8", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/blueprint_gap_alignment/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "said019/kala-Studio", "source_dataset": "graph_queries/blueprint_gap_alignment", "training_usage": "curriculum_gap"}}}, {"ruleId": "foundry_blueprint_gap", "level": "warning", "message": {"text": "Foundry mined blueprint gap alignment: said019/kala-Studio"}, "properties": {"repobilityId": 403517, "scanner": "foundry_dataset", "fingerprint": "f4cafa67ee0bf8c338e2fafb816ce127df66aac089243f0b30df6ee1f9ee6ccb", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Human feedback aligned with blueprint or architecture gaps", "intent": "Curriculum-gap examples connecting issue threads to helicopter-view gaps.", "labels": {"bug_fix": 5, "api_or_backend": 2, "api_integration_gap": 1, "mostly follows blueprint": 1, "claimed_resolved_unverified": 3, "issue_or_pull_request_thread": 1, "blueprint_human_gap_disagreement": 1, "human_reported_issue_then_fix_attempt": 1, "thread_has_human_issue_and_fix_context": 2}, "source": "graph_query_export", "motif_id": "blueprint_gap_alignment", "outcomes": {"claimed_resolved_unverified": 6}, "polarity": "mixed", "query_id": "blueprint_gap_alignment", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 26, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 1, "thread_has_comment": 1, "thread_touches_file": 2, "alignment_uses_comment": 1, "alignment_uses_finding": 1, "chain_has_link_quality": 4, "comment_aligns_finding": 1, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 2, "thread_has_comment_chain": 1, "comment_chain_links_commit": 5, "comment_chain_touches_file": 2, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 1}, "node_count": 19, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 1, "pr_file": 2, "alignment": 1, "fix_outcome": 1, "issue_chain": 1, "link_quality": 4, "comment_chain": 1, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "said019/kala-Studio#2", "issue_number": "2", "quality_tiers": {"assumption_check": 1, "weak_supervision": 3}, "repo_full_name": "said019/kala-Studio", "training_usage": "curriculum_gap", "source_motif_id": "graph-pattern-motif-thread-1a617faa585127fa", "graph_gold_label": "weak_supervision_needs_review", "changed_file_labels": {"api_or_backend": 8}}, "text": "Graph query export: Human feedback aligned with blueprint or architecture gaps\nQuery id: blueprint_gap_alignment\nQuery type: motif_query\nIntent: Curriculum-gap examples connecting issue threads to helicopter-view gaps.\nMotif: blueprint_gap_alignment\nTraining usage: curriculum_gap\nGraph gold label: weak_supervision_needs_review\nRepo: said019/kala-Studio\nThread: said019/kala-Studio#2\nEvidence:\nGraph motif: Human feedback aligns with blueprint or architecture gaps\nMotif id: blueprint_gap_alignment\nPolarity: mixed\nTraining usage: curriculum_gap\nSeverity: medium\nRepo: said019/kala-Studio\nThread: said019/kala-Studio#2\nGraph gold label: weak_supervision_needs_review\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: said019/kala-Studio#2\nRepo: said019/kala-Studio\nIssue/PR number: 2\nGraph consistency label: weak_supervision_needs_review\nNodes: 19\nEdges: 26\nNode types: {'commit': 5, 'link_quality': 4, 'pr_file': 2, 'thread': 1, 'repo': 1, 'comment': 1, 'comment_chain': 1, 'issue_chain': 1, 'fix_outcome': 1, 'alignment': 1, 'blueprint_finding': 1}\nEdge types: {'comment_chain_links_commit': 5, 'chain_has_link_quality': 4, 'thread_touches_file': 2, 'comment_chain_touches_file': 2, 'issue_chain_touches_file': 2, 'repo_has_thread': 1, 'thread_has_comment': 1, 'thread_has_comment_chain': 1, 'comment_has_chain': 1, 'thread_has_issue_chain': 1, 'issue_chain_has_comment_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1, 'alignment_uses_comment': 1, 'alignment_uses_finding': 1, 'comment_aligns_finding': 1}\nLabels: {'bug_fix': 5, 'claimed_resolved_unverified': 3, 'api_or_backend': 2, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'api_integration_gap': 1, 'human_reported_issue_then_fix_attempt': 1, 'blueprint_human_gap_disagreement': 1, 'mostly follows blueprint': 1}\nOutcomes: {'claimed_resolved_unverified': 6}\nQuality tiers: {'weak_supervision': 3, 'assumption_check': 1}\nCI labels: {}\nCurriculum targets:\n- Use helicopter-view architecture/schema/design evidence beside issue threads.\n- Teach models to compare requested product class against implementation layers.\nAssumption checks:\n- Which blueprint layer is absent: frontend, API, data, auth, tests, or deployment?\n- Does human feedback confirm the same architectural gap?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/said019/kala-Studio", "source_id": "graph-query-motif_query-c82d28e26d909bae", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/blueprint_gap_alignment/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "said019/kala-Studio", "source_dataset": "graph_queries/blueprint_gap_alignment", "training_usage": "curriculum_gap"}}}, {"ruleId": "foundry_assumption_check", "level": "warning", "message": {"text": "Foundry mined assumption checks: said019/kala-Studio"}, "properties": {"repobilityId": 382020, "scanner": "foundry_dataset", "fingerprint": "6a6b9763ff21855d1a8aa843bd6db56fa1b9e8746d9483065c0833beae8c1f69", "category": "practices", "severity": "medium", "confidence": 0.62, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "comment_chain_pattern_product", "source": "comment_chain_pattern_miner", "product": "assumption_checks", "synthetic": false, "thread_key": "said019/kala-Studio#3", "human_labels": ["api_integration_gap", "api_or_backend", "ui_or_frontend"], "issue_number": "3", "thread_label": "thread_has_human_issue_and_fix_context", "outcome_label": "claimed_resolved_unverified", "source_backed": true, "max_confidence": 0.65, "repo_full_name": "said019/kala-Studio", "training_usage": "weak_supervision", "confidence_tier": "weak_supervision", "source_chain_id": "evidence-chain-issue_chain-57aeaa2030a48fcc", "helicopter_views": {"graphs": 2, "schemas": 2}, "artifact_families": {"ci": 1, "docs": 6, "designs": 1}, "source_chain_kind": "issue_chain", "changed_file_count": 2, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"api_or_backend": 1, "ui_or_frontend": 1}, "linked_commit_count": 5, "helicopter_view_count": 4, "source_artifact_count": 8, "classification_reasons": ["source_graph_has_real_artifacts", "source_graph_has_verification_artifacts", "repo_has_isolated_helicopter_views", "link_quality_weak_supervision", "high_risk_human_feedback_label"], "linked_ci_commit_count": 0, "verification_artifact_count": 1, "design_schema_api_artifact_count": 1}, "text": "Comment chain pattern product: assumption_checks\nRepo: said019/kala-Studio\nThread: said019/kala-Studio#3\nOutcome: claimed_resolved_unverified\nThread label: thread_has_human_issue_and_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_weak_supervision, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: said019/kala-Studio#3\nRepo: said019/kala-Studio\nThread label: thread_has_human_issue_and_fix_context\nOutcome: claimed_resolved_unverified\nComment count: 1\nLinked commit count: 5\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 2\nLabels: {'api_integration_gap': 1}\nPolarities: {'bad': 1}\nChanged file labels: {'api_or_backend': 1, 'ui_or_frontend': 1}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-fe9060bb6374f99a\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"api_integration_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/said019/kala-Studio/pull/3\",\n    \"text\": \"GitHub feedback: api_integration_gap\\nPolarity: bad\\nKind: pull_request_body\\nRepo: said019/kala-Studio\\nAuthor: said019 (User)\\nURL: https://github.com/said019/kala-Studio/pull/3\\nTitle: feat(admin): badge de acceso en lista de videos\\nBody:\\nCierra otro de los pendientes documentados (Spec \u00a73.2 \u2014 \\\\\\\"Lista de videos admin\\\\\\\").\\n\\n## Qu\u00e9 hace\\nCada card en `/admin/videos` ahora muestra de un vistazo c\u00f3mo est\u00e1 configurado el acceso:\\n\\n- **GRATIS** \u2014 videos gratuitos (`access_type` gratuito/free).\\n- **N planes** \u2014 para videos por planes; usa el conteo real de filas en `video_plans` para ese video (0 planes muestra como advertencia con \\\\\\\"0 planes\\\\\\\" en estilo outline).\\n- **+ venta \\\\$X** \u2014 cuando `sales_enabled` est\u00e1 activo, junto con el precio.\\n- Se mantienen los badges existentes: Borrador y \ud83c\udf81 Clase muestra.\\n\\n## Backend\\n`GET /api/videos` ya hac\u00eda un \u00fanico query agregado (v\u00edas a-e). Le a\u00f1ado una **sexta** subquery escalar: `(SELECT COUNT(*)::int FROM video_plans vp WHERE vp.video_id = v.id) AS plan_count`. Sin N+1, sin nuevo round-trip \u2014 solo un campo extra en el SELECT.\\n\\nPor consistencia, ahora el endpoint tambi\u00e9n devuelve `plan_count` en cada fila del response (\u00fatil para futuros consumidores).\\n\\n##\"\n  }\n]\nChanged files:\n[\n  {\n    \"id\": \"github-pr-file-file-3281ca9f1a296633\",\n    \"filename\": \"server/index.js\",\n    \"label\": \"api_or_backend\",\n    \"status\": \"modified\",\n    \"additions\": 6,\n    \"deletions\": 3,\n    \"changes\": 9,\n    \"blob_url\": \"https://github.com/said019/kala-Studio/blob/064e7a00c41d3bf1ac3ab28edadbd05b52d54384/server%2Findex.js\"\n  },\n  {\n    \"id\": \"github-pr-file-file-728a049e29a6bd10\",\n    \"filename\": \"src/pages/admin/videos/VideoList.tsx\",\n    \"label\": \"ui_or_frontend\",\n    \"status\": \"modified\",\n    \"additions\": 17,\n    \"deletions\": 5,\n    \"changes\": 22,\n    \"blob_url\": \"https://github.com/said019/kala-Studio/blob/064e7a00c41d3bf1ac3\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/said019/kala-Studio", "source_id": "comment-chain-pattern-assumption_checks-f31722c30100f8ec", "synthetic": false, "gold_label": "", "graph_label": "source_backed_multi_signal_graph", "source_path": "/data/distillate/foundry_data/comment_chain_patterns/assumption_checks/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "said019/kala-Studio", "source_dataset": "comment_chain_patterns/assumption_checks", "training_usage": "weak_supervision"}}}, {"ruleId": "foundry_assumption_check", "level": "warning", "message": {"text": "Foundry mined assumption checks: said019/kala-Studio"}, "properties": {"repobilityId": 382019, "scanner": "foundry_dataset", "fingerprint": "7713616b772d33fc93af678755030cfe19fbd6e90d0d2e225a3e86e1b07df1b1", "category": "practices", "severity": "medium", "confidence": 0.62, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "comment_chain_pattern_product", "source": "comment_chain_pattern_miner", "product": "assumption_checks", "synthetic": false, "thread_key": "said019/kala-Studio#2", "human_labels": ["api_integration_gap", "api_or_backend"], "issue_number": "2", "thread_label": "thread_has_human_issue_and_fix_context", "outcome_label": "claimed_resolved_unverified", "source_backed": true, "max_confidence": 0.65, "repo_full_name": "said019/kala-Studio", "training_usage": "weak_supervision", "confidence_tier": "weak_supervision", "source_chain_id": "evidence-chain-issue_chain-8281ba5b1b8e9f70", "helicopter_views": {"graphs": 2, "schemas": 2}, "artifact_families": {"ci": 1, "docs": 6, "designs": 1}, "source_chain_kind": "issue_chain", "changed_file_count": 2, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"api_or_backend": 2}, "linked_commit_count": 5, "helicopter_view_count": 4, "source_artifact_count": 8, "classification_reasons": ["source_graph_has_real_artifacts", "source_graph_has_verification_artifacts", "repo_has_isolated_helicopter_views", "link_quality_weak_supervision", "high_risk_human_feedback_label"], "linked_ci_commit_count": 0, "verification_artifact_count": 1, "design_schema_api_artifact_count": 1}, "text": "Comment chain pattern product: assumption_checks\nRepo: said019/kala-Studio\nThread: said019/kala-Studio#2\nOutcome: claimed_resolved_unverified\nThread label: thread_has_human_issue_and_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_weak_supervision, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: said019/kala-Studio#2\nRepo: said019/kala-Studio\nThread label: thread_has_human_issue_and_fix_context\nOutcome: claimed_resolved_unverified\nComment count: 1\nLinked commit count: 5\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 2\nLabels: {'api_integration_gap': 1}\nPolarities: {'bad': 1}\nChanged file labels: {'api_or_backend': 2}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-f322c3997932e048\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"api_integration_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/said019/kala-Studio/pull/2\",\n    \"text\": \"GitHub feedback: api_integration_gap\\nPolarity: bad\\nKind: pull_request_body\\nRepo: said019/kala-Studio\\nAuthor: said019 (User)\\nURL: https://github.com/said019/kala-Studio/pull/2\\nTitle: feat(videos): email a la clienta al aprobar compra individual\\nBody:\\nCierra uno de los pendientes documentados en la PR de per-video access (P3 del spec).\\n\\n## Qu\u00e9 hace\\n\\nTras `POST /api/videos/purchases/:id/approve` (admin marca compra como aprobada y setea `has_access=true`), se dispara un correo a la clienta avis\u00e1ndole que su video est\u00e1 desbloqueado.\\n\\n- **Nueva funci\u00f3n** `sendVideoPurchaseApproved` en `server/emailService.js` (mismo patr\u00f3n que `sendMembershipActivated` / `sendPasswordResetEmail`, layout branded, CTA al player del video).\\n- **Fire-and-forget** desde el handler: si Resend falla o el dominio no est\u00e1 verificado, el approve sigue exitoso y solo se loguea el error. No bloquea al admin.\\n- **Logging del 500** del handler que estaba silencioso (`console.error(\\\"POST /videos/purchases/:id/approve error:\\\", err);`).\\n\\n## Verificaci\u00f3n\\n- `node --check server/index.js` \u2705\\n- `node --check server/emailService.js` \u2705\\n- Cambio aditivo, sin alterar la l\u00f3gica del approve ni del rechazo.\\n\\n## Recordatorio operati\"\n  }\n]\nChanged files:\n[\n  {\n    \"id\": \"github-pr-file-file-8376743c26750dee\",\n    \"filename\": \"server/emailService.js\",\n    \"label\": \"api_or_backend\",\n    \"status\": \"modified\",\n    \"additions\": 35,\n    \"deletions\": 0,\n    \"changes\": 35,\n    \"blob_url\": \"https://github.com/said019/kala-Studio/blob/4550fbe13023bc4c6993f9d2636f743d63c3b3a3/server%2FemailService.js\"\n  },\n  {\n    \"id\": \"github-pr-file-file-6e9d18940e4754ba\",\n    \"filename\": \"server/index.js\",\n    \"label\": \"api_or_backend\",\n    \"status\": \"modified\",\n    \"additions\": 29,\n    \"deletions\": 2,\n    \"changes\": 31,\n    \"blob_url\": \"https://github.com/said019/kala-Studio/blob/4550fbe13023bc4c6993f9d2636f743d63c3b3a3/server%2Fin\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/said019/kala-Studio", "source_id": "comment-chain-pattern-assumption_checks-bf8934846221d2f2", "synthetic": false, "gold_label": "", "graph_label": "source_backed_multi_signal_graph", "source_path": "/data/distillate/foundry_data/comment_chain_patterns/assumption_checks/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "said019/kala-Studio", "source_dataset": "comment_chain_patterns/assumption_checks", "training_usage": "weak_supervision"}}}, {"ruleId": "foundry_assumption_check", "level": "warning", "message": {"text": "Foundry mined assumption checks: said019/kala-Studio"}, "properties": {"repobilityId": 382018, "scanner": "foundry_dataset", "fingerprint": "29b3c61a76d5a7698415c25fc415df036638c26906949662711f3a8aa5348315", "category": "practices", "severity": "medium", "confidence": 0.62, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "comment_chain_pattern_product", "source": "comment_chain_pattern_miner", "product": "assumption_checks", "synthetic": false, "thread_key": "said019/kala-Studio#1", "human_labels": ["api_or_backend", "docs_or_claims", "security_auth_secret", "source_or_other", "ui_or_frontend"], "issue_number": "1", "thread_label": "thread_has_human_issue_and_fix_context", "outcome_label": "claimed_resolved_unverified", "source_backed": true, "max_confidence": 0.65, "repo_full_name": "said019/kala-Studio", "training_usage": "weak_supervision", "confidence_tier": "weak_supervision", "source_chain_id": "evidence-chain-issue_chain-3bf5340ae6cd70e5", "helicopter_views": {"graphs": 2, "schemas": 2}, "artifact_families": {"ci": 1, "docs": 6, "designs": 1}, "source_chain_kind": "issue_chain", "changed_file_count": 15, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"api_or_backend": 1, "docs_or_claims": 2, "ui_or_frontend": 10, "source_or_other": 2}, "linked_commit_count": 5, "helicopter_view_count": 4, "source_artifact_count": 8, "classification_reasons": ["source_graph_has_real_artifacts", "source_graph_has_verification_artifacts", "repo_has_isolated_helicopter_views", "link_quality_weak_supervision", "high_risk_human_feedback_label"], "linked_ci_commit_count": 0, "verification_artifact_count": 1, "design_schema_api_artifact_count": 1}, "text": "Comment chain pattern product: assumption_checks\nRepo: said019/kala-Studio\nThread: said019/kala-Studio#1\nOutcome: claimed_resolved_unverified\nThread label: thread_has_human_issue_and_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_weak_supervision, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: said019/kala-Studio#1\nRepo: said019/kala-Studio\nThread label: thread_has_human_issue_and_fix_context\nOutcome: claimed_resolved_unverified\nComment count: 1\nLinked commit count: 5\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 15\nLabels: {'security_auth_secret': 1}\nPolarities: {'bad': 1}\nChanged file labels: {'docs_or_claims': 2, 'source_or_other': 2, 'api_or_backend': 1, 'ui_or_frontend': 10}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-1afd76717118cabc\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"security_auth_secret\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/said019/kala-Studio/pull/1\",\n    \"text\": \"GitHub feedback: security_auth_secret\\nPolarity: bad\\nKind: pull_request_body\\nRepo: said019/kala-Studio\\nAuthor: said019 (User)\\nURL: https://github.com/said019/kala-Studio/pull/1\\nTitle: feat: acceso a videos por plan + cuestionario de onboarding\\nBody:\\nEsta rama contiene **dos features** que viajaron juntas (no se separaron por decisi\u00f3n expl\u00edcita en el cierre).\\n\\n---\\n\\n## 1. Acceso a videos por plan (granular) + compra individual\\n\\nSpec: `docs/superpowers/specs/2026-05-18-per-video-plan-access-design.md`\\nPlan: `docs/superpowers/plans/2026-05-18-per-video-plan-access.md`\\n\\n**Modelo de acceso resultante:**\\n- Cada video: `gratuito` (cualquier alumna logueada) \u00f3 `miembros` (acceso por planes).\\n- Tabla nueva `video_plans(video_id, plan_id)` con `ON DELETE CASCADE`.\\n- `computeVideoAccessState(userId, videoId)` resuelve v\u00eda: free/trial \u2192 plan en `video_plans` \u2192 plan full-library (`includes_video_library`) \u2192 compra aprobada (`video_purchases.has_access`) \u2192 grant de cortes\u00eda \u2192 bloqueado.\\n- Estados: `free | unlocked | locked_purchasable | locked_plan_only`.\\n- **Cambio de comportamiento (\u00a77 del spec):** se elimina el requisito de grant manual obligatorio para acceso por plan. Alumnas con plan elegibl\"\n  }\n]\nChanged files:\n[\n  {\n    \"id\": \"github-pr-file-file-02759e08115d290a\",\n    \"filename\": \"docs/superpowers/plans/2026-05-18-per-video-plan-access.md\",\n    \"label\": \"docs_or_claims\",\n    \"status\": \"added\",\n    \"additions\": 1140,\n    \"deletions\": 0,\n    \"changes\": 1140,\n    \"blob_url\": \"https://github.com/said019/kala-Studio/blob/a0510ed3807c80bf73e99728b4ecaedf97a5a1ed/docs%2Fsuperpowers%2Fplans%2F2026-05-18-per-video-plan-access.md\"\n  },\n  {\n    \"id\": \"github-pr-file-file-d1273441e23cca72\",\n    \"filename\": \"docs/superpowers/specs/2026-05-18-per-video-plan-access-design.md\",\n    \"label\": \"docs_or_claims\",\n    \"st\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/said019/kala-Studio", "source_id": "comment-chain-pattern-assumption_checks-2aaf455f56808c5c", "synthetic": false, "gold_label": "", "graph_label": "source_backed_multi_signal_graph", "source_path": "/data/distillate/foundry_data/comment_chain_patterns/assumption_checks/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "said019/kala-Studio", "source_dataset": "comment_chain_patterns/assumption_checks", "training_usage": "weak_supervision"}}}, {"ruleId": "foundry_auth_guardrail_gap", "level": "error", "message": {"text": "Foundry mined security auth guardrail gaps: said019/kala-Studio"}, "properties": {"repobilityId": 414659, "scanner": "foundry_dataset", "fingerprint": "e9aedc7e1b33c4835228e31c39e72d73719d1f4c28143fe6a23d633dca70262d", "category": "auth", "severity": "critical", "confidence": 0.78, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Security/auth changes without enough guardrails", "intent": "Assumption-check security/auth examples requiring stronger tests or CI.", "labels": {"bug_fix": 4, "api_or_backend": 1, "docs_or_claims": 2, "ui_or_frontend": 10, "source_or_other": 2, "security_or_secrets": 1, "security_auth_secret": 1, "claimed_resolved_unverified": 3, "issue_or_pull_request_thread": 1, "human_reported_issue_then_fix_attempt": 1, "thread_has_human_issue_and_fix_context": 2}, "source": "graph_query_export", "motif_id": "security_auth_without_guardrails", "outcomes": {"claimed_resolved_unverified": 6}, "polarity": "bad", "query_id": "security_auth_guardrail_gaps", "severity": "critical", "ci_labels": {}, "synthetic": false, "edge_count": 55, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 1, "thread_has_comment": 1, "thread_touches_file": 15, "chain_has_link_quality": 3, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 12, "thread_has_comment_chain": 1, "comment_chain_links_commit": 5, "comment_chain_touches_file": 12, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 1}, "node_count": 29, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 1, "pr_file": 15, "fix_outcome": 1, "issue_chain": 1, "link_quality": 3, "comment_chain": 1}, "query_type": "motif_query", "thread_key": "said019/kala-Studio#1", "issue_number": "1", "quality_tiers": {"weak_supervision": 3}, "repo_full_name": "said019/kala-Studio", "training_usage": "assumption_check", "source_motif_id": "graph-pattern-motif-thread-b74de3b070305b3b", "graph_gold_label": "weak_supervision_needs_review", "changed_file_labels": {"api_or_backend": 4, "docs_or_claims": 8, "ui_or_frontend": 40, "source_or_other": 8}}, "text": "Graph query export: Security/auth changes without enough guardrails\nQuery id: security_auth_guardrail_gaps\nQuery type: motif_query\nIntent: Assumption-check security/auth examples requiring stronger tests or CI.\nMotif: security_auth_without_guardrails\nTraining usage: assumption_check\nGraph gold label: weak_supervision_needs_review\nRepo: said019/kala-Studio\nThread: said019/kala-Studio#1\nEvidence:\nGraph motif: Security/auth change without enough guardrails\nMotif id: security_auth_without_guardrails\nPolarity: bad\nTraining usage: assumption_check\nSeverity: critical\nRepo: said019/kala-Studio\nThread: said019/kala-Studio#1\nGraph gold label: weak_supervision_needs_review\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: said019/kala-Studio#1\nRepo: said019/kala-Studio\nIssue/PR number: 1\nGraph consistency label: weak_supervision_needs_review\nNodes: 29\nEdges: 55\nNode types: {'pr_file': 15, 'commit': 5, 'link_quality': 3, 'thread': 1, 'repo': 1, 'comment': 1, 'comment_chain': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'thread_touches_file': 15, 'comment_chain_touches_file': 12, 'issue_chain_touches_file': 12, 'comment_chain_links_commit': 5, 'chain_has_link_quality': 3, 'repo_has_thread': 1, 'thread_has_comment': 1, 'thread_has_comment_chain': 1, 'comment_has_chain': 1, 'thread_has_issue_chain': 1, 'issue_chain_has_comment_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'ui_or_frontend': 10, 'bug_fix': 4, 'claimed_resolved_unverified': 3, 'docs_or_claims': 2, 'source_or_other': 2, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'security_auth_secret': 1, 'api_or_backend': 1, 'human_reported_issue_then_fix_attempt': 1, 'security_or_secrets': 1}\nOutcomes: {'claimed_resolved_unverified': 6}\nQuality tiers: {'weak_supervision': 3}\nCI labels: {}\nCurriculum targets:\n- Train auth boundary repair with tests, permission matrices, and secret-handling checks.\n- Keep risky auth changes separate from ordinary bug-fix examples.\nAssumption checks:\n- Are auth/permission paths covered by tests?\n- Are secrets, CORS, or access rules verified rather than summarized?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/said019/kala-Studio", "source_id": "graph-query-motif_query-8dd6dd9cb614b38a", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/security_auth_guardrail_gaps/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "said019/kala-Studio", "source_dataset": "graph_queries/security_auth_guardrail_gaps", "training_usage": "assumption_check"}}}, {"ruleId": "scanner-8f9a1bb3ed239f13", "level": "note", "message": {"text": "Possibly dead Python function: replacer"}, "properties": {"repobilityId": "4c6d041d83cc4187", "scanner": "scanner-primary", "fingerprint": "8f9a1bb3ed239f13", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "endpoint-auditor/scripts/audit_runner.py:80"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9fba6778ef6e7764", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/emailService.js:173"}, "properties": {"repobilityId": "1841f571e3afc94a", "scanner": "scanner-primary", "fingerprint": "9fba6778ef6e7764", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0c8bae573b7f0a19", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 server/index.js:12898"}, "properties": {"repobilityId": "cececb9462220798", "scanner": "scanner-primary", "fingerprint": "0c8bae573b7f0a19", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-8955d177f342b86c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/index.js:768"}, "properties": {"repobilityId": "21e6b3de2b3dd856", "scanner": "scanner-primary", "fingerprint": "8955d177f342b86c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b209c77e83b119fd", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:70"}, "properties": {"repobilityId": "b8c68f17a4018107", "scanner": "scanner-primary", "fingerprint": "b209c77e83b119fd", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b8b5960f02291334", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/app/AppShell.tsx:188"}, "properties": {"repobilityId": "6e44bce649ff0ec6", "scanner": "scanner-primary", "fingerprint": "b8b5960f02291334", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-63bfeb437dd90bad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/AdminClasses.tsx:224"}, "properties": {"repobilityId": "350db511645b4d4d", "scanner": "scanner-primary", "fingerprint": "63bfeb437dd90bad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5f88c4237d6727bf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/AdminLayout.tsx:271"}, "properties": {"repobilityId": "57146b130cbbd3b5", "scanner": "scanner-primary", "fingerprint": "5f88c4237d6727bf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-07a419795e147328", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Index.tsx:494"}, "properties": {"repobilityId": "a77c7e7666e4073b", "scanner": "scanner-primary", "fingerprint": "07a419795e147328", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f46026d136bed5ff", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/client/Profile.tsx:85"}, "properties": {"repobilityId": "23a67951e627ffe9", "scanner": "scanner-primary", "fingerprint": "f46026d136bed5ff", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-720b919a5a8b5553", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/client/Events.tsx:145"}, "properties": {"repobilityId": "6122388b9d0d704f", "scanner": "scanner-primary", "fingerprint": "720b919a5a8b5553", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7f15dc47af5a5347", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/client/BookClasses.tsx:445"}, "properties": {"repobilityId": "359b6aa928d79bba", "scanner": "scanner-primary", "fingerprint": "7f15dc47af5a5347", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e85dbddfca56d6e6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/client/Wallet.tsx:248"}, "properties": {"repobilityId": "60b1560e0494fede", "scanner": "scanner-primary", "fingerprint": "e85dbddfca56d6e6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-240c97f038767b08", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/Dashboard.tsx:303"}, "properties": {"repobilityId": "5042987516ab7ad8", "scanner": "scanner-primary", "fingerprint": "240c97f038767b08", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ae4d000c2bd8ec8f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/settings/SettingsPage.tsx:437"}, "properties": {"repobilityId": "94c7500708636819", "scanner": "scanner-primary", "fingerprint": "ae4d000c2bd8ec8f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b9efaa9977bb5d0d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/notifications/AdminNotifications.tsx:162"}, "properties": {"repobilityId": "090955ccee1d494d", "scanner": "scanner-primary", "fingerprint": "b9efaa9977bb5d0d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-54502b85af0e77b3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/bookings/BookingsList.tsx:398"}, "properties": {"repobilityId": "f9935b2ae4165cf3", "scanner": "scanner-primary", "fingerprint": "54502b85af0e77b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8cd5aa8452daa7cf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/bookings/Waitlist.tsx:125"}, "properties": {"repobilityId": "cee5557ec8dca52a", "scanner": "scanner-primary", "fingerprint": "8cd5aa8452daa7cf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fa9fb29c2a36f4fb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/events/EventListView.tsx:143"}, "properties": {"repobilityId": "4b47de14b4ae0b3a", "scanner": "scanner-primary", "fingerprint": "fa9fb29c2a36f4fb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-448150dc5b8f9a8d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/events/EventDetailView.tsx:190"}, "properties": {"repobilityId": "d5fe2e84b7d7bf73", "scanner": "scanner-primary", "fingerprint": "448150dc5b8f9a8d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9806df015d9ab128", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/reviews/AdminReviewsDashboard.tsx:204"}, "properties": {"repobilityId": "412cb3901476a99a", "scanner": "scanner-primary", "fingerprint": "9806df015d9ab128", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-06d47c1806030752", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/classes/ClassesCalendar.tsx:489"}, "properties": {"repobilityId": "4651653c7adb6b75", "scanner": "scanner-primary", "fingerprint": "06d47c1806030752", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-40f0b5ef6621cf30", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/whatsapp/WhatsAppTemplatesPage.tsx:180"}, "properties": {"repobilityId": "7069505d69f9c4f5", "scanner": "scanner-primary", "fingerprint": "40f0b5ef6621cf30", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2d1a477aa634e973", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/videos/VideoList.tsx:128"}, "properties": {"repobilityId": "71ff8c25ba4371e9", "scanner": "scanner-primary", "fingerprint": "2d1a477aa634e973", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84a5715afdbc6544", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/payments/PaymentsPage.tsx:164"}, "properties": {"repobilityId": "0a6b6d8223cc73fb", "scanner": "scanner-primary", "fingerprint": "84a5715afdbc6544", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-86cd278e26e71a8d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/campaigns/CampaignsPage.tsx:308"}, "properties": {"repobilityId": "01e4af10153f8903", "scanner": "scanner-primary", "fingerprint": "86cd278e26e71a8d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-35ffd26d8efec4b7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/pos/POSPage.tsx:213"}, "properties": {"repobilityId": "ac237a1250964c0a", "scanner": "scanner-primary", "fingerprint": "35ffd26d8efec4b7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7b9fd1cabbbe742f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/reports/ReportsPage.tsx:225"}, "properties": {"repobilityId": "21c14b22f8905ee7", "scanner": "scanner-primary", "fingerprint": "7b9fd1cabbbe742f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dba19fa8e055646d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in server/index.js:17"}, "properties": {"repobilityId": "52d97e67169cf06a", "scanner": "scanner-primary", "fingerprint": "dba19fa8e055646d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/index.js"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-a941bb17e37a903c", "level": "error", "message": {"text": "Insecure pattern 'private_key_in_repo' in server/index.js:5436"}, "properties": {"repobilityId": "cf066178e25f390a", "scanner": "scanner-primary", "fingerprint": "a941bb17e37a903c", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["owasp", "private_key_in_repo"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/index.js"}, "region": {"startLine": 5436}}}]}, {"ruleId": "scanner-999b53b6384094aa", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in endpoint-auditor/SKILL.md:113"}, "properties": {"repobilityId": "ffc89f82b915b2ca", "scanner": "scanner-primary", "fingerprint": "999b53b6384094aa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "endpoint-auditor/SKILL.md"}, "region": {"startLine": 113}}}]}, {"ruleId": "scanner-3d27a5c341535475", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in endpoint-auditor/scripts/audit_runner.py:232"}, "properties": {"repobilityId": "46aa4624d08f44e6", "scanner": "scanner-primary", "fingerprint": "3d27a5c341535475", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "endpoint-auditor/scripts/audit_runner.py"}, "region": {"startLine": 232}}}]}, {"ruleId": "scanner-35b6f9da7d80b9ea", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in src/stores/authStore.ts:80"}, "properties": {"repobilityId": "f58bec1be691e69f", "scanner": "scanner-primary", "fingerprint": "35b6f9da7d80b9ea", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/stores/authStore.ts"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-93d0283845aa2c2d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:70"}, "properties": {"repobilityId": "33f10636e53b4298", "scanner": "scanner-primary", "fingerprint": "93d0283845aa2c2d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ui/chart.tsx"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-fbbc0154f9fad6cc", "level": "note", "message": {"text": "Very large file: server/index.js (17595 lines)"}, "properties": {"repobilityId": "4d84f5062adc96c0", "scanner": "scanner-primary", "fingerprint": "fbbc0154f9fad6cc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6bc6f54e72bcab41", "level": "note", "message": {"text": "Very large file: src/pages/Index.tsx (2039 lines)"}, "properties": {"repobilityId": "6a73aa3f908d926b", "scanner": "scanner-primary", "fingerprint": "6bc6f54e72bcab41", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0f39e66fc4b09b7f", "level": "note", "message": {"text": "Very large file: src/pages/admin/classes/ClassesCalendar.tsx (1805 lines)"}, "properties": {"repobilityId": "4534698e4df66fbb", "scanner": "scanner-primary", "fingerprint": "0f39e66fc4b09b7f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "aa7e85d71d7fbbee", "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": "682d95f056f3f3b0", "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": "599303b5ae6b8700", "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": "1e11babd6b101b57", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "0d86128b6a44ff6c", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "7d02327db3f0d94e", "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": "96802753266d3c99", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-d4ada9076acbdf7f", "level": "note", "message": {"text": "Legacy-named symbol `admin_phones_seed_v1` in server/index.js:1715"}, "properties": {"repobilityId": "e75f11c153891a4b", "scanner": "scanner-primary", "fingerprint": "d4ada9076acbdf7f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0e2aecc8b70bd75a", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/index.js:404"}, "properties": {"repobilityId": "97052619f2af10d4", "scanner": "scanner-primary", "fingerprint": "0e2aecc8b70bd75a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df8a134b843fdeb4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/index.js:13415"}, "properties": {"repobilityId": "a48456ea681d1137", "scanner": "scanner-primary", "fingerprint": "df8a134b843fdeb4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bafb38f2c9a4a2a1", "level": "none", "message": {"text": "Commented-code block (5 lines) in endpoint-auditor/audit/db-mutating-test.mjs:1"}, "properties": {"repobilityId": "faed4f06e38e808d", "scanner": "scanner-primary", "fingerprint": "bafb38f2c9a4a2a1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2cb01e3261fdcf5", "level": "none", "message": {"text": "Commented-code block (5 lines) in endpoint-auditor/audit/smoke-test-puts.mjs:1"}, "properties": {"repobilityId": "8a72e2415ef4ab14", "scanner": "scanner-primary", "fingerprint": "e2cb01e3261fdcf5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-52405aff5f0cb80b", "level": "note", "message": {"text": "Legacy-named symbol `kala_video_upload_v1` in src/pages/admin/videos/VideoUpload.tsx:63"}, "properties": {"repobilityId": "2fdafb74b59e4b88", "scanner": "scanner-primary", "fingerprint": "52405aff5f0cb80b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8a59c26f5bc8898f", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/admin/videos/VideoUpload.tsx:258"}, "properties": {"repobilityId": "341eac0cf9bed8eb", "scanner": "scanner-primary", "fingerprint": "8a59c26f5bc8898f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ac6ce0e6d1dca97a", "level": "note", "message": {"text": "61 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d9bf04d375a56cee", "scanner": "scanner-primary", "fingerprint": "ac6ce0e6d1dca97a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "864f2d505f60ef20", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-d674fedc105a40b0", "level": "warning", "message": {"text": "Frontend route `/auth/reset-password` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "116aac37056e74db", "scanner": "scanner-primary", "fingerprint": "d674fedc105a40b0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-25d0c5669cd9b822", "level": "warning", "message": {"text": "Frontend route `/auth` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "8051efe6684ef8a6", "scanner": "scanner-primary", "fingerprint": "25d0c5669cd9b822", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-04c0a1a33008053e", "level": "warning", "message": {"text": "Frontend route `/app/classes/:classId` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "177c7a69f2fbda63", "scanner": "scanner-primary", "fingerprint": "04c0a1a33008053e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e33f663923aa78b7", "level": "warning", "message": {"text": "Frontend route `/app/orders/:orderId` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "69bc509fbd0703f0", "scanner": "scanner-primary", "fingerprint": "e33f663923aa78b7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a4fd0e46f8a681fb", "level": "warning", "message": {"text": "Frontend route `/app/videos/:videoId` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "9a865457d1650683", "scanner": "scanner-primary", "fingerprint": "a4fd0e46f8a681fb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3d47341344301241", "level": "warning", "message": {"text": "Frontend route `/admin` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "3060fc2a800f6a3c", "scanner": "scanner-primary", "fingerprint": "3d47341344301241", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2f23980be8e712d7", "level": "warning", "message": {"text": "Frontend route `/admin/clients/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "532c0a394ee803c8", "scanner": "scanner-primary", "fingerprint": "2f23980be8e712d7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-eab4409ce16248d5", "level": "warning", "message": {"text": "Frontend route `/admin/classes/types` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "c3989435fef50282", "scanner": "scanner-primary", "fingerprint": "eab4409ce16248d5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2555c1c1d105c946", "level": "warning", "message": {"text": "Frontend route `/admin/classes/generate` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "c65a9fb2055d2d6e", "scanner": "scanner-primary", "fingerprint": "2555c1c1d105c946", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-67a73c5575fcd908", "level": "warning", "message": {"text": "Frontend route `/admin/schedules` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "fa4e8fb764d9c194", "scanner": "scanner-primary", "fingerprint": "67a73c5575fcd908", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-30c59f0fa7d1d511", "level": "warning", "message": {"text": "Frontend route `/admin/bookings/waitlist` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "55d02733205287ef", "scanner": "scanner-primary", "fingerprint": "30c59f0fa7d1d511", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b13c10bee7b6459f", "level": "warning", "message": {"text": "Frontend route `/admin/referrals` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "ead94d211dd92ffb", "scanner": "scanner-primary", "fingerprint": "b13c10bee7b6459f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6d9662c295ffcb6c", "level": "warning", "message": {"text": "Frontend route `/admin/videos/ventas` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "3490b7ea8d4916da", "scanner": "scanner-primary", "fingerprint": "6d9662c295ffcb6c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5f70be6430ca7009", "level": "warning", "message": {"text": "Frontend route `/admin/reviews` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "b6ea7092a1dc0d9b", "scanner": "scanner-primary", "fingerprint": "5f70be6430ca7009", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-516109338c29be18", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (server/index.js:13415)"}, "properties": {"repobilityId": "8629d2e62da216f2", "scanner": "scanner-primary", "fingerprint": "516109338c29be18", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-495618054705096e", "level": "error", "message": {"text": "Dangling fetch: POST https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&fields=id (server/index.js:13439)"}, "properties": {"repobilityId": "66d8bc7953937587", "scanner": "scanner-primary", "fingerprint": "495618054705096e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bd7fd18e047cecd7", "level": "error", "message": {"text": "Dangling fetch: POST https://www.googleapis.com/drive/v3/files/${uploadJson.id}/permissions (server/index.js:13448)"}, "properties": {"repobilityId": "775e7efeaa8ebe3a", "scanner": "scanner-primary", "fingerprint": "bd7fd18e047cecd7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-04fcb6612714d6c7", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (server/index.js:16110)"}, "properties": {"repobilityId": "bfc04f09efb75cd0", "scanner": "scanner-primary", "fingerprint": "04fcb6612714d6c7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0c3ada4272372b2d", "level": "error", "message": {"text": "Dangling fetch: POST https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&fields=id (server/index.js:16133)"}, "properties": {"repobilityId": "4e63b742a6f59287", "scanner": "scanner-primary", "fingerprint": "0c3ada4272372b2d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e97d025f32dc3950", "level": "error", "message": {"text": "Dangling fetch: POST https://www.googleapis.com/drive/v3/files/${uploadJson.id}/permissions (server/index.js:16141)"}, "properties": {"repobilityId": "5d21f3ce3e43f693", "scanner": "scanner-primary", "fingerprint": "e97d025f32dc3950", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-804ed3c88808741e", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (server/index.js:422)"}, "properties": {"repobilityId": "8f2143633e6183d6", "scanner": "scanner-primary", "fingerprint": "804ed3c88808741e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-b1489a44c704bbe7", "level": "error", "message": {"text": "Dangling fetch: POST https://www.googleapis.com/drive/v3/files/${fileId}/permissions (server/index.js:432)"}, "properties": {"repobilityId": "b7351afeb6ad2fe0", "scanner": "scanner-primary", "fingerprint": "b1489a44c704bbe7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-d79703384afe48b6", "level": "error", "message": {"text": "Dangling fetch: POST https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&fields=id,webViewLink (server/index.js:471)"}, "properties": {"repobilityId": "fa4b378edd8676e2", "scanner": "scanner-primary", "fingerprint": "d79703384afe48b6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-83bb5064ec46a3fc", "level": "error", "message": {"text": "Dangling fetch: POST https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable&fields=id,webViewLink (server/index.js:494)"}, "properties": {"repobilityId": "2fba112705ae36e3", "scanner": "scanner-primary", "fingerprint": "83bb5064ec46a3fc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-6339b44de3ed7d1e", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (server/index.js:5473)"}, "properties": {"repobilityId": "f3af4c8ac82139fb", "scanner": "scanner-primary", "fingerprint": "6339b44de3ed7d1e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-2d2202c0c148597a", "level": "error", "message": {"text": "Dangling fetch: GET https://walletobjects.googleapis.com/walletobjects/v1/loyaltyClass/${GW_CLASS_ID} (server/index.js:5506)"}, "properties": {"repobilityId": "2eb95760c42e3241", "scanner": "scanner-primary", "fingerprint": "2d2202c0c148597a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-be7e4035508490c4", "level": "error", "message": {"text": "Dangling fetch: PUT https://walletobjects.googleapis.com/walletobjects/v1/loyaltyClass/${GW_CLASS_ID} (server/index.js:5510)"}, "properties": {"repobilityId": "ffb2a676504346f8", "scanner": "scanner-primary", "fingerprint": "be7e4035508490c4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-4066c3065f566690", "level": "error", "message": {"text": "Dangling fetch: POST https://walletobjects.googleapis.com/walletobjects/v1/loyaltyClass (server/index.js:5517)"}, "properties": {"repobilityId": "ae74403a7e1ba65c", "scanner": "scanner-primary", "fingerprint": "4066c3065f566690", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-ae0b443fa575604a", "level": "error", "message": {"text": "Dangling fetch: PUT https://walletobjects.googleapis.com/walletobjects/v1/loyaltyObject/${objectIdPath} (server/index.js:6575)"}, "properties": {"repobilityId": "a8428b87cc666dd2", "scanner": "scanner-primary", "fingerprint": "ae0b443fa575604a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-89a0dd713e365d1d", "level": "error", "message": {"text": "Dangling fetch: POST https://walletobjects.googleapis.com/walletobjects/v1/loyaltyObject (server/index.js:6583)"}, "properties": {"repobilityId": "f4856983e74f488b", "scanner": "scanner-primary", "fingerprint": "89a0dd713e365d1d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-9825cd609d0ba721", "level": "error", "message": {"text": "Dangling fetch: POST https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable&fields=id,webViewLink (server/index.js:13513)"}, "properties": {"repobilityId": "6b5355a2ecbddc1b", "scanner": "scanner-primary", "fingerprint": "9825cd609d0ba721", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-f3fce90efd95022c", "level": "error", "message": {"text": "Dangling fetch: GET https://www.googleapis.com/drive/v3/files/${fileId}?fields=mimeType,size,name (server/index.js:13661)"}, "properties": {"repobilityId": "50e993ae690beb0d", "scanner": "scanner-primary", "fingerprint": "f3fce90efd95022c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-d539b944bf6bf7c7", "level": "error", "message": {"text": "Dangling fetch: GET https://www.googleapis.com/drive/v3/files/${fileId}?alt=media (server/index.js:13689)"}, "properties": {"repobilityId": "ff8374e11753e1cf", "scanner": "scanner-primary", "fingerprint": "d539b944bf6bf7c7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-0cca6a16738fabb8", "level": "error", "message": {"text": "Dangling fetch: GET https://www.googleapis.com/drive/v3/files/${fileId}?fields=mimeType,name (server/index.js:13750)"}, "properties": {"repobilityId": "4e0e78568d4bb6d3", "scanner": "scanner-primary", "fingerprint": "0cca6a16738fabb8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-cfbcc61353c496dd", "level": "error", "message": {"text": "Dangling fetch: GET https://www.googleapis.com/drive/v3/files/${fileId}?alt=media (server/index.js:13755)"}, "properties": {"repobilityId": "9d772d1d2810cc24", "scanner": "scanner-primary", "fingerprint": "cfbcc61353c496dd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-a5b3437e64c8f7b4", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/register"}, "properties": {"repobilityId": "b92a40530b64fc62", "scanner": "scanner-primary", "fingerprint": "a5b3437e64c8f7b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd55aa0818a7c897", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/login"}, "properties": {"repobilityId": "1e07cb6fd97e2c6a", "scanner": "scanner-primary", "fingerprint": "fd55aa0818a7c897", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ee4aa5ddab88c9dc", "level": "note", "message": {"text": "Unused endpoint: GET /api/auth/me"}, "properties": {"repobilityId": "1a2f9cc705beecf7", "scanner": "scanner-primary", "fingerprint": "ee4aa5ddab88c9dc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-866cfadefccd0b5c", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/change-password"}, "properties": {"repobilityId": "1b12a267ce647313", "scanner": "scanner-primary", "fingerprint": "866cfadefccd0b5c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a4ecf0c7955aed91", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/onboarding"}, "properties": {"repobilityId": "558336b6ee258f9f", "scanner": "scanner-primary", "fingerprint": "a4ecf0c7955aed91", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a0e81858fbfe443b", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/forgot-password"}, "properties": {"repobilityId": "8a762fc20561f27f", "scanner": "scanner-primary", "fingerprint": "a0e81858fbfe443b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-deb991b140ed4125", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/reset-password"}, "properties": {"repobilityId": "c9942daa15a31b6e", "scanner": "scanner-primary", "fingerprint": "deb991b140ed4125", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-885de0fa0133f6c0", "level": "note", "message": {"text": "Unused endpoint: GET /api/plans"}, "properties": {"repobilityId": "8993e1877201b99d", "scanner": "scanner-primary", "fingerprint": "885de0fa0133f6c0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-902a356d37818b2b", "level": "note", "message": {"text": "Unused endpoint: GET /api/memberships/my"}, "properties": {"repobilityId": "0e90ed6d02c52cdd", "scanner": "scanner-primary", "fingerprint": "902a356d37818b2b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8acf6987d525b12d", "level": "note", "message": {"text": "Unused endpoint: GET /api/memberships/mine/all"}, "properties": {"repobilityId": "e5aeeb1f0a98ae88", "scanner": "scanner-primary", "fingerprint": "8acf6987d525b12d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-023a3aee2c2ce6e5", "level": "note", "message": {"text": "Unused endpoint: GET /api/classes"}, "properties": {"repobilityId": "952d3923241cfbcf", "scanner": "scanner-primary", "fingerprint": "023a3aee2c2ce6e5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9c3fd3efcaa6ec77", "level": "note", "message": {"text": "Unused endpoint: GET /api/classes/:id"}, "properties": {"repobilityId": "899724ed0fd5f940", "scanner": "scanner-primary", "fingerprint": "9c3fd3efcaa6ec77", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-24a36bca6abc33bc", "level": "note", "message": {"text": "Unused endpoint: GET /api/bookings/my-bookings"}, "properties": {"repobilityId": "91a1d008c47a5fe5", "scanner": "scanner-primary", "fingerprint": "24a36bca6abc33bc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7f3d49025ef21d12", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/memberships/:id/grant-weekly-extra"}, "properties": {"repobilityId": "77d74542526fb261", "scanner": "scanner-primary", "fingerprint": "7f3d49025ef21d12", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ccee92d99dd470cf", "level": "note", "message": {"text": "Unused endpoint: GET /api/bookings/weekly-status"}, "properties": {"repobilityId": "53fd15f8c0bddfa0", "scanner": "scanner-primary", "fingerprint": "ccee92d99dd470cf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-684d9de580f46fc1", "level": "note", "message": {"text": "Unused endpoint: POST /api/bookings"}, "properties": {"repobilityId": "b8f8eb536348a9f9", "scanner": "scanner-primary", "fingerprint": "684d9de580f46fc1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d008d6f686cdaf50", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/bookings/:id"}, "properties": {"repobilityId": "14dd0b3dbf7674e1", "scanner": "scanner-primary", "fingerprint": "d008d6f686cdaf50", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-220ebcfbe1af356c", "level": "note", "message": {"text": "Unused endpoint: POST /api/reviews"}, "properties": {"repobilityId": "767ee2f9df94af2c", "scanner": "scanner-primary", "fingerprint": "220ebcfbe1af356c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-32ad19b4c239d621", "level": "note", "message": {"text": "Unused endpoint: GET /api/orders"}, "properties": {"repobilityId": "ddac238bb7e05c32", "scanner": "scanner-primary", "fingerprint": "32ad19b4c239d621", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f30ebc28e4bf18b5", "level": "note", "message": {"text": "Unused endpoint: GET /api/orders/:id"}, "properties": {"repobilityId": "11d44d2d954dac0f", "scanner": "scanner-primary", "fingerprint": "f30ebc28e4bf18b5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f1249fa282282c3c", "level": "note", "message": {"text": "Unused endpoint: POST /api/orders"}, "properties": {"repobilityId": "7c70d481059623e2", "scanner": "scanner-primary", "fingerprint": "f1249fa282282c3c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5ec2254463cacaff", "level": "note", "message": {"text": "Unused endpoint: POST /api/orders/:id/proof"}, "properties": {"repobilityId": "decc4735b65d0961", "scanner": "scanner-primary", "fingerprint": "5ec2254463cacaff", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ab9317ba2ba508fb", "level": "note", "message": {"text": "Unused endpoint: POST /api/discount-codes/validate"}, "properties": {"repobilityId": "a94dbf5325a56575", "scanner": "scanner-primary", "fingerprint": "ab9317ba2ba508fb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-71b2281f1d223f7e", "level": "note", "message": {"text": "Unused endpoint: GET /api/wallet/pass"}, "properties": {"repobilityId": "1a72be71a98508d5", "scanner": "scanner-primary", "fingerprint": "71b2281f1d223f7e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-23f1a59463616a56", "level": "note", "message": {"text": "Unused endpoint: GET /api/me/rings"}, "properties": {"repobilityId": "b6f226c5db97abff", "scanner": "scanner-primary", "fingerprint": "23f1a59463616a56", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-38037e899e4fcabe", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/notifications"}, "properties": {"repobilityId": "dd8d5c22f8469d3e", "scanner": "scanner-primary", "fingerprint": "38037e899e4fcabe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-edeb98f67ae29e46", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/notifications/mark-read"}, "properties": {"repobilityId": "37e00e0656944b2b", "scanner": "scanner-primary", "fingerprint": "edeb98f67ae29e46", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c40ca83ab656fdaa", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/notifications/unread-count"}, "properties": {"repobilityId": "b0038e98bf67940b", "scanner": "scanner-primary", "fingerprint": "c40ca83ab656fdaa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5d1213678c196e64", "level": "note", "message": {"text": "Unused endpoint: GET /api/me/notifications"}, "properties": {"repobilityId": "72837fb776bdea6d", "scanner": "scanner-primary", "fingerprint": "5d1213678c196e64", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e37decf51dc3ad23", "level": "note", "message": {"text": "Unused endpoint: POST /api/me/notifications/mark-read"}, "properties": {"repobilityId": "ca18918d824cb541", "scanner": "scanner-primary", "fingerprint": "e37decf51dc3ad23", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-03679a9a16055865", "level": "note", "message": {"text": "Unused endpoint: GET /api/me/notifications/unread-count"}, "properties": {"repobilityId": "d7b0182a536e4811", "scanner": "scanner-primary", "fingerprint": "03679a9a16055865", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-24dcc64c2519d65f", "level": "note", "message": {"text": "Unused endpoint: GET /api/me/video-access"}, "properties": {"repobilityId": "4bec48f3e45f096f", "scanner": "scanner-primary", "fingerprint": "24dcc64c2519d65f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-76fe2a4f47f4ab91", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/rings/users/:id"}, "properties": {"repobilityId": "48e44edbfbcdb890", "scanner": "scanner-primary", "fingerprint": "76fe2a4f47f4ab91", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0b640b5ff94036be", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/rings/community-events"}, "properties": {"repobilityId": "22653b2e13a17801", "scanner": "scanner-primary", "fingerprint": "0b640b5ff94036be", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-743708a4a0b01377", "level": "note", "message": {"text": "Unused endpoint: GET /api/loyalty/my-history"}, "properties": {"repobilityId": "c71fecaa6f41410e", "scanner": "scanner-primary", "fingerprint": "743708a4a0b01377", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e8c49279e4004824", "level": "note", "message": {"text": "Unused endpoint: GET /api/loyalty/rewards"}, "properties": {"repobilityId": "6a87280a37191d03", "scanner": "scanner-primary", "fingerprint": "e8c49279e4004824", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-697b8c07682332db", "level": "note", "message": {"text": "Unused endpoint: POST /api/loyalty/redeem"}, "properties": {"repobilityId": "efad30dec6305624", "scanner": "scanner-primary", "fingerprint": "697b8c07682332db", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f744f2d25a4f6096", "level": "note", "message": {"text": "Unused endpoint: GET /api/wallet/google/save-url"}, "properties": {"repobilityId": "dc8bc0cfef9fd007", "scanner": "scanner-primary", "fingerprint": "f744f2d25a4f6096", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5686ea8de192b64a", "level": "note", "message": {"text": "Unused endpoint: GET /api/wallet/events/google/save-url"}, "properties": {"repobilityId": "9cd73baca87007f7", "scanner": "scanner-primary", "fingerprint": "5686ea8de192b64a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9c61556fc9e64f1d", "level": "note", "message": {"text": "Unused endpoint: GET /api/wallet/google/diagnostics"}, "properties": {"repobilityId": "04bf7c01b244ebe2", "scanner": "scanner-primary", "fingerprint": "9c61556fc9e64f1d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c95603edeab89611", "level": "note", "message": {"text": "Unused endpoint: GET /api/wallet/apple/pkpass"}, "properties": {"repobilityId": "915f4b44c90ce9cb", "scanner": "scanner-primary", "fingerprint": "c95603edeab89611", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d9e6cc64c640ec10", "level": "note", "message": {"text": "Unused endpoint: GET /api/wallet/events/apple/pkpass"}, "properties": {"repobilityId": "85a2b988a3c3fe95", "scanner": "scanner-primary", "fingerprint": "d9e6cc64c640ec10", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-701541a095c0dbce", "level": "note", "message": {"text": "Unused endpoint: GET /api/wallet/apple/status"}, "properties": {"repobilityId": "e516a6bdd42a5fb8", "scanner": "scanner-primary", "fingerprint": "701541a095c0dbce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b4b5cbb3d4666acf", "level": "note", "message": {"text": "Unused endpoint: GET /api/wallet/apple/debug"}, "properties": {"repobilityId": "ce687d05116cf252", "scanner": "scanner-primary", "fingerprint": "b4b5cbb3d4666acf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4ab6e7a6b3ed13cc", "level": "note", "message": {"text": "Unused endpoint: POST /api/wallet/v1/devices/:deviceId/registrations/:passTypeId/:serial"}, "properties": {"repobilityId": "d3beb475498a3d4d", "scanner": "scanner-primary", "fingerprint": "4ab6e7a6b3ed13cc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b48a4c1b78dd92de", "level": "note", "message": {"text": "Unused endpoint: GET /api/wallet/v1/devices/:deviceId/registrations/:passTypeId"}, "properties": {"repobilityId": "8d0590347a9996ed", "scanner": "scanner-primary", "fingerprint": "b48a4c1b78dd92de", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-148163d8bf1ace07", "level": "note", "message": {"text": "Unused endpoint: GET /api/wallet/v1/passes/:passTypeId/:serial"}, "properties": {"repobilityId": "bc63a225df4bc119", "scanner": "scanner-primary", "fingerprint": "148163d8bf1ace07", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7c81229b79854540", "level": "note", "message": {"text": "Unused endpoint: DELETE /api/wallet/v1/devices/:deviceId/registrations/:passTypeId/:serial"}, "properties": {"repobilityId": "658dbce64871b002", "scanner": "scanner-primary", "fingerprint": "7c81229b79854540", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cdf6047f93b215b5", "level": "note", "message": {"text": "Unused endpoint: POST /api/wallet/v1/log"}, "properties": {"repobilityId": "c2d2ce685fb6b017", "scanner": "scanner-primary", "fingerprint": "cdf6047f93b215b5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-18c49d3a27ecd9b5", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/wallet/notifications"}, "properties": {"repobilityId": "6511078f7acc184e", "scanner": "scanner-primary", "fingerprint": "18c49d3a27ecd9b5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}