{"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_unresolved_feedback", "name": "Foundry mined unresolved feedback: zhebinliu/knowledge-base", "shortDescription": {"text": "Foundry mined unresolved feedback: zhebinliu/knowledge-base"}, "fullDescription": {"text": "Graph query export: Human feedback without linked fix evidence\nQuery id: unresolved_feedback\nQuery type: motif_query\nIntent: Negative/unresolved examples that should not be hallucinated into fixes.\nMotif: unlinked_feedback_needs_evidence\nTraining usage: negative_or_unresolved\nGraph gold label: needs_more_evidence\nRepo: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#5\nEvidence:\nGraph motif: Human feedback exists without a linked fix\nMotif id: unlinked_feedback_needs_evidence\nPolarity: bad\nTraining usage: negative_or_unresolved\nSeverity: medium\nRepo: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#5\nGraph gold label: needs_more_evidence\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: zhebinliu/knowledge-base#5\nRepo: zhebinliu/knowledge-base\nIssue/PR number: 5\nGraph consistency label: needs_more_evidence\nNodes: 28\nEdges: 54\nNode types: {'pr_file': 19, 'link_quality': 3, 'thread': 1, 'repo': 1, 'comment': 1, 'comment_chain': 1, 'issue_chain': 1, 'fix_o"}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "medium", "confidence": 0.7, "cwe": "", "owasp": ""}}, {"id": "foundry_blueprint_gap", "name": "Foundry mined blueprint gap alignment: zhebinliu/knowledge-base", "shortDescription": {"text": "Foundry mined blueprint gap alignment: zhebinliu/knowledge-base"}, "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: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#1\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: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#1\nGraph gold label: weak_supervision_needs_review\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: zhebinliu/knowledge-base#1\nRepo: zhebinliu/knowledge-base\nIssue/PR number: 1\nGraph consistency label: weak_supervision_needs_review\nNodes: 28\nEdges: 55\nNode types: {'pr_file': 15, 'link_quality': 4, 'thread': 1, 'repo': 1, 'comment': 1, 'comment_c"}, "properties": {"scanner": "foundry_dataset", "category": "tech_debt", "severity": "medium", "confidence": 0.7, "cwe": "", "owasp": ""}}, {"id": "foundry_assumption_check", "name": "Foundry mined assumption checks: zhebinliu/knowledge-base", "shortDescription": {"text": "Foundry mined assumption checks: zhebinliu/knowledge-base"}, "fullDescription": {"text": "Comment chain pattern product: assumption_checks\nRepo: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#4\nOutcome: ambiguous_needs_more_evidence\nThread label: thread_needs_classification\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_unresolved\nChain evidence:\nIssue/PR evidence chain: zhebinliu/knowledge-base#4\nRepo: zhebinliu/knowledge-base\nThread label: thread_needs_classification\nOutcome: ambiguous_needs_more_evidence\nComment count: 1\nLinked commit count: 0\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 5\nLabels: {'human_feedback_general': 1}\nPolarities: {'neutral': 1}\nChanged file labels: {'ui_or_frontend': 5}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-b41fe077d8099d08\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"human_feedback_general\",\n    \"polarity\": \"neutral\",\n    \"url\": \"https://github.com/zhebinliu/k"}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "medium", "confidence": 0.62, "cwe": "", "owasp": ""}}, {"id": "foundry_bad_chain", "name": "Foundry mined bad chains: zhebinliu/knowledge-base", "shortDescription": {"text": "Foundry mined bad chains: zhebinliu/knowledge-base"}, "fullDescription": {"text": "Comment chain pattern product: bad_chains\nRepo: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#5\nOutcome: not_resolved_or_not_observed\nThread label: thread_has_human_issue_without_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_unresolved, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: zhebinliu/knowledge-base#5\nRepo: zhebinliu/knowledge-base\nThread label: thread_has_human_issue_without_fix_context\nOutcome: not_resolved_or_not_observed\nComment count: 1\nLinked commit count: 0\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 19\nLabels: {'security_auth_secret': 1}\nPolarities: {'bad': 1}\nChanged file labels: {'api_or_backend': 11, 'ui_or_frontend': 8}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-e6b791d518d67c0f\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"security_auth_secret\",\n "}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "high", "confidence": 0.84, "cwe": "", "owasp": ""}}, {"id": "foundry_auth_guardrail_gap", "name": "Foundry mined security auth guardrail gaps: zhebinliu/knowledge-base", "shortDescription": {"text": "Foundry mined security auth guardrail gaps: zhebinliu/knowledge-base"}, "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: needs_more_evidence\nRepo: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#5\nEvidence:\nGraph motif: Security/auth change without enough guardrails\nMotif id: security_auth_without_guardrails\nPolarity: bad\nTraining usage: assumption_check\nSeverity: critical\nRepo: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#5\nGraph gold label: needs_more_evidence\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: zhebinliu/knowledge-base#5\nRepo: zhebinliu/knowledge-base\nIssue/PR number: 5\nGraph consistency label: needs_more_evidence\nNodes: 28\nEdges: 54\nNode types: {'pr_file': 19, 'link_quality': 3, 'thread': 1, 'repo': 1, 'comment': 1, 'comment_chain': 1, 'issue_chain': 1,"}, "properties": {"scanner": "foundry_dataset", "category": "auth", "severity": "critical", "confidence": 0.78, "cwe": "", "owasp": ""}}, {"id": "scanner-512606733d82de21", "name": "Possibly dead Python function: sync_action_items_to_bitable", "shortDescription": {"text": "Possibly dead Python function: sync_action_items_to_bitable"}, "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-74956ed93aef49a4", "name": "Possibly dead Python function: run_challenge_batch", "shortDescription": {"text": "Possibly dead Python function: run_challenge_batch"}, "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-e2545bddcd617449", "name": "Possibly dead Python function: has_web_search_provider_sync", "shortDescription": {"text": "Possibly dead Python function: has_web_search_provider_sync"}, "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-7005a3433e2ca255", "name": "Possibly dead Python function: require_admin", "shortDescription": {"text": "Possibly dead Python function: require_admin"}, "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-59c6a9c9437ddc68", "name": "Possibly dead Python function: prepend_revision_memories_sync", "shortDescription": {"text": "Possibly dead Python function: prepend_revision_memories_sync"}, "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-7ef084bf878cfeec", "name": "Possibly dead Python function: dep", "shortDescription": {"text": "Possibly dead Python function: dep"}, "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-a0a13cd111b7d4bf", "name": "Possibly dead Python function: validate_and_consume", "shortDescription": {"text": "Possibly dead Python function: validate_and_consume"}, "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-bc960260bf07f587", "name": "Possibly dead Python function: cleanup_expired_captchas", "shortDescription": {"text": "Possibly dead Python function: cleanup_expired_captchas"}, "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-d2e75249d86fb73f", "name": "Possibly dead Python function: evaluate_password_checks", "shortDescription": {"text": "Possibly dead Python function: evaluate_password_checks"}, "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-844606c51a9e556c", "name": "Possibly dead Python function: bootstrap_all", "shortDescription": {"text": "Possibly dead Python function: bootstrap_all"}, "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-a4a67b3adcaae687", "name": "Possibly dead Python function: stop_all", "shortDescription": {"text": "Possibly dead Python function: stop_all"}, "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-ebef0bca81c4f4f1", "name": "Possibly dead Python function: list_connected", "shortDescription": {"text": "Possibly dead Python function: list_connected"}, "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-75812d1ed8236de2", "name": "Possibly dead Python function: critical_modules_for_industry", "shortDescription": {"text": "Possibly dead Python function: critical_modules_for_industry"}, "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-1682cbec73ff8447", "name": "Possibly dead Python function: repl", "shortDescription": {"text": "Possibly dead Python function: repl"}, "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-09f81889ac838630", "name": "Possibly dead Python function: list_outline_modules", "shortDescription": {"text": "Possibly dead Python function: list_outline_modules"}, "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-da46607ffb1cd4d0", "name": "Possibly dead Python function: critical_outline_modules", "shortDescription": {"text": "Possibly dead Python function: critical_outline_modules"}, "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-2178748852f966b9", "name": "Possibly dead Python function: generate_survey_for_role", "shortDescription": {"text": "Possibly dead Python function: generate_survey_for_role"}, "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-492631911a8da276", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/UploadOptionsModal.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/UploadOptionsModal.tsx:68"}, "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-3361425a032d840b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/OutputChatPanel.tsx:181", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/OutputChatPanel.tsx:181"}, "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-69a56616b7fa672d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/BriefDrawer.tsx:162", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/BriefDrawer.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-31ff15a02c6fe11b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/DataTable.tsx:260", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/DataTable.tsx:260"}, "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-d75604445ea95011", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Layout.tsx:265", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Layout.tsx:265"}, "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-cc6abe7614a541fe", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/AgenticGapFiller.tsx:353", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/AgenticGapFiller.tsx:353"}, "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-f2d31d158d12a984", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/settings/SkillsTab.tsx:230", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/settings/SkillsTab.tsx:230"}, "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-5a89f1bf70d2abc9", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/settings/OutputAgentsTab.tsx:131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/settings/OutputAgentsTab.tsx:131"}, "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-df4c8d350d7982e3", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/system-config/StageFlowTab.tsx:394", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/system-config/StageFlowTab.tsx:394"}, "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-3f3fe2d47a20dbde", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/markdown/ReportMarkdown.tsx:222", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/markdown/ReportMarkdown.tsx:222"}, "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-64394fbc0051926e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/DocChecklist.tsx:432", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/DocChecklist.tsx:432"}, "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-43a81b79bd3fdbc4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/CenterWorkspace.tsx:289", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/CenterWorkspace.tsx:289"}, "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-9c47f39be3898775", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/ProjectStakeholdersDrawer.tsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/ProjectStakeholdersDrawer.tsx:142"}, "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-cca3741443238872", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/FloatingQA.tsx:274", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/FloatingQA.tsx:274"}, "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-1c41b37a316076af", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/ProjectMeetingsDrawer.tsx:127", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/ProjectMeetingsDrawer.tsx:127"}, "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-9e2750332f910f33", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/CollaboratorsModal.tsx:160", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/CollaboratorsModal.tsx:160"}, "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-1a4dba35a4aab59b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/research/ResearchWorkspace.tsx:265", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/research/ResearchWorkspace.tsx:265"}, "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-fb8a46efced6a97c", "name": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/components/console/research/ResearchWorkspace.tsx:770", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/components/console/research/ResearchWorkspace.tsx:770"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6b964a450aa24353", "name": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/components/console/research/ResearchQuestionnaire.tsx:490", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/components/console/research/ResearchQuestionnaire.tsx:490"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb722f4324dcde1b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/implementation/ImplementationWorksp", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/implementation/ImplementationWorkspace.tsx:425"}, "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-157a65f7f27e5cb4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/qixin/QixinDrawer.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/qixin/QixinDrawer.tsx:109"}, "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-c3b2da81ab3bb0bb", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Dashboard.tsx:355", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Dashboard.tsx:355"}, "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-af1fd3c78b3b9904", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Demo.tsx:218", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Demo.tsx:218"}, "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-3ceb3bc4d519e81b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ProjectDetail.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ProjectDetail.tsx:124"}, "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-6285b0fd1e41bb1c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DesignSystem.tsx:870", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DesignSystem.tsx:870"}, "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-fcc26e79ca29f751", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Documents.tsx:61", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Documents.tsx:61"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9b68a5432e9eb243", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Projects.tsx:162", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Projects.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-3ecc12f0d536f793", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/demo/InsightDemo.tsx:560", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/demo/InsightDemo.tsx:560"}, "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-7a95b9cd0baa287d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/demo/SurveyDemo.tsx:661", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/demo/SurveyDemo.tsx:661"}, "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-378275aa77217062", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/console/ConsoleProjects.tsx:121", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/console/ConsoleProjects.tsx:121"}, "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-a4cfe6013883dfaa", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/console/ConsoleProjectDetail.tsx:363", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/console/ConsoleProjectDetail.tsx:363"}, "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-b57927e5b1ffa476", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/console/ConsoleMeetingDetail.tsx:1873", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/console/ConsoleMeetingDetail.tsx:1873"}, "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-3b09454fc04a1e10", "name": "TODO/FIXME marker in shipping code \u2014 frontend/src/pages/console/ConsoleMeetingDetail.tsx:2397", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/pages/console/ConsoleMeetingDetail.tsx:2397"}, "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-697cdca74e1c6d6c", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/console/ConsoleMeetingDetail.tsx:1373", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/console/ConsoleMeetingDetail.tsx:1373"}, "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-3815994cd3dff2d0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/console/ConsoleHome.tsx:183", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/console/ConsoleHome.tsx:183"}, "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-d31dc95043cb73f7", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/redesign/console/CenterWorkspace.tsx:1113", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/redesign/console/CenterWorkspace.tsx:1113"}, "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-fc6f2e2a9fa20dd3", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/redesign/console/research/ResearchWorkspace.tsx:548", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/redesign/console/research/ResearchWorkspace.tsx:548"}, "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-d30c4906ee4c8a72", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/layouts/ConsoleLayout.tsx:133", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/layouts/ConsoleLayout.tsx:133"}, "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-0d665cf2eb46361c", "name": "Stray `console.log` in TS/JS \u2014 scripts/take-screenshots.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/take-screenshots.js:18"}, "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-2ca141adde3c5588", "name": "Stray `console.log` in TS/JS \u2014 scripts/demo-video/record-demo.js:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/demo-video/record-demo.js:50"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-229ddcd9e7b259ae", "name": "Stray `console.log` in TS/JS \u2014 scripts/demo-video/lib/narration.js:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/demo-video/lib/narration.js:34"}, "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-c36bdd216b130550", "name": "Stray `console.log` in TS/JS \u2014 scripts/demo-video/lib/render.js:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/demo-video/lib/render.js:27"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9394610b3f8717fc", "name": "Stray `console.log` in TS/JS \u2014 scripts/demo-video/lib/cursor.js:74", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/demo-video/lib/cursor.js:74"}, "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-b386ff4d7ae94536", "name": "Stray `console.log` in TS/JS \u2014 desktop/src/renderer.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 desktop/src/renderer.ts:31"}, "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-9939a214e7e3cceb", "name": "`truncate` class without `title=` for hover reveal \u2014 meeting/frontend/src/pages/console/ConsoleMeetingDetail.tsx:1873", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 meeting/frontend/src/pages/console/ConsoleMeetingDetail.tsx:1873"}, "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-002c40c5922f3625", "name": "TODO/FIXME marker in shipping code \u2014 meeting/frontend/src/pages/console/ConsoleMeetingDetail.tsx:2397", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 meeting/frontend/src/pages/console/ConsoleMeetingDetail.tsx:2397"}, "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-630a69db98931a10", "name": "Stray `console.log` in TS/JS \u2014 meeting/frontend/src/pages/console/ConsoleMeetingDetail.tsx:1373", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 meeting/frontend/src/pages/console/ConsoleMeetingDetail.tsx:1373"}, "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-60427b03771411b6", "name": "Dockerfile runs as root: frontend/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: frontend/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-faa134129e5545ff", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e9c1e66a27308f49", "name": "Docker base image is tag-pinned but not digest-pinned: nginx:1.27-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: nginx:1.27-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f66ad88286ca30a", "name": "Dockerfile runs as root: backend/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: backend/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8cd20d539467d2c5", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3027e907646b78ac", "name": "Insecure pattern 'direct_innerhtml_assignment' in presentation.html:705", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in presentation.html:705"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-de8758808e6b8dbb", "name": "Insecure pattern 'direct_innerhtml_assignment' in todo-kanban-prototype.html:607", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in todo-kanban-prototype.html:607"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e116b3e6be2302e3", "name": "Insecure pattern 'new_function_used' in frontend/public/estimate/index.html:213", "shortDescription": {"text": "Insecure pattern 'new_function_used' in frontend/public/estimate/index.html:213"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3fc328f5893fc1f8", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/quiz.html:701", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/quiz.html:701"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-96a5eabe7bdb375f", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/player.html:1237", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/player.html:1237"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9a3f97e966a27179", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/script.html:263", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/script.html:263"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-465347873844fc74", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson14/demo.html:1311", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson14/demo.html:1311"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5795951550a87dca", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson23/demo.html:1517", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson23/demo.html:1517"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e749f46de0d122a2", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson20/demo.html:1550", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson20/demo.html:1550"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-80a33804cea51d68", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson05/demo.html:940", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson05/demo.html:940"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-39bdef3836f33a02", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson07/demo.html:1268", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson07/demo.html:1268"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-859af80539fb9e10", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson01/demo.html:667", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson01/demo.html:667"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fddab53cec10946f", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson02/demo.html:974", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson02/demo.html:974"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-341d20f7d855039f", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson08/demo.html:1106", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson08/demo.html:1106"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3227734eea571d77", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson16/demo.html:1738", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson16/demo.html:1738"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cf9c79dea5f6d83a", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson17/demo.html:1913", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson17/demo.html:1913"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4f81b7ccb3880c63", "name": "Insecure pattern 'insert_adjacent_html' in frontend/public/course/lesson17/demo.html:1950", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in frontend/public/course/lesson17/demo.html:1950"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5cd44b653904bbb2", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson03/demo.html:841", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson03/demo.html:841"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2aa5004b70c45d34", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson18/demo.html:1204", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson18/demo.html:1204"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f3b733b258ebc1d1", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson09/demo.html:1210", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson09/demo.html:1210"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d14c72e3948fdea", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson04/demo.html:973", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson04/demo.html:973"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b8fe312fe8188f8d", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson22/demo.html:1270", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson22/demo.html:1270"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b4c7f1fd10237506", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson12/demo.html:1389", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson12/demo.html:1389"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c9b6a9e515a38cfc", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson10/demo.html:1318", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson10/demo.html:1318"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-726a3b6504d9fe57", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson11/demo.html:1194", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson11/demo.html:1194"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1bdc419844821b52", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson06/demo.html:1055", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson06/demo.html:1055"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4adc655d80166af8", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson19/demo.html:1304", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson19/demo.html:1304"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-467c2ab54493cad7", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson13/demo.html:1519", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson13/demo.html:1519"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9974310497bf83d2", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson21/demo.html:1420", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson21/demo.html:1420"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-da9f2e0e16924f40", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson15/demo.html:1665", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson15/demo.html:1665"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dd4e9154850d794c", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/markdown/ReportMarkdown.tsx:222", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/markdown/ReportMarkdown.tsx:222"}, "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-ae5a085afff90704", "name": "Possible secret in scripts/take-screenshots.js", "shortDescription": {"text": "Possible secret in scripts/take-screenshots.js"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-113f090bc75d271d", "name": "Insecure pattern 'local_storage_auth_token' in scripts/take-screenshots.js:70", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/take-screenshots.js:70"}, "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-ddca848b0c70bf33", "name": "Insecure pattern 'local_storage_auth_token' in scripts/demo-video/lib/auth.js:43", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/demo-video/lib/auth.js:43"}, "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-4d6a17759e94beff", "name": "Insecure pattern 'direct_innerhtml_assignment' in backend/prompts/sharedev/skills/sharedev-pwc-write-prd-spec/scripts/he", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in backend/prompts/sharedev/skills/sharedev-pwc-write-prd-spec/scripts/helper.js:57"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-645e19ad7523a311", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "docker/setup-buildx-action@v3 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c0d7e7ed5be2029c", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aef0bbd36deaa168", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fa7ba2c6d4604ca1", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28c4a04bd807da0c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0bf7228e09d9c0bd", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "docker/setup-buildx-action@v3 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-422c803941f94c74", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a32bc5523ae3e4b3", "name": "Very large file: frontend/src/api/client.ts (2708 lines)", "shortDescription": {"text": "Very large file: frontend/src/api/client.ts (2708 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-9b8478d5d8f28eeb", "name": "Very large file: frontend/src/components/console/research/ResearchWorkspace.tsx (1186 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/console/research/ResearchWorkspace.tsx (1186 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-c8b9887cf80386ad", "name": "Very large file: frontend/src/components/console/research/ResearchQuestionnaire.tsx (1846 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/console/research/ResearchQuestionnaire.tsx (1846 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-608b12a7f074fad7", "name": "Very large file: frontend/src/pages/Help.tsx (904 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/Help.tsx (904 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-e76f93d17d8acbfd", "name": "Very large file: frontend/src/pages/Demo.tsx (1222 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/Demo.tsx (1222 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-060b02b90f818d9a", "name": "Very large file: frontend/src/pages/DesignSystem.tsx (1785 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/DesignSystem.tsx (1785 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-8431444d316b7c1c", "name": "Very large file: frontend/src/pages/demo/InsightDemo.tsx (886 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/demo/InsightDemo.tsx (886 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-6e42b6fbbdce5ace", "name": "Very large file: frontend/src/pages/console/ConsoleProjectDetail.tsx (2020 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/console/ConsoleProjectDetail.tsx (2020 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-d1b0cc375be89a34", "name": "Very large file: frontend/src/pages/console/ConsoleMeetingDetail.tsx (2990 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/console/ConsoleMeetingDetail.tsx (2990 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-0b68e163590ae31a", "name": "Very large file: frontend/src/redesign/console/CenterWorkspace.tsx (1209 lines)", "shortDescription": {"text": "Very large file: frontend/src/redesign/console/CenterWorkspace.tsx (1209 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-02b3c5aa3001a847", "name": "Very large file: frontend/src/redesign/console/ConsoleProjectDetail.tsx (2046 lines)", "shortDescription": {"text": "Very large file: frontend/src/redesign/console/ConsoleProjectDetail.tsx (2046 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-4af3c1acdbeceac4", "name": "Very large file: frontend/src/redesign/console/research/ResearchQuestionnaireDark.tsx (1722 lines)", "shortDescription": {"text": "Very large file: frontend/src/redesign/console/research/ResearchQuestionnaireDark.tsx (1722 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-a6c1da84cf32fc33", "name": "Very large file: frontend/src/redesign/console/research/ResearchWorkspace.tsx (1273 lines)", "shortDescription": {"text": "Very large file: frontend/src/redesign/console/research/ResearchWorkspace.tsx (1273 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-6aefc7abd3f3b909", "name": "Very large file: meeting/frontend/src/pages/console/ConsoleMeetingDetail.tsx (2990 lines)", "shortDescription": {"text": "Very large file: meeting/frontend/src/pages/console/ConsoleMeetingDetail.tsx (2990 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-06f20c9dc110b68d", "name": "Very large file: meeting/backend/api/meeting.py (1854 lines)", "shortDescription": {"text": "Very large file: meeting/backend/api/meeting.py (1854 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-34c0caaceccd359b", "name": "Very large file: backend/api/outputs.py (1425 lines)", "shortDescription": {"text": "Very large file: backend/api/outputs.py (1425 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-6fe7d5f9812dc088", "name": "Very large file: backend/api/meeting.py (1854 lines)", "shortDescription": {"text": "Very large file: backend/api/meeting.py (1854 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-aed223e6281b6772", "name": "Very large file: backend/services/output_service.py (1094 lines)", "shortDescription": {"text": "Very large file: backend/services/output_service.py (1094 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-8dafcb654bb2619e", "name": "Very large file: backend/services/agentic/executor.py (1095 lines)", "shortDescription": {"text": "Very large file: backend/services/agentic/executor.py (1095 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-a46d4960213018dc", "name": "Very large file: backend/services/agentic/runner.py (3787 lines)", "shortDescription": {"text": "Very large file: backend/services/agentic/runner.py (3787 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": "7 test file(s) for 443 source file(s) (ratio 0.02). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 132 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 233 placeholder/mock markers across 72 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e705d5fa2c5912f5", "name": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-pwc-finish-development/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-pwc-finish-development/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-173e780825403038", "name": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-pwc-execute-plans/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-pwc-execute-plans/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4c552c608ee052ba", "name": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-auto/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-auto/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ca5a8f90f098a52f", "name": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-apl-lite/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-apl-lite/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1190f346afd5237f", "name": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-pwc-review-code/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-pwc-review-code/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-100fb61db00abb65", "name": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-apl-code-review/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-apl-code-review/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d4a768894be99958", "name": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-pwc-subagent-driven-development/SKIL", "shortDescription": {"text": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-pwc-subagent-driven-development/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-06af07bf11de5e40", "name": "Agent authority lacks a verifier contract: backend/prompts/sharedev/specs/apl/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: backend/prompts/sharedev/specs/apl/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1b907d76056fbab8", "name": "Commented-code block (6 lines) in frontend/src/main.tsx:11", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/main.tsx:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a45f1ba0f477bda6", "name": "Legacy-named symbol `isLegacy` in frontend/src/components/TemplateSelector.tsx:31", "shortDescription": {"text": "Legacy-named symbol `isLegacy` in frontend/src/components/TemplateSelector.tsx:31"}, "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-e24abea0c72e751f", "name": "Commented-code block (5 lines) in frontend/src/components/console/research/ResearchWorkspace.tsx:90", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/console/research/ResearchWorkspace.tsx:90"}, "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-ba76079ada36a9c6", "name": "Commented-code block (6 lines) in frontend/src/components/console/research/ResearchQuestionnaire.tsx:70", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/components/console/research/ResearchQuestionnaire.tsx:70"}, "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-6b304dfb6cca28bb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/Challenge.tsx:125", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/Challenge.tsx:125"}, "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-62a1a2a4c5380cdd", "name": "Legacy-named symbol `survey_v2` in frontend/src/pages/Demo.tsx:667", "shortDescription": {"text": "Legacy-named symbol `survey_v2` in frontend/src/pages/Demo.tsx:667"}, "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-f6ad5200e372ae45", "name": "Commented-code block (5 lines) in frontend/src/pages/console/ConsoleProjectDetail.tsx:267", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/console/ConsoleProjectDetail.tsx:267"}, "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-cf6201aca1f67309", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/console/ConsoleProjectDetail.tsx:1487", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/console/ConsoleProjectDetail.tsx:1487"}, "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-8024b86fc2ca9ba7", "name": "Legacy-named symbol `isLegacy` in frontend/src/redesign/console/TemplateManager.tsx:27", "shortDescription": {"text": "Legacy-named symbol `isLegacy` in frontend/src/redesign/console/TemplateManager.tsx:27"}, "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-fe6ac2a3ff16117d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/redesign/console/ConsoleProjectDetail.tsx:1614", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/redesign/console/ConsoleProjectDetail.tsx:1614"}, "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-b4edf927f1709fe1", "name": "Commented-code block (6 lines) in frontend/src/redesign/console/research/ResearchQuestionnaireDark.tsx:67", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/redesign/console/research/ResearchQuestionnaireDark.tsx:67"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b40906bf288e6d72", "name": "Commented-code block (5 lines) in frontend/src/redesign/console/research/ResearchWorkspace.tsx:612", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/redesign/console/research/ResearchWorkspace.tsx:612"}, "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-8e4b1afa7c2f579c", "name": "Commented-code block (5 lines) in frontend/src/redesign/console/canvas/canvasModel.ts:28", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/redesign/console/canvas/canvasModel.ts:28"}, "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-825e88512e1bdbfe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/take-screenshots.js:113", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/take-screenshots.js:113"}, "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-12ff7789e65cbe83", "name": "Blocking `httpx.post(...)` inside `async def main` \u2014 scripts/bootstrap.py:178", "shortDescription": {"text": "Blocking `httpx.post(...)` inside `async def main` \u2014 scripts/bootstrap.py:178"}, "fullDescription": {"text": "Sync I/O inside an async function blocks the event loop. While `httpx.post(...)` is running, *all* other coroutines on this loop are paused \u2014 silent throughput collapse under concurrency. Use the async equivalent (`httpx.AsyncClient`, `asyncio.sleep`, `aiofiles`) or wrap with `await asyncio.to_thread(...)`."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4b7297afc38c4170", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/demo-video/narration/tts.py:69", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/demo-video/narration/tts.py:69"}, "fullDescription": {"text": "`requests.post(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4b5d82cb11cff47f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/demo-video/lib/auth.js:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/demo-video/lib/auth.js:27"}, "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-8884a8b709c453e3", "name": "Legacy-named symbol `isLegacy` in meeting/frontend/src/components/TemplateSelector.tsx:31", "shortDescription": {"text": "Legacy-named symbol `isLegacy` in meeting/frontend/src/components/TemplateSelector.tsx:31"}, "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-442208246012f58d", "name": "Legacy-named symbol `isLegacy` in meeting/frontend/src/redesign/console/TemplateManager.tsx:27", "shortDescription": {"text": "Legacy-named symbol `isLegacy` in meeting/frontend/src/redesign/console/TemplateManager.tsx:27"}, "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-b54f7919fe3e169f", "name": "Commented-code block (9 lines) in backend/main.py:7", "shortDescription": {"text": "Commented-code block (9 lines) in backend/main.py:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-43d2c1dc858f3167", "name": "Commented-code block (7 lines) in backend/api/projects.py:313", "shortDescription": {"text": "Commented-code block (7 lines) in backend/api/projects.py:313"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8213adcbfaef18d5", "name": "Legacy-named symbol `insight_v2` in backend/api/briefs.py:26", "shortDescription": {"text": "Legacy-named symbol `insight_v2` in backend/api/briefs.py:26"}, "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-77d38ac4c910e2ff", "name": "Legacy-named symbol `insight_v2` in backend/scripts/migrate_v3_rename.py:6", "shortDescription": {"text": "Legacy-named symbol `insight_v2` in backend/scripts/migrate_v3_rename.py:6"}, "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-b6b6f6d47d87a3ba", "name": "Commented-code block (6 lines) in backend/scripts/migrate_v3_rename.py:50", "shortDescription": {"text": "Commented-code block (6 lines) in backend/scripts/migrate_v3_rename.py:50"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f393a1e4c9ac66ce", "name": "Commented-code block (7 lines) in backend/tasks/output_tasks.py:277", "shortDescription": {"text": "Commented-code block (7 lines) in backend/tasks/output_tasks.py:277"}, "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-3d094959d91dc641", "name": "Commented-code block (6 lines) in backend/agents/converter_agent.py:697", "shortDescription": {"text": "Commented-code block (6 lines) in backend/agents/converter_agent.py:697"}, "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-f2f1d48c20ed01cb", "name": "Commented-code block (6 lines) in backend/services/smart_advice.py:59", "shortDescription": {"text": "Commented-code block (6 lines) in backend/services/smart_advice.py:59"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e7ccf0cc4aac799c", "name": "Commented-code block (5 lines) in backend/services/agentic/runner.py:202", "shortDescription": {"text": "Commented-code block (5 lines) in backend/services/agentic/runner.py:202"}, "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-2364ade3d20bdfab", "name": "Commented-code block (5 lines) in backend/services/agentic/research/best_practices.py:443", "shortDescription": {"text": "Commented-code block (5 lines) in backend/services/agentic/research/best_practices.py:443"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5fa5af25316da646", "name": "16 env vars used in code but missing from .env.example", "shortDescription": {"text": "16 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `DEMO_BUNDLE_ID`, `DEMO_PROJECT_ID`, `DEMO_PROJECT_NAME`, `KB_BASE_URL`, `KB_PASSWORD`, `KB_USERNAME`, `LANG`, `LC_ALL` + 8 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nmeeting/backend/models/markup_template.py:to_dict, backend/models/markup_template.py:to_dict\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nmeeting/backend/api/feishu_credentials.py:put_feishu_credentials, meeting/backend/api/meeting.py:put_feishu_credentials, backend/api/feishu_credentials.py:put_feishu_credentials, backend/api/meeting.py:put_feishu_credentials\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-33a6b62e30ce7ab4", "name": "Near-duplicate function bodies in 6 places", "shortDescription": {"text": "Near-duplicate function bodies in 6 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nmeeting/backend/api/markup_template.py:render_template_with_meeting, meeting/backend/api/markup_template.py:export_template_docx, meeting/backend/api/markup_template.py:export_template_md, backend/api/markup_template.py:render_template_with_meeting\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-b2bb3abb6e218b67", "name": "Frontend route `/ds` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/ds` has no Link/navigate to it \u2014 frontend/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-cf64a0e5c7f9aed7", "name": "Frontend route `/demo/outline` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/demo/outline` has no Link/navigate to it \u2014 frontend/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-3d75b77d0ea56699", "name": "Frontend route `/demo-ppt` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/demo-ppt` has no Link/navigate to it \u2014 frontend/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-f4ae9bd644d0ea91", "name": "Frontend route `console` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `console` has no Link/navigate to it \u2014 frontend/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-8e11138a9f634ca9", "name": "Frontend route `dashboard` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 frontend/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-04fa5efc2fe45ef2", "name": "Frontend route `qa` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `qa` has no Link/navigate to it \u2014 frontend/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-e80e60163d276e3b", "name": "Frontend route `documents` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `documents` has no Link/navigate to it \u2014 frontend/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-97d27999bfa3b3b4", "name": "Frontend route `projects` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `projects` has no Link/navigate to it \u2014 frontend/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-e409b390602f9a6d", "name": "Frontend route `insight` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `insight` has no Link/navigate to it \u2014 frontend/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-174300f5890d5905", "name": "Frontend route `survey` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `survey` has no Link/navigate to it \u2014 frontend/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-c803de2732e50807", "name": "Frontend route `projects/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `projects/:id` has no Link/navigate to it \u2014 frontend/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-1243940c9a89f323", "name": "Frontend route `projects/:id/todos` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `projects/:id/todos` has no Link/navigate to it \u2014 frontend/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-3dd2ce5435dd2065", "name": "Frontend route `projects/:id/canvas` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `projects/:id/canvas` has no Link/navigate to it \u2014 frontend/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-bc4d1001d12c941a", "name": "Frontend route `meeting` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `meeting` has no Link/navigate to it \u2014 frontend/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-718eef2764c9c7ec", "name": "Frontend route `meeting/new` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `meeting/new` has no Link/navigate to it \u2014 frontend/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-bf5e378b1a074407", "name": "Frontend route `meeting/templates` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `meeting/templates` has no Link/navigate to it \u2014 frontend/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-4e637489bd20c1b2", "name": "Frontend route `meeting/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `meeting/:id` has no Link/navigate to it \u2014 frontend/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-3c423cd4489dd4da", "name": "Frontend route `chunks` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `chunks` has no Link/navigate to it \u2014 frontend/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-2cf74ad102492d5f", "name": "Frontend route `review` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `review` has no Link/navigate to it \u2014 frontend/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-3c210a1fb5b5f3d9", "name": "Frontend route `challenge` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `challenge` has no Link/navigate to it \u2014 frontend/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-55109eacc2ace549", "name": "Frontend route `challenge/history` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `challenge/history` has no Link/navigate to it \u2014 frontend/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-17bacb17f6efb788", "name": "Frontend route `settings` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 frontend/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-0ac160ffb66284b3", "name": "Frontend route `personal-settings` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `personal-settings` has no Link/navigate to it \u2014 frontend/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-292f1a70fb15f7ce", "name": "Frontend route `system-config` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `system-config` has no Link/navigate to it \u2014 frontend/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-4de014f5ec3d869e", "name": "Frontend route `invite-codes` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `invite-codes` has no Link/navigate to it \u2014 frontend/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-099feb2db9deff41", "name": "Frontend route `bundle-memories` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `bundle-memories` has no Link/navigate to it \u2014 frontend/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-e542ec86a3bcbf9f", "name": "FastAPI POST `ingest_meeting` without auth dependency \u2014 meeting/backend/api/meeting.py:1645", "shortDescription": {"text": "FastAPI POST `ingest_meeting` without auth dependency \u2014 meeting/backend/api/meeting.py:1645"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-381a73498daf1412", "name": "FastAPI POST `mcp_endpoint` without auth dependency \u2014 backend/api/mcp.py:653", "shortDescription": {"text": "FastAPI POST `mcp_endpoint` without auth dependency \u2014 backend/api/mcp.py:653"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1a788fa80e989d9a", "name": "FastAPI POST `sso_bind` without auth dependency \u2014 backend/api/auth.py:224", "shortDescription": {"text": "FastAPI POST `sso_bind` without auth dependency \u2014 backend/api/auth.py:224"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e16eec46fa85f545", "name": "FastAPI PUT `update_model` without auth dependency \u2014 backend/api/agent_settings.py:37", "shortDescription": {"text": "FastAPI PUT `update_model` without auth dependency \u2014 backend/api/agent_settings.py:37"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d8ec746cd6746458", "name": "FastAPI POST `create_model` without auth dependency \u2014 backend/api/agent_settings.py:44", "shortDescription": {"text": "FastAPI POST `create_model` without auth dependency \u2014 backend/api/agent_settings.py:44"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-98abde98bc6fb996", "name": "FastAPI DELETE `delete_model` without auth dependency \u2014 backend/api/agent_settings.py:56", "shortDescription": {"text": "FastAPI DELETE `delete_model` without auth dependency \u2014 backend/api/agent_settings.py:56"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-58ed329da98ad975", "name": "FastAPI PUT `update_routing` without auth dependency \u2014 backend/api/agent_settings.py:83", "shortDescription": {"text": "FastAPI PUT `update_routing` without auth dependency \u2014 backend/api/agent_settings.py:83"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-de1d7e7fb8db90f4", "name": "FastAPI DELETE `delete_routing` without auth dependency \u2014 backend/api/agent_settings.py:95", "shortDescription": {"text": "FastAPI DELETE `delete_routing` without auth dependency \u2014 backend/api/agent_settings.py:95"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-87a1b1e67d33093c", "name": "FastAPI PUT `update_api_key` without auth dependency \u2014 backend/api/agent_settings.py:141", "shortDescription": {"text": "FastAPI PUT `update_api_key` without auth dependency \u2014 backend/api/agent_settings.py:141"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b72f5c07aaf60c24", "name": "FastAPI DELETE `delete_api_key` without auth dependency \u2014 backend/api/agent_settings.py:148", "shortDescription": {"text": "FastAPI DELETE `delete_api_key` without auth dependency \u2014 backend/api/agent_settings.py:148"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-df76c40391bbb34d", "name": "FastAPI PUT `update_task_params` without auth dependency \u2014 backend/api/agent_settings.py:179", "shortDescription": {"text": "FastAPI PUT `update_task_params` without auth dependency \u2014 backend/api/agent_settings.py:179"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-12af4d7070aea331", "name": "FastAPI PUT `update_prompt` without auth dependency \u2014 backend/api/agent_settings.py:214", "shortDescription": {"text": "FastAPI PUT `update_prompt` without auth dependency \u2014 backend/api/agent_settings.py:214"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-04cd6ff58957f072", "name": "FastAPI POST `reset_prompt` without auth dependency \u2014 backend/api/agent_settings.py:232", "shortDescription": {"text": "FastAPI POST `reset_prompt` without auth dependency \u2014 backend/api/agent_settings.py:232"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0ebc4a711cade36a", "name": "FastAPI POST `force_seed` without auth dependency \u2014 backend/api/agent_settings.py:257", "shortDescription": {"text": "FastAPI POST `force_seed` without auth dependency \u2014 backend/api/agent_settings.py:257"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fc70db11eefd49dc", "name": "FastAPI POST `invalidate_cache` without auth dependency \u2014 backend/api/agent_settings.py:264", "shortDescription": {"text": "FastAPI POST `invalidate_cache` without auth dependency \u2014 backend/api/agent_settings.py:264"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-65f63a0696ad7421", "name": "FastAPI PUT `update_output_agent` without auth dependency \u2014 backend/api/agent_settings.py:360", "shortDescription": {"text": "FastAPI PUT `update_output_agent` without auth dependency \u2014 backend/api/agent_settings.py:360"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f4f03c174a37cd65", "name": "FastAPI PUT `update_embedding_config` without auth dependency \u2014 backend/api/agent_settings.py:421", "shortDescription": {"text": "FastAPI PUT `update_embedding_config` without auth dependency \u2014 backend/api/agent_settings.py:421"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5dbbf9395a44d68c", "name": "FastAPI DELETE `reset_embedding_config` without auth dependency \u2014 backend/api/agent_settings.py:438", "shortDescription": {"text": "FastAPI DELETE `reset_embedding_config` without auth dependency \u2014 backend/api/agent_settings.py:438"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9a3643911da1847f", "name": "FastAPI PUT `update_rerank_config` without auth dependency \u2014 backend/api/agent_settings.py:455", "shortDescription": {"text": "FastAPI PUT `update_rerank_config` without auth dependency \u2014 backend/api/agent_settings.py:455"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-60ec1550443223ba", "name": "FastAPI DELETE `reset_rerank_config` without auth dependency \u2014 backend/api/agent_settings.py:471", "shortDescription": {"text": "FastAPI DELETE `reset_rerank_config` without auth dependency \u2014 backend/api/agent_settings.py:471"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-65295e576061e28d", "name": "FastAPI POST `ingest_meeting` without auth dependency \u2014 backend/api/meeting.py:1645", "shortDescription": {"text": "FastAPI POST `ingest_meeting` without auth dependency \u2014 backend/api/meeting.py:1645"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9de6bd49845eab0a", "name": "Dangling fetch: GET /version.json?t=${Date.now()} (frontend/src/components/VersionWatcher.tsx:32)", "shortDescription": {"text": "Dangling fetch: GET /version.json?t=${Date.now()} (frontend/src/components/VersionWatcher.tsx:32)"}, "fullDescription": {"text": "`frontend/src/components/VersionWatcher.tsx:32` calls `GET /version.json?t=${Date.now()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/version.json`\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-b6cb35c11801cc91", "name": "Dangling fetch: POST /api/challenge/run-stream (frontend/src/pages/Challenge.tsx:125)", "shortDescription": {"text": "Dangling fetch: POST /api/challenge/run-stream (frontend/src/pages/Challenge.tsx:125)"}, "fullDescription": {"text": "`frontend/src/pages/Challenge.tsx:125` calls `POST /api/challenge/run-stream` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/challenge/run-stream`\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-35c268ad9306182e", "name": "Unused endpoint: GET /credentials", "shortDescription": {"text": "Unused endpoint: GET /credentials"}, "fullDescription": {"text": "`meeting/backend/api/feishu_credentials.py` declares `GET /credentials` 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-ad488e6a29eb0218", "name": "Unused endpoint: PUT /credentials", "shortDescription": {"text": "Unused endpoint: PUT /credentials"}, "fullDescription": {"text": "`meeting/backend/api/feishu_credentials.py` declares `PUT /credentials` 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-bdaa9c4a5a9008da", "name": "Unused endpoint: DELETE /credentials", "shortDescription": {"text": "Unused endpoint: DELETE /credentials"}, "fullDescription": {"text": "`meeting/backend/api/feishu_credentials.py` declares `DELETE /credentials` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`meeting/backend/api/template.py` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72eb8a13269a8eb3", "name": "Unused endpoint: GET /active", "shortDescription": {"text": "Unused endpoint: GET /active"}, "fullDescription": {"text": "`meeting/backend/api/template.py` declares `GET /active` 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-7175a4c44ec5d614", "name": "Unused endpoint: GET /{template_id}", "shortDescription": {"text": "Unused endpoint: GET /{template_id}"}, "fullDescription": {"text": "`meeting/backend/api/template.py` declares `GET /{template_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-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`meeting/backend/api/template.py` declares `POST /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-469ef4853b9d103d", "name": "Unused endpoint: POST /{template_id}/activate", "shortDescription": {"text": "Unused endpoint: POST /{template_id}/activate"}, "fullDescription": {"text": "`meeting/backend/api/template.py` declares `POST /{template_id}/activate` 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-303b07a07052d51b", "name": "Unused endpoint: POST /evolve", "shortDescription": {"text": "Unused endpoint: POST /evolve"}, "fullDescription": {"text": "`meeting/backend/api/template.py` declares `POST /evolve` 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-ec2b8074078b3cc8", "name": "Unused endpoint: GET /placeholders", "shortDescription": {"text": "Unused endpoint: GET /placeholders"}, "fullDescription": {"text": "`meeting/backend/api/markup_template.py` declares `GET /placeholders` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6236b283b79811b8", "name": "Unused endpoint: POST /upload", "shortDescription": {"text": "Unused endpoint: POST /upload"}, "fullDescription": {"text": "`meeting/backend/api/markup_template.py` declares `POST /upload` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-32690c96fbcb6cf7", "name": "Unused endpoint: PATCH /{template_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{template_id}"}, "fullDescription": {"text": "`meeting/backend/api/markup_template.py` declares `PATCH /{template_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-06f2d08d25a7279d", "name": "Unused endpoint: DELETE /{template_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{template_id}"}, "fullDescription": {"text": "`meeting/backend/api/markup_template.py` declares `DELETE /{template_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-096bf1d57b42fe3e", "name": "Unused endpoint: POST /{template_id}/render", "shortDescription": {"text": "Unused endpoint: POST /{template_id}/render"}, "fullDescription": {"text": "`meeting/backend/api/markup_template.py` declares `POST /{template_id}/render` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-91d2dcff4eea3f94", "name": "Unused endpoint: POST /{template_id}/export-docx", "shortDescription": {"text": "Unused endpoint: POST /{template_id}/export-docx"}, "fullDescription": {"text": "`meeting/backend/api/markup_template.py` declares `POST /{template_id}/export-docx` 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-06c529cf65449933", "name": "Unused endpoint: POST /{template_id}/export-md", "shortDescription": {"text": "Unused endpoint: POST /{template_id}/export-md"}, "fullDescription": {"text": "`meeting/backend/api/markup_template.py` declares `POST /{template_id}/export-md` 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-8a794262e0d1ee55", "name": "Unused endpoint: POST /from-text", "shortDescription": {"text": "Unused endpoint: POST /from-text"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `POST /from-text` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6f5843a70d73bb80", "name": "Unused endpoint: GET /illustration-styles", "shortDescription": {"text": "Unused endpoint: GET /illustration-styles"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `GET /illustration-styles` 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-1ffdb9135fa27b93", "name": "Unused endpoint: GET /{meeting_id}", "shortDescription": {"text": "Unused endpoint: GET /{meeting_id}"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `GET /{meeting_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-c5be948cff036e04", "name": "Unused endpoint: PATCH /{meeting_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{meeting_id}"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `PATCH /{meeting_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-e54c3bbe466a56c0", "name": "Unused endpoint: DELETE /{meeting_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{meeting_id}"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `DELETE /{meeting_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-fa3bd008595924f8", "name": "Unused endpoint: GET /{meeting_id}/requirements", "shortDescription": {"text": "Unused endpoint: GET /{meeting_id}/requirements"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `GET /{meeting_id}/requirements` 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-fd58b6912442a6eb", "name": "Unused endpoint: PUT /{meeting_id}/project", "shortDescription": {"text": "Unused endpoint: PUT /{meeting_id}/project"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `PUT /{meeting_id}/project` 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-be1a576216b6d6db", "name": "Unused endpoint: PUT /{meeting_id}/stakeholder-map", "shortDescription": {"text": "Unused endpoint: PUT /{meeting_id}/stakeholder-map"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `PUT /{meeting_id}/stakeholder-map` 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-57b03587309d9187", "name": "Unused endpoint: PUT /{meeting_id}/process-flows", "shortDescription": {"text": "Unused endpoint: PUT /{meeting_id}/process-flows"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `PUT /{meeting_id}/process-flows` 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-4c9b0034174741b4", "name": "Unused endpoint: PUT /{meeting_id}/edited-minutes", "shortDescription": {"text": "Unused endpoint: PUT /{meeting_id}/edited-minutes"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `PUT /{meeting_id}/edited-minutes` 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-acce2a5898fc9103", "name": "Unused endpoint: PATCH /{meeting_id}/requirements/{req_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{meeting_id}/requirements/{req_id}"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `PATCH /{meeting_id}/requirements/{req_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-57c6ef2a652c0f59", "name": "Unused endpoint: POST /{meeting_id}/requirements", "shortDescription": {"text": "Unused endpoint: POST /{meeting_id}/requirements"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `POST /{meeting_id}/requirements` 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-cc7a27c8d37838d9", "name": "Unused endpoint: DELETE /{meeting_id}/requirements/{req_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{meeting_id}/requirements/{req_id}"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `DELETE /{meeting_id}/requirements/{req_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-39fa6854b5d23837", "name": "Unused endpoint: POST /{meeting_id}/stakeholders/rename", "shortDescription": {"text": "Unused endpoint: POST /{meeting_id}/stakeholders/rename"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `POST /{meeting_id}/stakeholders/rename` 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-2592fcd1f7724080", "name": "Unused endpoint: POST /{meeting_id}/process", "shortDescription": {"text": "Unused endpoint: POST /{meeting_id}/process"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `POST /{meeting_id}/process` 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-18bb5b149c5e6f59", "name": "Unused endpoint: POST /{meeting_id}/actions/polish", "shortDescription": {"text": "Unused endpoint: POST /{meeting_id}/actions/polish"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `POST /{meeting_id}/actions/polish` 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-ddb569720a70fc91", "name": "Unused endpoint: POST /{meeting_id}/actions/summarize", "shortDescription": {"text": "Unused endpoint: POST /{meeting_id}/actions/summarize"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `POST /{meeting_id}/actions/summarize` 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-a26f83b977691a2c", "name": "Unused endpoint: GET /{meeting_id}/export-docx", "shortDescription": {"text": "Unused endpoint: GET /{meeting_id}/export-docx"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `GET /{meeting_id}/export-docx` 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-283d05bedd5d81ce", "name": "Unused endpoint: POST /{meeting_id}/actions/extract_requirements", "shortDescription": {"text": "Unused endpoint: POST /{meeting_id}/actions/extract_requirements"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `POST /{meeting_id}/actions/extract_requirements` 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-a27a478493853997", "name": "Unused endpoint: POST /{meeting_id}/actions/extract_stakeholders", "shortDescription": {"text": "Unused endpoint: POST /{meeting_id}/actions/extract_stakeholders"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `POST /{meeting_id}/actions/extract_stakeholders` 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-9f26b3ba6163f800", "name": "Unused endpoint: POST /{meeting_id}/actions/extract_process_flows", "shortDescription": {"text": "Unused endpoint: POST /{meeting_id}/actions/extract_process_flows"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `POST /{meeting_id}/actions/extract_process_flows` 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-54e83e11c3e9b235", "name": "Unused endpoint: POST /{meeting_id}/actions/extract_illustrations", "shortDescription": {"text": "Unused endpoint: POST /{meeting_id}/actions/extract_illustrations"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `POST /{meeting_id}/actions/extract_illustrations` 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-deb2c1aa8b46f8cb", "name": "Unused endpoint: POST /{meeting_id}/sync-kb", "shortDescription": {"text": "Unused endpoint: POST /{meeting_id}/sync-kb"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `POST /{meeting_id}/sync-kb` 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-f40b00bbc56ab5d8", "name": "Unused endpoint: POST /{meeting_id}/sync-stakeholder-map-kb", "shortDescription": {"text": "Unused endpoint: POST /{meeting_id}/sync-stakeholder-map-kb"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `POST /{meeting_id}/sync-stakeholder-map-kb` 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-30f41fdf69ed89c8", "name": "Unused endpoint: GET /feishu-credentials", "shortDescription": {"text": "Unused endpoint: GET /feishu-credentials"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `GET /feishu-credentials` 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-6f6131f020727c2a", "name": "Unused endpoint: PUT /feishu-credentials", "shortDescription": {"text": "Unused endpoint: PUT /feishu-credentials"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `PUT /feishu-credentials` 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-60831baa8b777f6c", "name": "Unused endpoint: DELETE /feishu-credentials", "shortDescription": {"text": "Unused endpoint: DELETE /feishu-credentials"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `DELETE /feishu-credentials` 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-f230200e047fa6f5", "name": "Unused endpoint: POST /{meeting_id}/check-feishu-url", "shortDescription": {"text": "Unused endpoint: POST /{meeting_id}/check-feishu-url"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `POST /{meeting_id}/check-feishu-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-627b48dc680ce12d", "name": "Unused endpoint: POST /{meeting_id}/export-feishu", "shortDescription": {"text": "Unused endpoint: POST /{meeting_id}/export-feishu"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `POST /{meeting_id}/export-feishu` 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-6b9812210986958f", "name": "Unused endpoint: POST /{meeting_id}/sync-requirements", "shortDescription": {"text": "Unused endpoint: POST /{meeting_id}/sync-requirements"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `POST /{meeting_id}/sync-requirements` 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-4b467d1d0e29d7e1", "name": "Unused endpoint: POST /{meeting_id}/sync-action-items", "shortDescription": {"text": "Unused endpoint: POST /{meeting_id}/sync-action-items"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `POST /{meeting_id}/sync-action-items` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-38d728c53cd52b85", "name": "Unused endpoint: POST /{meeting_id}/create-action-kanban", "shortDescription": {"text": "Unused endpoint: POST /{meeting_id}/create-action-kanban"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `POST /{meeting_id}/create-action-kanban` 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-067f1bb670713367", "name": "Unused endpoint: GET /{meeting_id}/audio", "shortDescription": {"text": "Unused endpoint: GET /{meeting_id}/audio"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `GET /{meeting_id}/audio` 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-5c36cb021e1bd4d7", "name": "Unused endpoint: POST /{meeting_id}/chat", "shortDescription": {"text": "Unused endpoint: POST /{meeting_id}/chat"}, "fullDescription": {"text": "`meeting/backend/api/meeting.py` declares `POST /{meeting_id}/chat` 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/23645"}, "properties": {"repository": "zhebinliu/knowledge-base", "repoUrl": "https://github.com/zhebinliu/knowledge-base", "branch": "main"}, "results": [{"ruleId": "foundry_unresolved_feedback", "level": "warning", "message": {"text": "Foundry mined unresolved feedback: zhebinliu/knowledge-base"}, "properties": {"repobilityId": 431461, "scanner": "foundry_dataset", "fingerprint": "97363478516805f002da6f6757c06b72818351fb5efafd12af2c4c5ae333e9b6", "category": "practices", "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 without linked fix evidence", "intent": "Negative/unresolved examples that should not be hallucinated into fixes.", "labels": {"api_or_backend": 11, "ui_or_frontend": 8, "security_auth_secret": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 3, "human_reported_issue_no_linked_fix": 1, "thread_has_human_issue_without_fix_context": 2}, "source": "graph_query_export", "motif_id": "unlinked_feedback_needs_evidence", "outcomes": {"not_resolved_or_not_observed": 6}, "polarity": "bad", "query_id": "unresolved_feedback", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 54, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 1, "thread_has_comment": 1, "thread_touches_file": 19, "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_touches_file": 12, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 1}, "node_count": 28, "node_types": {"repo": 1, "thread": 1, "comment": 1, "pr_file": 19, "fix_outcome": 1, "issue_chain": 1, "link_quality": 3, "comment_chain": 1}, "query_type": "motif_query", "thread_key": "zhebinliu/knowledge-base#5", "issue_number": "5", "quality_tiers": {"unresolved": 3}, "repo_full_name": "zhebinliu/knowledge-base", "training_usage": "negative_or_unresolved", "source_motif_id": "graph-pattern-motif-thread-ed034a5b15eeabe3", "graph_gold_label": "needs_more_evidence", "changed_file_labels": {"api_or_backend": 44, "ui_or_frontend": 32}}, "text": "Graph query export: Human feedback without linked fix evidence\nQuery id: unresolved_feedback\nQuery type: motif_query\nIntent: Negative/unresolved examples that should not be hallucinated into fixes.\nMotif: unlinked_feedback_needs_evidence\nTraining usage: negative_or_unresolved\nGraph gold label: needs_more_evidence\nRepo: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#5\nEvidence:\nGraph motif: Human feedback exists without a linked fix\nMotif id: unlinked_feedback_needs_evidence\nPolarity: bad\nTraining usage: negative_or_unresolved\nSeverity: medium\nRepo: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#5\nGraph gold label: needs_more_evidence\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: zhebinliu/knowledge-base#5\nRepo: zhebinliu/knowledge-base\nIssue/PR number: 5\nGraph consistency label: needs_more_evidence\nNodes: 28\nEdges: 54\nNode types: {'pr_file': 19, 'link_quality': 3, 'thread': 1, 'repo': 1, 'comment': 1, 'comment_chain': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'thread_touches_file': 19, 'comment_chain_touches_file': 12, 'issue_chain_touches_file': 12, '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: {'api_or_backend': 11, 'ui_or_frontend': 8, 'not_resolved_or_not_observed': 3, 'thread_has_human_issue_without_fix_context': 2, 'issue_or_pull_request_thread': 1, 'security_auth_secret': 1, 'human_reported_issue_no_linked_fix': 1}\nOutcomes: {'not_resolved_or_not_observed': 6}\nQuality tiers: {'unresolved': 3}\nCI labels: {}\nCurriculum targets:\n- Teach models to preserve unresolved human feedback instead of hallucinating fixes.\n- Build issue-to-regression examples where no accepted fix exists yet.\nAssumption checks:\n- Can a commit be linked by issue number, SHA, changed path, or time window?\n- If no link exists, is this explicitly labelled unresolved?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/zhebinliu/knowledge-base", "source_id": "graph-query-motif_query-28fb059fd42868f5", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/unresolved_feedback/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "zhebinliu/knowledge-base", "source_dataset": "graph_queries/unresolved_feedback", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_unresolved_feedback", "level": "warning", "message": {"text": "Foundry mined unresolved feedback: zhebinliu/knowledge-base"}, "properties": {"repobilityId": 431460, "scanner": "foundry_dataset", "fingerprint": "d480e4cd883177ac51ae7f6e7f6668e04c148e2aa025f858d985af80a13196e9", "category": "practices", "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 without linked fix evidence", "intent": "Negative/unresolved examples that should not be hallucinated into fixes.", "labels": {"ui_or_frontend": 5, "human_feedback_general": 1, "unlinked_human_feedback": 1, "thread_needs_classification": 2, "issue_or_pull_request_thread": 1, "ambiguous_needs_more_evidence": 3}, "source": "graph_query_export", "motif_id": "unlinked_feedback_needs_evidence", "outcomes": {"ambiguous_needs_more_evidence": 6}, "polarity": "bad", "query_id": "unresolved_feedback", "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": 5, "chain_has_link_quality": 3, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 5, "thread_has_comment_chain": 1, "comment_chain_touches_file": 5, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 1}, "node_count": 14, "node_types": {"repo": 1, "thread": 1, "comment": 1, "pr_file": 5, "fix_outcome": 1, "issue_chain": 1, "link_quality": 3, "comment_chain": 1}, "query_type": "motif_query", "thread_key": "zhebinliu/knowledge-base#4", "issue_number": "4", "quality_tiers": {"unresolved": 3}, "repo_full_name": "zhebinliu/knowledge-base", "training_usage": "negative_or_unresolved", "source_motif_id": "graph-pattern-motif-thread-194ac8910e563b36", "graph_gold_label": "needs_more_evidence", "changed_file_labels": {"ui_or_frontend": 20}}, "text": "Graph query export: Human feedback without linked fix evidence\nQuery id: unresolved_feedback\nQuery type: motif_query\nIntent: Negative/unresolved examples that should not be hallucinated into fixes.\nMotif: unlinked_feedback_needs_evidence\nTraining usage: negative_or_unresolved\nGraph gold label: needs_more_evidence\nRepo: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#4\nEvidence:\nGraph motif: Human feedback exists without a linked fix\nMotif id: unlinked_feedback_needs_evidence\nPolarity: bad\nTraining usage: negative_or_unresolved\nSeverity: medium\nRepo: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#4\nGraph gold label: needs_more_evidence\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: zhebinliu/knowledge-base#4\nRepo: zhebinliu/knowledge-base\nIssue/PR number: 4\nGraph consistency label: needs_more_evidence\nNodes: 14\nEdges: 26\nNode types: {'pr_file': 5, 'link_quality': 3, 'thread': 1, 'repo': 1, 'comment': 1, 'comment_chain': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'thread_touches_file': 5, 'comment_chain_touches_file': 5, 'issue_chain_touches_file': 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': 5, 'ambiguous_needs_more_evidence': 3, 'thread_needs_classification': 2, 'issue_or_pull_request_thread': 1, 'human_feedback_general': 1, 'unlinked_human_feedback': 1}\nOutcomes: {'ambiguous_needs_more_evidence': 6}\nQuality tiers: {'unresolved': 3}\nCI labels: {}\nCurriculum targets:\n- Teach models to preserve unresolved human feedback instead of hallucinating fixes.\n- Build issue-to-regression examples where no accepted fix exists yet.\nAssumption checks:\n- Can a commit be linked by issue number, SHA, changed path, or time window?\n- If no link exists, is this explicitly labelled unresolved?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/zhebinliu/knowledge-base", "source_id": "graph-query-motif_query-e54dc20eebcf24ae", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/unresolved_feedback/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "zhebinliu/knowledge-base", "source_dataset": "graph_queries/unresolved_feedback", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_blueprint_gap", "level": "warning", "message": {"text": "Foundry mined blueprint gap alignment: zhebinliu/knowledge-base"}, "properties": {"repobilityId": 405876, "scanner": "foundry_dataset", "fingerprint": "a94c56729020287e12bfe04611c5a57792a751589893cb03e99b26aa84b1928d", "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": {"api_or_backend": 12, "ui_or_frontend": 3, "api_integration_gap": 1, "security_or_secrets": 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": 55, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 1, "thread_has_comment": 1, "thread_touches_file": 15, "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": 12, "thread_has_comment_chain": 1, "comment_chain_links_commit": 1, "comment_chain_touches_file": 12, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 1}, "node_count": 28, "node_types": {"repo": 1, "commit": 1, "thread": 1, "comment": 1, "pr_file": 15, "alignment": 1, "fix_outcome": 1, "issue_chain": 1, "link_quality": 4, "comment_chain": 1, "blueprint_finding": 1}, "query_type": "motif_query", "thread_key": "zhebinliu/knowledge-base#1", "issue_number": "1", "quality_tiers": {"assumption_check": 1, "weak_supervision": 3}, "repo_full_name": "zhebinliu/knowledge-base", "training_usage": "curriculum_gap", "source_motif_id": "graph-pattern-motif-thread-aff52bff2ad6446b", "graph_gold_label": "weak_supervision_needs_review", "changed_file_labels": {"api_or_backend": 48, "ui_or_frontend": 12}}, "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: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#1\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: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#1\nGraph gold label: weak_supervision_needs_review\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: zhebinliu/knowledge-base#1\nRepo: zhebinliu/knowledge-base\nIssue/PR number: 1\nGraph consistency label: weak_supervision_needs_review\nNodes: 28\nEdges: 55\nNode types: {'pr_file': 15, 'link_quality': 4, 'thread': 1, 'repo': 1, 'comment': 1, 'comment_chain': 1, 'commit': 1, 'issue_chain': 1, 'fix_outcome': 1, 'alignment': 1, 'blueprint_finding': 1}\nEdge types: {'thread_touches_file': 15, 'comment_chain_touches_file': 12, 'issue_chain_touches_file': 12, 'chain_has_link_quality': 4, 'repo_has_thread': 1, 'thread_has_comment': 1, 'thread_has_comment_chain': 1, 'comment_has_chain': 1, 'comment_chain_links_commit': 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: {'api_or_backend': 12, 'ui_or_frontend': 3, 'claimed_resolved_unverified': 3, '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, 'security_or_secrets': 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/zhebinliu/knowledge-base", "source_id": "graph-query-motif_query-6a6e7c510e78e8f2", "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": "zhebinliu/knowledge-base", "source_dataset": "graph_queries/blueprint_gap_alignment", "training_usage": "curriculum_gap"}}}, {"ruleId": "foundry_assumption_check", "level": "warning", "message": {"text": "Foundry mined assumption checks: zhebinliu/knowledge-base"}, "properties": {"repobilityId": 384414, "scanner": "foundry_dataset", "fingerprint": "639fd611f3844beb960a8320229abb5d4ee643edfeace970ff1da9a4f182d28c", "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": "zhebinliu/knowledge-base#4", "human_labels": ["human_feedback_general", "ui_or_frontend"], "issue_number": "4", "thread_label": "thread_needs_classification", "outcome_label": "ambiguous_needs_more_evidence", "source_backed": true, "max_confidence": 0.0, "repo_full_name": "zhebinliu/knowledge-base", "training_usage": "negative_or_unresolved", "confidence_tier": "unresolved", "source_chain_id": "evidence-chain-issue_chain-cc86bb4d912fe3a2", "helicopter_views": {"graphs": 2, "schemas": 2}, "artifact_families": {"ci": 3, "docs": 5}, "source_chain_kind": "issue_chain", "changed_file_count": 5, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"ui_or_frontend": 5}, "linked_commit_count": 0, "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_unresolved"], "linked_ci_commit_count": 0, "verification_artifact_count": 3, "design_schema_api_artifact_count": 0}, "text": "Comment chain pattern product: assumption_checks\nRepo: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#4\nOutcome: ambiguous_needs_more_evidence\nThread label: thread_needs_classification\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_unresolved\nChain evidence:\nIssue/PR evidence chain: zhebinliu/knowledge-base#4\nRepo: zhebinliu/knowledge-base\nThread label: thread_needs_classification\nOutcome: ambiguous_needs_more_evidence\nComment count: 1\nLinked commit count: 0\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 5\nLabels: {'human_feedback_general': 1}\nPolarities: {'neutral': 1}\nChanged file labels: {'ui_or_frontend': 5}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-b41fe077d8099d08\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"human_feedback_general\",\n    \"polarity\": \"neutral\",\n    \"url\": \"https://github.com/zhebinliu/knowledge-base/pull/4\",\n    \"text\": \"GitHub feedback: human_feedback_general\\nPolarity: neutral\\nKind: pull_request_body\\nRepo: zhebinliu/knowledge-base\\nAuthor: Lagoon2026 (User)\\nURL: https://github.com/zhebinliu/knowledge-base/pull/4\\nTitle: feat: \u65e7UI\u96c6\u6210\u4f1a\u8bae\u7eaa\u8981\u6a21\u677f\u529f\u80fd + \u6a21\u677f\u7ba1\u7406\u6d45\u8272\u4e3b\u9898\u9002\u914d\\nBody:\\n- TemplateSelector \u65b0\u589e variant='legacy' \u6d45\u8272\u4e3b\u9898\u652f\u6301\\r\\n- ConsoleMeetingDetail \u96c6\u6210 TemplateSelector\uff0c\u6709\u7eaa\u8981\u65f6\u663e\u793a\u6a21\u677f\u5bfc\u51fa\u5165\u53e3\\r\\n- ConsoleMeeting \u5217\u8868\u9875\u65b0\u589e\u300c\u6a21\u677f\u7ba1\u7406\u300d\u6309\u94ae\u5bfc\u822a\u5165\u53e3\\r\\n- TemplateManager \u65b0\u589e variant prop\uff0c\u65e7UI\u81ea\u52a8\u9002\u914d\u767d\u8272\u6d45\u8272\u4e3b\u9898\\r\\n- App.tsx \u8def\u7531\u4f20\u9012 variant \u53c2\u6570\uff0c\u751f\u4ea7\u73af\u5883\u81ea\u52a8\u5207\u6362\u6d45\u8272\u6a21\u5f0f\"\n  }\n]\nChanged files:\n[\n  {\n    \"id\": \"github-pr-file-file-86cfd816f7f8e449\",\n    \"filename\": \"frontend/src/App.tsx\",\n    \"label\": \"ui_or_frontend\",\n    \"status\": \"modified\",\n    \"additions\": 1,\n    \"deletions\": 1,\n    \"changes\": 2,\n    \"blob_url\": \"https://github.com/zhebinliu/knowledge-base/blob/3d800c3d349f0dfe97fd4400fc35344925759c63/frontend%2Fsrc%2FApp.tsx\"\n  },\n  {\n    \"id\": \"github-pr-file-file-ebaef3bbdb4e623d\",\n    \"filename\": \"meeting/frontend/src/components/TemplateSelector.tsx\",\n    \"label\": \"ui_or_frontend\",\n    \"status\": \"modified\",\n    \"additions\": 44,\n    \"deletions\": 19,\n    \"changes\": 63,\n    \"blob_url\": \"https://github.com/zhebinliu/knowledge-base/blob/3d800c3d349f0dfe97fd4400fc35344925759c63/meeting%2Ffrontend%2Fsrc%2Fcomponents%2FTemplateSelector.tsx\"\n  },\n  {\n    \"id\": \"github-pr-file-file-a2d7ac0bcbb02bd0\",\n    \"filename\": \"meeting/frontend/src/pages/console/ConsoleMeeting.tsx\",\n    \"label\": \"ui_or_frontend\",\n    \"status\": \"modified\",\n    \"additions\": 9,\n    \"deletions\": 1,\n    \"changes\": 10,\n    \"blob_url\": \"https://github.com/zhebinliu/knowledge-base/blob/3d800c3d349f0dfe97fd4400fc35344925759c63/meeting%2Ffrontend%2Fsrc%2Fpages%2Fconsole%2FConsoleMeeting.tsx\"\n  },\n  {\n    \"id\": \"github-pr-file-file-67150eb6bdcfdeb4\",\n    \"filename\": \"meeting/frontend/src/pages/console/ConsoleMeetingDetail.tsx\",\n    \"label\": \"ui_or_frontend\",\n    \"status\": \"modified\",\n    \"additions\": 8,\n    \"deletions\": 0,\n    \"cha\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/zhebinliu/knowledge-base", "source_id": "comment-chain-pattern-assumption_checks-97d6a4bee60cb545", "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": "zhebinliu/knowledge-base", "source_dataset": "comment_chain_patterns/assumption_checks", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_assumption_check", "level": "warning", "message": {"text": "Foundry mined assumption checks: zhebinliu/knowledge-base"}, "properties": {"repobilityId": 384413, "scanner": "foundry_dataset", "fingerprint": "093bd6b9f20c78a6e2678f29bfa1bf08cfda09f94747c0c18e903bc1ca4bbb54", "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": "zhebinliu/knowledge-base#3", "human_labels": ["human_feedback_general", "ui_or_frontend"], "issue_number": "3", "thread_label": "thread_needs_classification", "outcome_label": "ambiguous_needs_more_evidence", "source_backed": true, "max_confidence": 0.678, "repo_full_name": "zhebinliu/knowledge-base", "training_usage": "weak_supervision", "confidence_tier": "weak_supervision", "source_chain_id": "evidence-chain-issue_chain-59bd5098e4a9a6d3", "helicopter_views": {"graphs": 2, "schemas": 2}, "artifact_families": {"ci": 3, "docs": 5}, "source_chain_kind": "issue_chain", "changed_file_count": 1, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"ui_or_frontend": 1}, "linked_commit_count": 1, "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"], "linked_ci_commit_count": 0, "verification_artifact_count": 3, "design_schema_api_artifact_count": 0}, "text": "Comment chain pattern product: assumption_checks\nRepo: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#3\nOutcome: ambiguous_needs_more_evidence\nThread label: thread_needs_classification\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\nChain evidence:\nIssue/PR evidence chain: zhebinliu/knowledge-base#3\nRepo: zhebinliu/knowledge-base\nThread label: thread_needs_classification\nOutcome: ambiguous_needs_more_evidence\nComment count: 1\nLinked commit count: 1\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 1\nLabels: {'human_feedback_general': 1}\nPolarities: {'neutral': 1}\nChanged file labels: {'ui_or_frontend': 1}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-96a6d5887e879739\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"human_feedback_general\",\n    \"polarity\": \"neutral\",\n    \"url\": \"https://github.com/zhebinliu/knowledge-base/pull/3\",\n    \"text\": \"GitHub feedback: human_feedback_general\\nPolarity: neutral\\nKind: pull_request_body\\nRepo: zhebinliu/knowledge-base\\nAuthor: Lagoon2026 (User)\\nURL: https://github.com/zhebinliu/knowledge-base/pull/3\\nTitle: feat: \u751f\u4ea7\u73af\u5883\u4f1a\u8bae\u7eaa\u8981\u6539\u4e3a\u5de6\u53f3\u5206\u680f\u5e03\u5c40\\nBody:\\n- \u9876\u680f3\u89c6\u56fe\u5207\u6362: \u5206\u680f/\u6982\u89c8/\u64cd\u4f5c\uff08\u66ff\u4ee3\u65e76\u4e2a\u5e76\u5217Tab\uff09\\r\\n- \u5206\u680f\u89c6\u56fe\u5de6\u4fa7: \u7eaa\u8981/\u9700\u6c42\u6e05\u5355/\u5e72\u7cfb\u4eba\u5b50Tab\\r\\n- \u5206\u680f\u89c6\u56fe\u53f3\u4fa7: \u539f\u6587/AI\u6da6\u8272\u5b50Tab\\r\\n- \u4fdd\u6301\u539f\u6709UI\u98ce\u683c\uff0c\u4ec5\u8c03\u6574\u5e03\u5c40\u7ed3\u6784\"\n  }\n]\nChanged files:\n[\n  {\n    \"id\": \"github-pr-file-file-41a6b5035247e9fd\",\n    \"filename\": \"meeting/frontend/src/pages/console/ConsoleMeetingDetail.tsx\",\n    \"label\": \"ui_or_frontend\",\n    \"status\": \"modified\",\n    \"additions\": 144,\n    \"deletions\": 22,\n    \"changes\": 166,\n    \"blob_url\": \"https://github.com/zhebinliu/knowledge-base/blob/f29b2c7050ade12b284ccb8f50bde4fe44f05c1a/meeting%2Ffrontend%2Fsrc%2Fpages%2Fconsole%2FConsoleMeetingDetail.tsx\"\n  }\n]\nLinked chain ids:\n[\"evidence-chain-comment_to_commit-e4ab73aeee1692af\"]\nSource graph evidence:\nSource evidence repo graph summary\nRepo: zhebinliu/knowledge-base\nGraph label: source_backed_multi_signal_graph\nNodes: 16\nEdges: 24\nNode types: {\"cooccurrence_profile\": 1, \"github_repo_summary\": 1, \"helicopter_repo_view\": 4, \"repo\": 1, \"source_artifact\": 8, \"source_bundle\": 1}\nEdge types: {\"artifact_needs_claim_verification\": 5, \"artifact_supports_verification\": 3, \"repo_has_cooccurrence_profile\": 1, \"repo_has_github_evidence_summary\": 1, \"repo_has_graphs_helicopter_view\": 2, \"repo_has_schemas_helicopter_view\": 2, \"repo_has_source_artifact\": 8, \"repo_has_source_bundle\": 1, \"source_bundle_uses_cooccurrence_profile\": 1}\nArtifact families: {\"ci\": 3, \"docs\": 5}\nHelicopter views: {\"graphs\": 2, \"schemas\": 2}\nBundle labels: {\"source_backed_security_guardrail_bundle\": 1}\nCo-occurrence labels: {\"security_guardrail_cluster\": 1}", "source": "foundry_mined_dataset", "repo_url": "https://github.com/zhebinliu/knowledge-base", "source_id": "comment-chain-pattern-assumption_checks-71c7736e7cbcdf22", "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": "zhebinliu/knowledge-base", "source_dataset": "comment_chain_patterns/assumption_checks", "training_usage": "weak_supervision"}}}, {"ruleId": "foundry_assumption_check", "level": "warning", "message": {"text": "Foundry mined assumption checks: zhebinliu/knowledge-base"}, "properties": {"repobilityId": 384412, "scanner": "foundry_dataset", "fingerprint": "a6373bb8ac9f2930ec8dcdcb9fd2165fb33f80b80f5ea5162df0638de9e2d81a", "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": "zhebinliu/knowledge-base#2", "human_labels": ["api_or_backend", "human_feedback_general", "ui_or_frontend"], "issue_number": "2", "thread_label": "thread_needs_classification", "outcome_label": "ambiguous_needs_more_evidence", "source_backed": true, "max_confidence": 0.6, "repo_full_name": "zhebinliu/knowledge-base", "training_usage": "weak_supervision", "confidence_tier": "weak_supervision", "source_chain_id": "evidence-chain-issue_chain-d9a9b72c4202785b", "helicopter_views": {"graphs": 2, "schemas": 2}, "artifact_families": {"ci": 3, "docs": 5}, "source_chain_kind": "issue_chain", "changed_file_count": 9, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"api_or_backend": 5, "ui_or_frontend": 4}, "linked_commit_count": 1, "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"], "linked_ci_commit_count": 0, "verification_artifact_count": 3, "design_schema_api_artifact_count": 0}, "text": "Comment chain pattern product: assumption_checks\nRepo: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#2\nOutcome: ambiguous_needs_more_evidence\nThread label: thread_needs_classification\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\nChain evidence:\nIssue/PR evidence chain: zhebinliu/knowledge-base#2\nRepo: zhebinliu/knowledge-base\nThread label: thread_needs_classification\nOutcome: ambiguous_needs_more_evidence\nComment count: 1\nLinked commit count: 1\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 9\nLabels: {'human_feedback_general': 1}\nPolarities: {'neutral': 1}\nChanged file labels: {'api_or_backend': 5, 'ui_or_frontend': 4}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-7dcb31b83af6785f\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"human_feedback_general\",\n    \"polarity\": \"neutral\",\n    \"url\": \"https://github.com/zhebinliu/knowledge-base/pull/2\",\n    \"text\": \"GitHub feedback: human_feedback_general\\nPolarity: neutral\\nKind: pull_request_body\\nRepo: zhebinliu/knowledge-base\\nAuthor: Lagoon2026 (User)\\nURL: https://github.com/zhebinliu/knowledge-base/pull/2\\nTitle: \u4fee\u590ddocx\u5bfc\u51fa\u6587\u4ef6\u540e\u7f00\u53d8\u4e3a.docx.json\u7684\u95ee\u9898\\nBody:\\n\"\n  }\n]\nChanged files:\n[\n  {\n    \"id\": \"github-pr-file-file-b2e5d015bc82950c\",\n    \"filename\": \"meeting/backend/api/meeting.py\",\n    \"label\": \"api_or_backend\",\n    \"status\": \"modified\",\n    \"additions\": 59,\n    \"deletions\": 10,\n    \"changes\": 69,\n    \"blob_url\": \"https://github.com/zhebinliu/knowledge-base/blob/bf7b3811f4ea5f99bab87c4da99822972e22fd63/meeting%2Fbackend%2Fapi%2Fmeeting.py\"\n  },\n  {\n    \"id\": \"github-pr-file-file-3b4a646d992ebe7a\",\n    \"filename\": \"meeting/backend/services/meeting/pipeline.py\",\n    \"label\": \"api_or_backend\",\n    \"status\": \"modified\",\n    \"additions\": 16,\n    \"deletions\": 8,\n    \"changes\": 24,\n    \"blob_url\": \"https://github.com/zhebinliu/knowledge-base/blob/bf7b3811f4ea5f99bab87c4da99822972e22fd63/meeting%2Fbackend%2Fservices%2Fmeeting%2Fpipeline.py\"\n  },\n  {\n    \"id\": \"github-pr-file-file-00d9b3dac8662574\",\n    \"filename\": \"meeting/backend/services/meeting/storage.py\",\n    \"label\": \"api_or_backend\",\n    \"status\": \"modified\",\n    \"additions\": 36,\n    \"deletions\": 5,\n    \"changes\": 41,\n    \"blob_url\": \"https://github.com/zhebinliu/knowledge-base/blob/bf7b3811f4ea5f99bab87c4da99822972e22fd63/meeting%2Fbackend%2Fservices%2Fmeeting%2Fstorage.py\"\n  },\n  {\n    \"id\": \"github-pr-file-file-eb18aac0e170f4e8\",\n    \"filename\": \"meeting/backend/tasks/meeting_tasks.py\",\n    \"label\": \"api_or_backend\",\n    \"status\": \"modified\",\n    \"additions\": 2,\n    \"deletions\": 0,\n    \"changes\": 2,\n    \"blob_url\": \"https://github.com/zhebinliu/knowledge-base/blob/bf7b3811f4ea5f99bab87c4da99822972e22fd63/meeting%2Fbackend%2Ftasks%2Fmeeting_tasks.py\"\n  },\n  {\n    \"id\": \"github-pr-file-file-f1fa7e1c3b263b86\",\n    \"filename\": \"meeting/\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/zhebinliu/knowledge-base", "source_id": "comment-chain-pattern-assumption_checks-40db407f4641d0d8", "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": "zhebinliu/knowledge-base", "source_dataset": "comment_chain_patterns/assumption_checks", "training_usage": "weak_supervision"}}}, {"ruleId": "foundry_assumption_check", "level": "warning", "message": {"text": "Foundry mined assumption checks: zhebinliu/knowledge-base"}, "properties": {"repobilityId": 384411, "scanner": "foundry_dataset", "fingerprint": "580304ec086d43e9e2d2784e06c78b6b416054f234daf359d0e972efccac72e2", "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": "zhebinliu/knowledge-base#1", "human_labels": ["api_integration_gap", "api_or_backend", "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.67, "repo_full_name": "zhebinliu/knowledge-base", "training_usage": "weak_supervision", "confidence_tier": "weak_supervision", "source_chain_id": "evidence-chain-issue_chain-bbf94af0c4f000cd", "helicopter_views": {"graphs": 2, "schemas": 2}, "artifact_families": {"ci": 3, "docs": 5}, "source_chain_kind": "issue_chain", "changed_file_count": 15, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"api_or_backend": 12, "ui_or_frontend": 3}, "linked_commit_count": 1, "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": 3, "design_schema_api_artifact_count": 0}, "text": "Comment chain pattern product: assumption_checks\nRepo: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#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: zhebinliu/knowledge-base#1\nRepo: zhebinliu/knowledge-base\nThread label: thread_has_human_issue_and_fix_context\nOutcome: claimed_resolved_unverified\nComment count: 1\nLinked commit count: 1\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 15\nLabels: {'api_integration_gap': 1}\nPolarities: {'bad': 1}\nChanged file labels: {'api_or_backend': 12, 'ui_or_frontend': 3}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-f91974054326984f\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"api_integration_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/zhebinliu/knowledge-base/pull/1\",\n    \"text\": \"GitHub feedback: api_integration_gap\\nPolarity: bad\\nKind: pull_request_body\\nRepo: zhebinliu/knowledge-base\\nAuthor: zhebinliu (User)\\nURL: https://github.com/zhebinliu/knowledge-base/pull/1\\nTitle: feat(output): \u542f\u52a8\u4f1a PPT \u53cc\u8f68\u2014\u2014pptxgen \u751f\u771f .pptx + htmlppt \u4fdd\u7559 HTML \u7248\\nBody:\\npptxgen \u7ba1\u7ebf\uff08\u65b0\uff09\\r\\n- \u65b0\u589e backend/services/pptx_codeexec.py\uff1asandboxed asyncio subprocess\uff0c\u8dd1 LLM \u751f\u6210\u7684 python-pptx \u4ee3\u7801\u751f\u6210 out.pptx\\r\\n- generate_kickoff_pptx \u8d70 PPTGEN_PYTHON_SYSTEM \u7cfb\u7edf\u63d0\u793a\uff0c\u5f3a\u7ea6\u675f\u786c\u6027\u6805\u683c\u3001\u54c1\u724c\u8272\u677f\u3001matplotlib \u6bd4\u4f8b/\u5b57\u4f53\u3001\u8868\u683c\u7981\u9ed8\u8ba4\u84dd\\r\\n- \u4e2d\u6587\u5b57\u4f53\u6539 ZH_FONT=\\\"Microsoft YaHei\\\"\uff08\u9ed1\u4f53\u7cfb\uff0c\u8de8 Win/Mac\uff09\uff0cmatplotlib \u5b57\u4f53\u6539 'Noto Sans CJK JP' \u4f18\u5148\uff08\u5bb9\u5668 .ttc \u4ec5\u6ce8\u518c JP face\uff09\\r\\n- Dockerfile \u52a0 fonts-noto-cjk\uff1brequirements \u52a0 matplotlib==3.9.*\\r\\n\\r\\nhtmlppt \u7ba1\u7ebf\uff08\u6062\u590d\uff09\\r\\n- \u65b0\u589e kickoff_html bundle kind \u4e0e generate_kickoff_html\uff0c\u590d\u7528\u65e2\u6709 HTML_PPTX_SYSTEM\\r\\n- API/Celery/agent_settings/config_service/brief_service \u5168\u94fe\u8def\u53cc\u8f68\\r\\n- \u524d\u7aef\u9879\u76ee\u8be6\u60c5\u9875\u9636\u6bb5\u5361\u5206\u300c\u542f\u52a8\u4f1a\u00b7PPT\u300d+\u300c\u542f\u52a8\u4f1a\u00b7HTML\u300d\uff1bOutputAgentsTab \u540e\u53f0\u4e24\u4e2a skill \u90fd\u53ef\u89c1\\r\\n\\r\\nBrief \u62bd\u53d6\u5065\u58ee\u6027\\r\\n- _parse_brief_response/merge/render \u4e09\u5904\u52a0 isinstance(cell, dict) \u5bb9\u9519\uff1bLLM \u5076\u5c14\u628a cell \u8fd4\u6210\u88f8 list/str \u65f6\u4e0d\u518d 'list' object has no attribute 'get'\"\n  }\n]\nChanged files:\n[\n  {\n    \"id\": \"github-pr-file-file-4ddd4a3e86c1a3c2\",\n    \"filename\": \"backend/Dockerfile\",\n    \"label\": \"api_or_backend\",\n    \"status\": \"modified\",\n    \"additions\": 2,\n    \"deletions\": 1,\n    \"changes\": 3,\n    \"blob_url\": \"https://github.com/zhebinliu/knowledge-base/blob/d89e8e254daf7880a4eda4a3f2b00c0b45e0bfdd/backend%2FDockerfile\"\n  },\n  {\n    \"id\": \"github-pr-file-file-e2a8649eb33f350e\",\n    \"filename\": \"backend/agents/output_chat.py\",\n    \"label\": \"api_or_backend\",\n    \"status\": \"modified\",\n    \"additions\": 2,\n    \"deletions\": 1,\n    \"changes\": 3,\n    \"blob_url\": \"https://github.com/zhebinliu/knowledge-base/blob/d89e8e254daf7880a4eda4a3f2b00c0b45e0bfdd/backend%2Fagents%2Foutput_chat.py\"\n  },\n  {\n    \"id\": \"github-pr-file-file-ecb3001da94edc27\",\n    \"filename\": \"backend/api/a\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/zhebinliu/knowledge-base", "source_id": "comment-chain-pattern-assumption_checks-ed8b0ea953b45f39", "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": "zhebinliu/knowledge-base", "source_dataset": "comment_chain_patterns/assumption_checks", "training_usage": "weak_supervision"}}}, {"ruleId": "foundry_bad_chain", "level": "error", "message": {"text": "Foundry mined bad chains: zhebinliu/knowledge-base"}, "properties": {"repobilityId": 392371, "scanner": "foundry_dataset", "fingerprint": "79cb0bd67fd001fb62881af415a1241ce2c468d2cde75e209d46418fc3b79444", "category": "practices", "severity": "high", "confidence": 0.84, "triageState": "open", "verdict": "confirmed", "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": "bad_chains", "synthetic": false, "thread_key": "zhebinliu/knowledge-base#5", "human_labels": ["api_or_backend", "security_auth_secret", "ui_or_frontend"], "issue_number": "5", "thread_label": "thread_has_human_issue_without_fix_context", "outcome_label": "not_resolved_or_not_observed", "source_backed": true, "max_confidence": 0.0, "repo_full_name": "zhebinliu/knowledge-base", "training_usage": "negative_or_unresolved", "confidence_tier": "unresolved", "source_chain_id": "evidence-chain-issue_chain-b1b6808fa29bf711", "helicopter_views": {"graphs": 2, "schemas": 2}, "artifact_families": {"ci": 3, "docs": 5}, "source_chain_kind": "issue_chain", "changed_file_count": 19, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"api_or_backend": 11, "ui_or_frontend": 8}, "linked_commit_count": 0, "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_unresolved", "high_risk_human_feedback_label"], "linked_ci_commit_count": 0, "verification_artifact_count": 3, "design_schema_api_artifact_count": 0}, "text": "Comment chain pattern product: bad_chains\nRepo: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#5\nOutcome: not_resolved_or_not_observed\nThread label: thread_has_human_issue_without_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_unresolved, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: zhebinliu/knowledge-base#5\nRepo: zhebinliu/knowledge-base\nThread label: thread_has_human_issue_without_fix_context\nOutcome: not_resolved_or_not_observed\nComment count: 1\nLinked commit count: 0\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 19\nLabels: {'security_auth_secret': 1}\nPolarities: {'bad': 1}\nChanged file labels: {'api_or_backend': 11, 'ui_or_frontend': 8}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-e6b791d518d67c0f\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"security_auth_secret\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/zhebinliu/knowledge-base/pull/5\",\n    \"text\": \"GitHub feedback: security_auth_secret\\nPolarity: bad\\nKind: pull_request_body\\nRepo: zhebinliu/knowledge-base\\nAuthor: Lagoon2026 (User)\\nURL: https://github.com/zhebinliu/knowledge-base/pull/5\\nTitle: feat: \u98de\u4e66\u51ed\u8bc1\u79fb\u81f3\u4e2a\u4eba\u8bbe\u7f6e + Secret \u52a0\u5bc6\u5b58\u50a8 + \u51ed\u8bc1\u5220\u9664\u529f\u80fd\\nBody:\\n- \u65b0\u589e /personal-settings \u8def\u7531\uff08\u65b0\u65e7 UI \u5747\u652f\u6301\uff09\\r\\n- FeishuTab \u4ece\u7cfb\u7edf\u8bbe\u7f6e\u79fb\u81f3\u4e2a\u4eba\u8bbe\u7f6e\uff08\u6240\u6709\u7528\u6237\u53ef\u89c1\uff0c\u975e adminOnly\uff09\\r\\n- \u65b0\u589e PersonalSettings.tsx\uff08legacy + redesign\uff09\\r\\n- \u4fa7\u8fb9\u680f\u5bfc\u822a\u65b0\u589e\u300c\u4e2a\u4eba\u8bbe\u7f6e\u300d\u5165\u53e3\\r\\n- Secret \u4f7f\u7528 Fernet \u52a0\u5bc6\u5b58\u50a8\uff0c\u65b0\u589e feishu_crypto \u6a21\u5757\\r\\n- \u65b0\u589e feishu_credentials API\uff08save/delete/get\uff09\\r\\n- ConsoleMeetingDetail + \u540e\u7aef\u63d0\u793a\u6587\u6848\u66f4\u65b0\u4e3a\u300c\u4e2a\u4eba\u8bbe\u7f6e\u300d\"\n  }\n]\nChanged files:\n[\n  {\n    \"id\": \"github-pr-file-file-68a950d3db3efbc6\",\n    \"filename\": \"backend/api/feishu_credentials.py\",\n    \"label\": \"api_or_backend\",\n    \"status\": \"added\",\n    \"additions\": 83,\n    \"deletions\": 0,\n    \"changes\": 83,\n    \"blob_url\": \"https://github.com/zhebinliu/knowledge-base/blob/e626304f5c7e83751d6d7ee00a349ff977eddc9d/backend%2Fapi%2Ffeishu_credentials.py\"\n  },\n  {\n    \"id\": \"github-pr-file-file-cfa4f74a037352d8\",\n    \"filename\": \"backend/config.py\",\n    \"label\": \"api_or_backend\",\n    \"status\": \"modified\",\n    \"additions\": 8,\n    \"deletions\": 0,\n    \"changes\": 8,\n    \"blob_url\": \"https://github.com/zhebinliu/knowledge-base/blob/e626304f5c7e83751d6d7ee00a349ff977eddc9d/backend%2Fconfig.py\"\n  },\n  {\n    \"id\": \"github-pr-file-file-dac7503d4e487e63\",\n    \"filename\": \"backend/main.py\",\n    \"label\": \"api_or_backend\",\n    \"status\": \"modified\",\n    \"additions\": 3,\n    \"deletions\": 0,\n    \"changes\": 3,\n    \"blob_url\": \"https://github.com/zhebinliu/knowledge-base/blob/e626304f5c7e83751d6d7ee00a349ff977eddc9d/backend%2Fmain.py\"\n  },\n  {\n    \"id\": \"github-pr-file-file-1863c582890e6b56\",\n    \"filename\": \"backend/requirements.txt\",\n    \"label\": \"api_or_backend\",\n    \"status\": \"modified\",\n    \"additions\": 2,\n    \"deletions\": 0,\n    \"changes\": 2,\n    \"blob_url\": \"https://github.com/zhebin\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/zhebinliu/knowledge-base", "source_id": "comment-chain-pattern-bad_chains-d646db1ee89d25a1", "synthetic": false, "gold_label": "", "graph_label": "source_backed_multi_signal_graph", "source_path": "/data/distillate/foundry_data/comment_chain_patterns/bad_chains/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "zhebinliu/knowledge-base", "source_dataset": "comment_chain_patterns/bad_chains", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_auth_guardrail_gap", "level": "error", "message": {"text": "Foundry mined security auth guardrail gaps: zhebinliu/knowledge-base"}, "properties": {"repobilityId": 415198, "scanner": "foundry_dataset", "fingerprint": "46b568c251933ad13f7b9417dfbb8c41ccbf9c1cc48b7c3015f1c4cd1d0406d7", "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": {"api_or_backend": 11, "ui_or_frontend": 8, "security_auth_secret": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 3, "human_reported_issue_no_linked_fix": 1, "thread_has_human_issue_without_fix_context": 2}, "source": "graph_query_export", "motif_id": "security_auth_without_guardrails", "outcomes": {"not_resolved_or_not_observed": 6}, "polarity": "bad", "query_id": "security_auth_guardrail_gaps", "severity": "critical", "ci_labels": {}, "synthetic": false, "edge_count": 54, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 1, "thread_has_comment": 1, "thread_touches_file": 19, "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_touches_file": 12, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 1}, "node_count": 28, "node_types": {"repo": 1, "thread": 1, "comment": 1, "pr_file": 19, "fix_outcome": 1, "issue_chain": 1, "link_quality": 3, "comment_chain": 1}, "query_type": "motif_query", "thread_key": "zhebinliu/knowledge-base#5", "issue_number": "5", "quality_tiers": {"unresolved": 3}, "repo_full_name": "zhebinliu/knowledge-base", "training_usage": "assumption_check", "source_motif_id": "graph-pattern-motif-thread-2dc6139641ed8020", "graph_gold_label": "needs_more_evidence", "changed_file_labels": {"api_or_backend": 44, "ui_or_frontend": 32}}, "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: needs_more_evidence\nRepo: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#5\nEvidence:\nGraph motif: Security/auth change without enough guardrails\nMotif id: security_auth_without_guardrails\nPolarity: bad\nTraining usage: assumption_check\nSeverity: critical\nRepo: zhebinliu/knowledge-base\nThread: zhebinliu/knowledge-base#5\nGraph gold label: needs_more_evidence\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: zhebinliu/knowledge-base#5\nRepo: zhebinliu/knowledge-base\nIssue/PR number: 5\nGraph consistency label: needs_more_evidence\nNodes: 28\nEdges: 54\nNode types: {'pr_file': 19, 'link_quality': 3, 'thread': 1, 'repo': 1, 'comment': 1, 'comment_chain': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'thread_touches_file': 19, 'comment_chain_touches_file': 12, 'issue_chain_touches_file': 12, '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: {'api_or_backend': 11, 'ui_or_frontend': 8, 'not_resolved_or_not_observed': 3, 'thread_has_human_issue_without_fix_context': 2, 'issue_or_pull_request_thread': 1, 'security_auth_secret': 1, 'human_reported_issue_no_linked_fix': 1}\nOutcomes: {'not_resolved_or_not_observed': 6}\nQuality tiers: {'unresolved': 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/zhebinliu/knowledge-base", "source_id": "graph-query-motif_query-af91c8686117ccef", "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": "zhebinliu/knowledge-base", "source_dataset": "graph_queries/security_auth_guardrail_gaps", "training_usage": "assumption_check"}}}, {"ruleId": "scanner-512606733d82de21", "level": "note", "message": {"text": "Possibly dead Python function: sync_action_items_to_bitable"}, "properties": {"repobilityId": "dbbb02e0dde4a91f", "scanner": "scanner-primary", "fingerprint": "512606733d82de21", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "meeting/backend/services/meeting/feishu.py:774"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-74956ed93aef49a4", "level": "note", "message": {"text": "Possibly dead Python function: run_challenge_batch"}, "properties": {"repobilityId": "73bd424a0ccbb931", "scanner": "scanner-primary", "fingerprint": "74956ed93aef49a4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/agents/challenger_agent.py:595"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e2545bddcd617449", "level": "note", "message": {"text": "Possibly dead Python function: has_web_search_provider_sync"}, "properties": {"repobilityId": "014487285736f720", "scanner": "scanner-primary", "fingerprint": "e2545bddcd617449", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/services/web_search_service.py:122"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7005a3433e2ca255", "level": "note", "message": {"text": "Possibly dead Python function: require_admin"}, "properties": {"repobilityId": "3c06db2e25566bf7", "scanner": "scanner-primary", "fingerprint": "7005a3433e2ca255", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/services/auth.py:184"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-59c6a9c9437ddc68", "level": "note", "message": {"text": "Possibly dead Python function: prepend_revision_memories_sync"}, "properties": {"repobilityId": "4466bd6309bb806f", "scanner": "scanner-primary", "fingerprint": "59c6a9c9437ddc68", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/services/revision_learning.py:203"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7ef084bf878cfeec", "level": "note", "message": {"text": "Possibly dead Python function: dep"}, "properties": {"repobilityId": "97535eb9200fecfe", "scanner": "scanner-primary", "fingerprint": "7ef084bf878cfeec", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/services/project_acl.py:94"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a0a13cd111b7d4bf", "level": "note", "message": {"text": "Possibly dead Python function: validate_and_consume"}, "properties": {"repobilityId": "59b50aefbb22d71e", "scanner": "scanner-primary", "fingerprint": "a0a13cd111b7d4bf", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/services/security/invite_code.py:88"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bc960260bf07f587", "level": "note", "message": {"text": "Possibly dead Python function: cleanup_expired_captchas"}, "properties": {"repobilityId": "3e1c8c478264c5d0", "scanner": "scanner-primary", "fingerprint": "bc960260bf07f587", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/services/security/captcha.py:118"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d2e75249d86fb73f", "level": "note", "message": {"text": "Possibly dead Python function: evaluate_password_checks"}, "properties": {"repobilityId": "2d65994ea1d1bd8f", "scanner": "scanner-primary", "fingerprint": "d2e75249d86fb73f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/services/security/password_policy.py:48"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-844606c51a9e556c", "level": "note", "message": {"text": "Possibly dead Python function: bootstrap_all"}, "properties": {"repobilityId": "bb24f89235b933ea", "scanner": "scanner-primary", "fingerprint": "844606c51a9e556c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/services/qixin_gateway/connection_manager.py:43"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a4a67b3adcaae687", "level": "note", "message": {"text": "Possibly dead Python function: stop_all"}, "properties": {"repobilityId": "1ae7625ff92e0d14", "scanner": "scanner-primary", "fingerprint": "a4a67b3adcaae687", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/services/qixin_gateway/connection_manager.py:136"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ebef0bca81c4f4f1", "level": "note", "message": {"text": "Possibly dead Python function: list_connected"}, "properties": {"repobilityId": "2cc40cba3bf6ea9e", "scanner": "scanner-primary", "fingerprint": "ebef0bca81c4f4f1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/services/qixin_gateway/connection_manager.py:144"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-75812d1ed8236de2", "level": "note", "message": {"text": "Possibly dead Python function: critical_modules_for_industry"}, "properties": {"repobilityId": "3b6c958b78bdecf2", "scanner": "scanner-primary", "fingerprint": "75812d1ed8236de2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/services/agentic/insight_modules.py:552"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1682cbec73ff8447", "level": "note", "message": {"text": "Possibly dead Python function: repl"}, "properties": {"repobilityId": "6f5d3779bbb8be8b", "scanner": "scanner-primary", "fingerprint": "1682cbec73ff8447", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/services/agentic/executor.py:328"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-09f81889ac838630", "level": "note", "message": {"text": "Possibly dead Python function: list_outline_modules"}, "properties": {"repobilityId": "1eda22016956c017", "scanner": "scanner-primary", "fingerprint": "09f81889ac838630", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/services/agentic/outline_modules.py:310"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-da46607ffb1cd4d0", "level": "note", "message": {"text": "Possibly dead Python function: critical_outline_modules"}, "properties": {"repobilityId": "025f7765bafb6905", "scanner": "scanner-primary", "fingerprint": "da46607ffb1cd4d0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/services/agentic/outline_modules.py:315"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2178748852f966b9", "level": "note", "message": {"text": "Possibly dead Python function: generate_survey_for_role"}, "properties": {"repobilityId": "b7563447e1924792", "scanner": "scanner-primary", "fingerprint": "2178748852f966b9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/services/agentic/runner.py:1732"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-492631911a8da276", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/UploadOptionsModal.tsx:68"}, "properties": {"repobilityId": "fdf33d3c53ea9a95", "scanner": "scanner-primary", "fingerprint": "492631911a8da276", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3361425a032d840b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/OutputChatPanel.tsx:181"}, "properties": {"repobilityId": "26d7a70ec3c3d184", "scanner": "scanner-primary", "fingerprint": "3361425a032d840b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-69a56616b7fa672d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/BriefDrawer.tsx:162"}, "properties": {"repobilityId": "b77d1b2bc4dd23ac", "scanner": "scanner-primary", "fingerprint": "69a56616b7fa672d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-31ff15a02c6fe11b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/DataTable.tsx:260"}, "properties": {"repobilityId": "ee08580ba18f76f9", "scanner": "scanner-primary", "fingerprint": "31ff15a02c6fe11b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d75604445ea95011", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Layout.tsx:265"}, "properties": {"repobilityId": "4d0ca9e37bee02cd", "scanner": "scanner-primary", "fingerprint": "d75604445ea95011", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cc6abe7614a541fe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/AgenticGapFiller.tsx:353"}, "properties": {"repobilityId": "ed5fd4a5b5e6f81f", "scanner": "scanner-primary", "fingerprint": "cc6abe7614a541fe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f2d31d158d12a984", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/settings/SkillsTab.tsx:230"}, "properties": {"repobilityId": "d4d86dbf1819704e", "scanner": "scanner-primary", "fingerprint": "f2d31d158d12a984", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5a89f1bf70d2abc9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/settings/OutputAgentsTab.tsx:131"}, "properties": {"repobilityId": "ca730e989c763128", "scanner": "scanner-primary", "fingerprint": "5a89f1bf70d2abc9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-df4c8d350d7982e3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/system-config/StageFlowTab.tsx:394"}, "properties": {"repobilityId": "26109211b161b7b8", "scanner": "scanner-primary", "fingerprint": "df4c8d350d7982e3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3f3fe2d47a20dbde", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/markdown/ReportMarkdown.tsx:222"}, "properties": {"repobilityId": "ea7a78447a8fa083", "scanner": "scanner-primary", "fingerprint": "3f3fe2d47a20dbde", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-64394fbc0051926e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/DocChecklist.tsx:432"}, "properties": {"repobilityId": "f7654c55424c1266", "scanner": "scanner-primary", "fingerprint": "64394fbc0051926e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-43a81b79bd3fdbc4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/CenterWorkspace.tsx:289"}, "properties": {"repobilityId": "57aff700cf4b0d06", "scanner": "scanner-primary", "fingerprint": "43a81b79bd3fdbc4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9c47f39be3898775", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/ProjectStakeholdersDrawer.tsx:142"}, "properties": {"repobilityId": "4202f5f5f07b8669", "scanner": "scanner-primary", "fingerprint": "9c47f39be3898775", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cca3741443238872", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/FloatingQA.tsx:274"}, "properties": {"repobilityId": "3c4920a6f6dec582", "scanner": "scanner-primary", "fingerprint": "cca3741443238872", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c41b37a316076af", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/ProjectMeetingsDrawer.tsx:127"}, "properties": {"repobilityId": "520696a0d0bc95a9", "scanner": "scanner-primary", "fingerprint": "1c41b37a316076af", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9e2750332f910f33", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/CollaboratorsModal.tsx:160"}, "properties": {"repobilityId": "96902fd64baca0f7", "scanner": "scanner-primary", "fingerprint": "9e2750332f910f33", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1a4dba35a4aab59b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/research/ResearchWorkspace.tsx:265"}, "properties": {"repobilityId": "e50b89d2514f6b3c", "scanner": "scanner-primary", "fingerprint": "1a4dba35a4aab59b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fb8a46efced6a97c", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/components/console/research/ResearchWorkspace.tsx:770"}, "properties": {"repobilityId": "3090545d36990d52", "scanner": "scanner-primary", "fingerprint": "fb8a46efced6a97c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-6b964a450aa24353", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/components/console/research/ResearchQuestionnaire.tsx:490"}, "properties": {"repobilityId": "f88af011b765ac10", "scanner": "scanner-primary", "fingerprint": "6b964a450aa24353", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-cb722f4324dcde1b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/console/implementation/ImplementationWorkspace.tsx:425"}, "properties": {"repobilityId": "ade8738e0b6d4aa8", "scanner": "scanner-primary", "fingerprint": "cb722f4324dcde1b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-157a65f7f27e5cb4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/qixin/QixinDrawer.tsx:109"}, "properties": {"repobilityId": "c1ee9f29ce9c16c6", "scanner": "scanner-primary", "fingerprint": "157a65f7f27e5cb4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c3b2da81ab3bb0bb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Dashboard.tsx:355"}, "properties": {"repobilityId": "ebc7c87be6f68b97", "scanner": "scanner-primary", "fingerprint": "c3b2da81ab3bb0bb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-af1fd3c78b3b9904", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Demo.tsx:218"}, "properties": {"repobilityId": "c896cfd3eb69fce2", "scanner": "scanner-primary", "fingerprint": "af1fd3c78b3b9904", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3ceb3bc4d519e81b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ProjectDetail.tsx:124"}, "properties": {"repobilityId": "5c6c4edd51a816bc", "scanner": "scanner-primary", "fingerprint": "3ceb3bc4d519e81b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6285b0fd1e41bb1c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/DesignSystem.tsx:870"}, "properties": {"repobilityId": "854279072c66ac09", "scanner": "scanner-primary", "fingerprint": "6285b0fd1e41bb1c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fcc26e79ca29f751", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Documents.tsx:61"}, "properties": {"repobilityId": "9bde62c340dfb6fc", "scanner": "scanner-primary", "fingerprint": "fcc26e79ca29f751", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9b68a5432e9eb243", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Projects.tsx:162"}, "properties": {"repobilityId": "6c60f4fc07028949", "scanner": "scanner-primary", "fingerprint": "9b68a5432e9eb243", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3ecc12f0d536f793", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/demo/InsightDemo.tsx:560"}, "properties": {"repobilityId": "79d027e89a4623fc", "scanner": "scanner-primary", "fingerprint": "3ecc12f0d536f793", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7a95b9cd0baa287d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/demo/SurveyDemo.tsx:661"}, "properties": {"repobilityId": "99c3aad182b0ce98", "scanner": "scanner-primary", "fingerprint": "7a95b9cd0baa287d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-378275aa77217062", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/console/ConsoleProjects.tsx:121"}, "properties": {"repobilityId": "434db88abbf7f939", "scanner": "scanner-primary", "fingerprint": "378275aa77217062", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a4cfe6013883dfaa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/console/ConsoleProjectDetail.tsx:363"}, "properties": {"repobilityId": "a11a65b8ced6c002", "scanner": "scanner-primary", "fingerprint": "a4cfe6013883dfaa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b57927e5b1ffa476", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/console/ConsoleMeetingDetail.tsx:1873"}, "properties": {"repobilityId": "ef79506f43153c86", "scanner": "scanner-primary", "fingerprint": "b57927e5b1ffa476", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3b09454fc04a1e10", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/pages/console/ConsoleMeetingDetail.tsx:2397"}, "properties": {"repobilityId": "ed5015b09ee97d82", "scanner": "scanner-primary", "fingerprint": "3b09454fc04a1e10", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-697cdca74e1c6d6c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/console/ConsoleMeetingDetail.tsx:1373"}, "properties": {"repobilityId": "a54ad967895f88c6", "scanner": "scanner-primary", "fingerprint": "697cdca74e1c6d6c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3815994cd3dff2d0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/console/ConsoleHome.tsx:183"}, "properties": {"repobilityId": "7ba77dacf2fe387e", "scanner": "scanner-primary", "fingerprint": "3815994cd3dff2d0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d31dc95043cb73f7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/redesign/console/CenterWorkspace.tsx:1113"}, "properties": {"repobilityId": "5988def540f8b5db", "scanner": "scanner-primary", "fingerprint": "d31dc95043cb73f7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fc6f2e2a9fa20dd3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/redesign/console/research/ResearchWorkspace.tsx:548"}, "properties": {"repobilityId": "d0d1781edf92c76e", "scanner": "scanner-primary", "fingerprint": "fc6f2e2a9fa20dd3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d30c4906ee4c8a72", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/layouts/ConsoleLayout.tsx:133"}, "properties": {"repobilityId": "07cf97aadf768e0a", "scanner": "scanner-primary", "fingerprint": "d30c4906ee4c8a72", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0d665cf2eb46361c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/take-screenshots.js:18"}, "properties": {"repobilityId": "9341ba2683924fde", "scanner": "scanner-primary", "fingerprint": "0d665cf2eb46361c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2ca141adde3c5588", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/demo-video/record-demo.js:50"}, "properties": {"repobilityId": "e0c7bca4dff3d063", "scanner": "scanner-primary", "fingerprint": "2ca141adde3c5588", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-229ddcd9e7b259ae", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/demo-video/lib/narration.js:34"}, "properties": {"repobilityId": "d4a53b865e33b5fa", "scanner": "scanner-primary", "fingerprint": "229ddcd9e7b259ae", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c36bdd216b130550", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/demo-video/lib/render.js:27"}, "properties": {"repobilityId": "d3dfb02ab9f85db4", "scanner": "scanner-primary", "fingerprint": "c36bdd216b130550", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9394610b3f8717fc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/demo-video/lib/cursor.js:74"}, "properties": {"repobilityId": "b952a23e86b0c698", "scanner": "scanner-primary", "fingerprint": "9394610b3f8717fc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b386ff4d7ae94536", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 desktop/src/renderer.ts:31"}, "properties": {"repobilityId": "6f586f86252ce3e4", "scanner": "scanner-primary", "fingerprint": "b386ff4d7ae94536", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9939a214e7e3cceb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 meeting/frontend/src/pages/console/ConsoleMeetingDetail.tsx:1873"}, "properties": {"repobilityId": "9f01c43d4ba462cc", "scanner": "scanner-primary", "fingerprint": "9939a214e7e3cceb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-002c40c5922f3625", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 meeting/frontend/src/pages/console/ConsoleMeetingDetail.tsx:2397"}, "properties": {"repobilityId": "5b6d0817ccdbc44a", "scanner": "scanner-primary", "fingerprint": "002c40c5922f3625", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-630a69db98931a10", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 meeting/frontend/src/pages/console/ConsoleMeetingDetail.tsx:1373"}, "properties": {"repobilityId": "2c682bdf9f955218", "scanner": "scanner-primary", "fingerprint": "630a69db98931a10", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-60427b03771411b6", "level": "warning", "message": {"text": "Dockerfile runs as root: frontend/Dockerfile"}, "properties": {"repobilityId": "735c01d8531dfd2c", "scanner": "scanner-primary", "fingerprint": "60427b03771411b6", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-faa134129e5545ff", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "f6b2677b356ea64a", "scanner": "scanner-primary", "fingerprint": "faa134129e5545ff", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/Dockerfile"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-e9c1e66a27308f49", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: nginx:1.27-alpine"}, "properties": {"repobilityId": "2fc2538dbb0a1111", "scanner": "scanner-primary", "fingerprint": "e9c1e66a27308f49", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/Dockerfile"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-1f66ad88286ca30a", "level": "warning", "message": {"text": "Dockerfile runs as root: backend/Dockerfile"}, "properties": {"repobilityId": "7afd2b0e8a8c9eeb", "scanner": "scanner-primary", "fingerprint": "1f66ad88286ca30a", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-8cd20d539467d2c5", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "properties": {"repobilityId": "06b87ac9439092d6", "scanner": "scanner-primary", "fingerprint": "8cd20d539467d2c5", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-3027e907646b78ac", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in presentation.html:705"}, "properties": {"repobilityId": "7fc8fb9c3ee0d77f", "scanner": "scanner-primary", "fingerprint": "3027e907646b78ac", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "presentation.html"}, "region": {"startLine": 705}}}]}, {"ruleId": "scanner-de8758808e6b8dbb", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in todo-kanban-prototype.html:607"}, "properties": {"repobilityId": "9c65bee39cdebc82", "scanner": "scanner-primary", "fingerprint": "de8758808e6b8dbb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "todo-kanban-prototype.html"}, "region": {"startLine": 607}}}]}, {"ruleId": "scanner-e116b3e6be2302e3", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in frontend/public/estimate/index.html:213"}, "properties": {"repobilityId": "78bee8638dc3f731", "scanner": "scanner-primary", "fingerprint": "e116b3e6be2302e3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/estimate/index.html"}, "region": {"startLine": 213}}}]}, {"ruleId": "scanner-3fc328f5893fc1f8", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/quiz.html:701"}, "properties": {"repobilityId": "8735713f1d668252", "scanner": "scanner-primary", "fingerprint": "3fc328f5893fc1f8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/quiz.html"}, "region": {"startLine": 701}}}]}, {"ruleId": "scanner-96a5eabe7bdb375f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/player.html:1237"}, "properties": {"repobilityId": "7d9a99fb0d0d730d", "scanner": "scanner-primary", "fingerprint": "96a5eabe7bdb375f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/player.html"}, "region": {"startLine": 1237}}}]}, {"ruleId": "scanner-9a3f97e966a27179", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/script.html:263"}, "properties": {"repobilityId": "11430d6859835146", "scanner": "scanner-primary", "fingerprint": "9a3f97e966a27179", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/script.html"}, "region": {"startLine": 263}}}]}, {"ruleId": "scanner-465347873844fc74", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson14/demo.html:1311"}, "properties": {"repobilityId": "c8f0dfd4a36b7075", "scanner": "scanner-primary", "fingerprint": "465347873844fc74", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson14/demo.html"}, "region": {"startLine": 1311}}}]}, {"ruleId": "scanner-5795951550a87dca", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson23/demo.html:1517"}, "properties": {"repobilityId": "3413ab4a79e4fc21", "scanner": "scanner-primary", "fingerprint": "5795951550a87dca", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson23/demo.html"}, "region": {"startLine": 1517}}}]}, {"ruleId": "scanner-e749f46de0d122a2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson20/demo.html:1550"}, "properties": {"repobilityId": "a0742f30c4374e36", "scanner": "scanner-primary", "fingerprint": "e749f46de0d122a2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson20/demo.html"}, "region": {"startLine": 1550}}}]}, {"ruleId": "scanner-80a33804cea51d68", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson05/demo.html:940"}, "properties": {"repobilityId": "be40446c13320c1c", "scanner": "scanner-primary", "fingerprint": "80a33804cea51d68", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson05/demo.html"}, "region": {"startLine": 940}}}]}, {"ruleId": "scanner-39bdef3836f33a02", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson07/demo.html:1268"}, "properties": {"repobilityId": "ddce16fcaab5d423", "scanner": "scanner-primary", "fingerprint": "39bdef3836f33a02", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson07/demo.html"}, "region": {"startLine": 1268}}}]}, {"ruleId": "scanner-859af80539fb9e10", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson01/demo.html:667"}, "properties": {"repobilityId": "6928ec45d764c8d1", "scanner": "scanner-primary", "fingerprint": "859af80539fb9e10", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson01/demo.html"}, "region": {"startLine": 667}}}]}, {"ruleId": "scanner-fddab53cec10946f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson02/demo.html:974"}, "properties": {"repobilityId": "35dfd16cc178a8e8", "scanner": "scanner-primary", "fingerprint": "fddab53cec10946f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson02/demo.html"}, "region": {"startLine": 974}}}]}, {"ruleId": "scanner-341d20f7d855039f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson08/demo.html:1106"}, "properties": {"repobilityId": "fa88f70f29df32d9", "scanner": "scanner-primary", "fingerprint": "341d20f7d855039f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson08/demo.html"}, "region": {"startLine": 1106}}}]}, {"ruleId": "scanner-3227734eea571d77", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson16/demo.html:1738"}, "properties": {"repobilityId": "55a90ab4a68225af", "scanner": "scanner-primary", "fingerprint": "3227734eea571d77", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson16/demo.html"}, "region": {"startLine": 1738}}}]}, {"ruleId": "scanner-cf9c79dea5f6d83a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson17/demo.html:1913"}, "properties": {"repobilityId": "d59e39fc44911c90", "scanner": "scanner-primary", "fingerprint": "cf9c79dea5f6d83a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson17/demo.html"}, "region": {"startLine": 1913}}}]}, {"ruleId": "scanner-4f81b7ccb3880c63", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in frontend/public/course/lesson17/demo.html:1950"}, "properties": {"repobilityId": "934b3d09b05acc9a", "scanner": "scanner-primary", "fingerprint": "4f81b7ccb3880c63", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson17/demo.html"}, "region": {"startLine": 1950}}}]}, {"ruleId": "scanner-5cd44b653904bbb2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson03/demo.html:841"}, "properties": {"repobilityId": "3f4bf4eabcc85da9", "scanner": "scanner-primary", "fingerprint": "5cd44b653904bbb2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson03/demo.html"}, "region": {"startLine": 841}}}]}, {"ruleId": "scanner-2aa5004b70c45d34", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson18/demo.html:1204"}, "properties": {"repobilityId": "28a91e83ffbdf75b", "scanner": "scanner-primary", "fingerprint": "2aa5004b70c45d34", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson18/demo.html"}, "region": {"startLine": 1204}}}]}, {"ruleId": "scanner-f3b733b258ebc1d1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson09/demo.html:1210"}, "properties": {"repobilityId": "90e6f41adb021f7d", "scanner": "scanner-primary", "fingerprint": "f3b733b258ebc1d1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson09/demo.html"}, "region": {"startLine": 1210}}}]}, {"ruleId": "scanner-9d14c72e3948fdea", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson04/demo.html:973"}, "properties": {"repobilityId": "6fa5ad7b1d1925e4", "scanner": "scanner-primary", "fingerprint": "9d14c72e3948fdea", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson04/demo.html"}, "region": {"startLine": 973}}}]}, {"ruleId": "scanner-b8fe312fe8188f8d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson22/demo.html:1270"}, "properties": {"repobilityId": "da758b9b931db3e7", "scanner": "scanner-primary", "fingerprint": "b8fe312fe8188f8d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson22/demo.html"}, "region": {"startLine": 1270}}}]}, {"ruleId": "scanner-b4c7f1fd10237506", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson12/demo.html:1389"}, "properties": {"repobilityId": "a85da99a453048a9", "scanner": "scanner-primary", "fingerprint": "b4c7f1fd10237506", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson12/demo.html"}, "region": {"startLine": 1389}}}]}, {"ruleId": "scanner-c9b6a9e515a38cfc", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson10/demo.html:1318"}, "properties": {"repobilityId": "f032232767dfe461", "scanner": "scanner-primary", "fingerprint": "c9b6a9e515a38cfc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson10/demo.html"}, "region": {"startLine": 1318}}}]}, {"ruleId": "scanner-726a3b6504d9fe57", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson11/demo.html:1194"}, "properties": {"repobilityId": "1ecaf83fa931d957", "scanner": "scanner-primary", "fingerprint": "726a3b6504d9fe57", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson11/demo.html"}, "region": {"startLine": 1194}}}]}, {"ruleId": "scanner-1bdc419844821b52", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson06/demo.html:1055"}, "properties": {"repobilityId": "a827f706f59ce7c9", "scanner": "scanner-primary", "fingerprint": "1bdc419844821b52", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson06/demo.html"}, "region": {"startLine": 1055}}}]}, {"ruleId": "scanner-4adc655d80166af8", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson19/demo.html:1304"}, "properties": {"repobilityId": "b25de7711c466052", "scanner": "scanner-primary", "fingerprint": "4adc655d80166af8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson19/demo.html"}, "region": {"startLine": 1304}}}]}, {"ruleId": "scanner-467c2ab54493cad7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson13/demo.html:1519"}, "properties": {"repobilityId": "cf58b03f736ebc2b", "scanner": "scanner-primary", "fingerprint": "467c2ab54493cad7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson13/demo.html"}, "region": {"startLine": 1519}}}]}, {"ruleId": "scanner-9974310497bf83d2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson21/demo.html:1420"}, "properties": {"repobilityId": "b8103250780c32c5", "scanner": "scanner-primary", "fingerprint": "9974310497bf83d2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson21/demo.html"}, "region": {"startLine": 1420}}}]}, {"ruleId": "scanner-da9f2e0e16924f40", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/course/lesson15/demo.html:1665"}, "properties": {"repobilityId": "7563de2ae6753499", "scanner": "scanner-primary", "fingerprint": "da9f2e0e16924f40", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/course/lesson15/demo.html"}, "region": {"startLine": 1665}}}]}, {"ruleId": "scanner-dd4e9154850d794c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/markdown/ReportMarkdown.tsx:222"}, "properties": {"repobilityId": "9575ec969793af29", "scanner": "scanner-primary", "fingerprint": "dd4e9154850d794c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/markdown/ReportMarkdown.tsx"}, "region": {"startLine": 222}}}]}, {"ruleId": "scanner-ae5a085afff90704", "level": "error", "message": {"text": "Possible secret in scripts/take-screenshots.js"}, "properties": {"repobilityId": "8840d84af5cd4736", "scanner": "scanner-primary", "fingerprint": "ae5a085afff90704", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/take-screenshots.js"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-ae5a085afff90704", "level": "error", "message": {"text": "Possible secret in scripts/take-screenshots.js"}, "properties": {"repobilityId": "8840d84af5cd4736", "scanner": "scanner-primary", "fingerprint": "ae5a085afff90704", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/take-screenshots.js"}, "region": {"startLine": 116}}}]}, {"ruleId": "scanner-113f090bc75d271d", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/take-screenshots.js:70"}, "properties": {"repobilityId": "848d7ce77f542e32", "scanner": "scanner-primary", "fingerprint": "113f090bc75d271d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/take-screenshots.js"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-ddca848b0c70bf33", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in scripts/demo-video/lib/auth.js:43"}, "properties": {"repobilityId": "941e538229ae9e87", "scanner": "scanner-primary", "fingerprint": "ddca848b0c70bf33", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/demo-video/lib/auth.js"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-4d6a17759e94beff", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in backend/prompts/sharedev/skills/sharedev-pwc-write-prd-spec/scripts/helper.js:57"}, "properties": {"repobilityId": "bcbe7c516b0fa7fc", "scanner": "scanner-primary", "fingerprint": "4d6a17759e94beff", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/prompts/sharedev/skills/sharedev-pwc-write-prd-spec/scripts/helper.js"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-645e19ad7523a311", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b1cebeda8a5a6f8e", "scanner": "scanner-primary", "fingerprint": "645e19ad7523a311", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-prod.yml"}, "region": {"startLine": 157}}}]}, {"ruleId": "scanner-645e19ad7523a311", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2099df36e09158fc", "scanner": "scanner-primary", "fingerprint": "645e19ad7523a311", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-prod.yml"}, "region": {"startLine": 159}}}]}, {"ruleId": "scanner-645e19ad7523a311", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "464bed554b59e36f", "scanner": "scanner-primary", "fingerprint": "645e19ad7523a311", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-prod.yml"}, "region": {"startLine": 167}}}]}, {"ruleId": "scanner-645e19ad7523a311", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d4d672bfecac7685", "scanner": "scanner-primary", "fingerprint": "645e19ad7523a311", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-prod.yml"}, "region": {"startLine": 176}}}]}, {"ruleId": "scanner-645e19ad7523a311", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "464bed554b59e36f", "scanner": "scanner-primary", "fingerprint": "645e19ad7523a311", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-prod.yml"}, "region": {"startLine": 189}}}]}, {"ruleId": "scanner-645e19ad7523a311", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d4d672bfecac7685", "scanner": "scanner-primary", "fingerprint": "645e19ad7523a311", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-prod.yml"}, "region": {"startLine": 198}}}]}, {"ruleId": "scanner-645e19ad7523a311", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "36f688a9951ffd71", "scanner": "scanner-primary", "fingerprint": "645e19ad7523a311", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-prod.yml"}, "region": {"startLine": 225}}}]}, {"ruleId": "scanner-c0d7e7ed5be2029c", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "587d0ab25bd2e3fd", "scanner": "scanner-primary", "fingerprint": "c0d7e7ed5be2029c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-prod.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aef0bbd36deaa168", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a6feac4c0a2499f9", "scanner": "scanner-primary", "fingerprint": "aef0bbd36deaa168", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/desktop-build.yml"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-aef0bbd36deaa168", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a6feac4c0a2499f9", "scanner": "scanner-primary", "fingerprint": "aef0bbd36deaa168", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/desktop-build.yml"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-aef0bbd36deaa168", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "0bc2641f25921ca9", "scanner": "scanner-primary", "fingerprint": "aef0bbd36deaa168", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/desktop-build.yml"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-fa7ba2c6d4604ca1", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "b9efc2d701502cd7", "scanner": "scanner-primary", "fingerprint": "fa7ba2c6d4604ca1", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/desktop-build.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "722ab4643920a278", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 85}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f2786f1086a78fa7", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 101}}}]}, {"ruleId": "scanner-0bf7228e09d9c0bd", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c66602e0bd57a21a", "scanner": "scanner-primary", "fingerprint": "0bf7228e09d9c0bd", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-uat.yml"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-0bf7228e09d9c0bd", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9b84256ba21ebc20", "scanner": "scanner-primary", "fingerprint": "0bf7228e09d9c0bd", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-uat.yml"}, "region": {"startLine": 69}}}]}, {"ruleId": "scanner-0bf7228e09d9c0bd", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bd634c904ae9f89b", "scanner": "scanner-primary", "fingerprint": "0bf7228e09d9c0bd", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-uat.yml"}, "region": {"startLine": 77}}}]}, {"ruleId": "scanner-0bf7228e09d9c0bd", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "cb946df8bb17ec5a", "scanner": "scanner-primary", "fingerprint": "0bf7228e09d9c0bd", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-uat.yml"}, "region": {"startLine": 86}}}]}, {"ruleId": "scanner-0bf7228e09d9c0bd", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "fb12399b2bc3c7d2", "scanner": "scanner-primary", "fingerprint": "0bf7228e09d9c0bd", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-uat.yml"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-422c803941f94c74", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "c5b32bffae201f1d", "scanner": "scanner-primary", "fingerprint": "422c803941f94c74", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-uat.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a32bc5523ae3e4b3", "level": "note", "message": {"text": "Very large file: frontend/src/api/client.ts (2708 lines)"}, "properties": {"repobilityId": "8cb108e869d3e9f0", "scanner": "scanner-primary", "fingerprint": "a32bc5523ae3e4b3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9b8478d5d8f28eeb", "level": "note", "message": {"text": "Very large file: frontend/src/components/console/research/ResearchWorkspace.tsx (1186 lines)"}, "properties": {"repobilityId": "d530be75164aa6a1", "scanner": "scanner-primary", "fingerprint": "9b8478d5d8f28eeb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c8b9887cf80386ad", "level": "note", "message": {"text": "Very large file: frontend/src/components/console/research/ResearchQuestionnaire.tsx (1846 lines)"}, "properties": {"repobilityId": "e481c60464dddf5d", "scanner": "scanner-primary", "fingerprint": "c8b9887cf80386ad", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-608b12a7f074fad7", "level": "note", "message": {"text": "Very large file: frontend/src/pages/Help.tsx (904 lines)"}, "properties": {"repobilityId": "24a2d2b7eb0c11c7", "scanner": "scanner-primary", "fingerprint": "608b12a7f074fad7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e76f93d17d8acbfd", "level": "note", "message": {"text": "Very large file: frontend/src/pages/Demo.tsx (1222 lines)"}, "properties": {"repobilityId": "bbec73ca2f7c81c8", "scanner": "scanner-primary", "fingerprint": "e76f93d17d8acbfd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-060b02b90f818d9a", "level": "note", "message": {"text": "Very large file: frontend/src/pages/DesignSystem.tsx (1785 lines)"}, "properties": {"repobilityId": "e30a47040b332424", "scanner": "scanner-primary", "fingerprint": "060b02b90f818d9a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8431444d316b7c1c", "level": "note", "message": {"text": "Very large file: frontend/src/pages/demo/InsightDemo.tsx (886 lines)"}, "properties": {"repobilityId": "544987ff435a4008", "scanner": "scanner-primary", "fingerprint": "8431444d316b7c1c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6e42b6fbbdce5ace", "level": "note", "message": {"text": "Very large file: frontend/src/pages/console/ConsoleProjectDetail.tsx (2020 lines)"}, "properties": {"repobilityId": "7e1773d2ed694131", "scanner": "scanner-primary", "fingerprint": "6e42b6fbbdce5ace", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d1b0cc375be89a34", "level": "note", "message": {"text": "Very large file: frontend/src/pages/console/ConsoleMeetingDetail.tsx (2990 lines)"}, "properties": {"repobilityId": "ea6d9bd35de64fc0", "scanner": "scanner-primary", "fingerprint": "d1b0cc375be89a34", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0b68e163590ae31a", "level": "note", "message": {"text": "Very large file: frontend/src/redesign/console/CenterWorkspace.tsx (1209 lines)"}, "properties": {"repobilityId": "db266ba90328084f", "scanner": "scanner-primary", "fingerprint": "0b68e163590ae31a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-02b3c5aa3001a847", "level": "note", "message": {"text": "Very large file: frontend/src/redesign/console/ConsoleProjectDetail.tsx (2046 lines)"}, "properties": {"repobilityId": "5b1979b9dc53e158", "scanner": "scanner-primary", "fingerprint": "02b3c5aa3001a847", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4af3c1acdbeceac4", "level": "note", "message": {"text": "Very large file: frontend/src/redesign/console/research/ResearchQuestionnaireDark.tsx (1722 lines)"}, "properties": {"repobilityId": "74a552072187aa77", "scanner": "scanner-primary", "fingerprint": "4af3c1acdbeceac4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a6c1da84cf32fc33", "level": "note", "message": {"text": "Very large file: frontend/src/redesign/console/research/ResearchWorkspace.tsx (1273 lines)"}, "properties": {"repobilityId": "5102e857f8893483", "scanner": "scanner-primary", "fingerprint": "a6c1da84cf32fc33", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6aefc7abd3f3b909", "level": "note", "message": {"text": "Very large file: meeting/frontend/src/pages/console/ConsoleMeetingDetail.tsx (2990 lines)"}, "properties": {"repobilityId": "dc1001d5a18af1e9", "scanner": "scanner-primary", "fingerprint": "6aefc7abd3f3b909", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-06f20c9dc110b68d", "level": "note", "message": {"text": "Very large file: meeting/backend/api/meeting.py (1854 lines)"}, "properties": {"repobilityId": "bf86282f0efb3a7c", "scanner": "scanner-primary", "fingerprint": "06f20c9dc110b68d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-34c0caaceccd359b", "level": "note", "message": {"text": "Very large file: backend/api/outputs.py (1425 lines)"}, "properties": {"repobilityId": "af3b42dc355e2eee", "scanner": "scanner-primary", "fingerprint": "34c0caaceccd359b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6fe7d5f9812dc088", "level": "note", "message": {"text": "Very large file: backend/api/meeting.py (1854 lines)"}, "properties": {"repobilityId": "5c13a35a440da338", "scanner": "scanner-primary", "fingerprint": "6fe7d5f9812dc088", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-aed223e6281b6772", "level": "note", "message": {"text": "Very large file: backend/services/output_service.py (1094 lines)"}, "properties": {"repobilityId": "3df0e36c42462f9e", "scanner": "scanner-primary", "fingerprint": "aed223e6281b6772", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8dafcb654bb2619e", "level": "note", "message": {"text": "Very large file: backend/services/agentic/executor.py (1095 lines)"}, "properties": {"repobilityId": "5ccde265c4f0f4c2", "scanner": "scanner-primary", "fingerprint": "8dafcb654bb2619e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a46d4960213018dc", "level": "note", "message": {"text": "Very large file: backend/services/agentic/runner.py (3787 lines)"}, "properties": {"repobilityId": "6b1d27b7e5e3a072", "scanner": "scanner-primary", "fingerprint": "a46d4960213018dc", "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": "28681225c72e476a", "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": "b8906915ae0e6701", "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": "118344f1dec2b11d", "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": "b8f58fe05d676524", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "ea4f9dff040e27bf", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "fa265d46539bbb4e", "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": "d626d94c02dcb91d", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e705d5fa2c5912f5", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-pwc-finish-development/SKILL.md"}, "properties": {"repobilityId": "a0c41a93fd72c48e", "scanner": "scanner-primary", "fingerprint": "e705d5fa2c5912f5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/prompts/sharedev/skills/sharedev-pwc-finish-development/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-173e780825403038", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-pwc-execute-plans/SKILL.md"}, "properties": {"repobilityId": "0fab495f3c993b3b", "scanner": "scanner-primary", "fingerprint": "173e780825403038", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/prompts/sharedev/skills/sharedev-pwc-execute-plans/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4c552c608ee052ba", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-auto/SKILL.md"}, "properties": {"repobilityId": "23dd069db2cfc8f1", "scanner": "scanner-primary", "fingerprint": "4c552c608ee052ba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/prompts/sharedev/skills/sharedev-auto/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ca5a8f90f098a52f", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-apl-lite/SKILL.md"}, "properties": {"repobilityId": "1a664de44811ab07", "scanner": "scanner-primary", "fingerprint": "ca5a8f90f098a52f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/prompts/sharedev/skills/sharedev-apl-lite/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1190f346afd5237f", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-pwc-review-code/SKILL.md"}, "properties": {"repobilityId": "68709b1f0407a794", "scanner": "scanner-primary", "fingerprint": "1190f346afd5237f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/prompts/sharedev/skills/sharedev-pwc-review-code/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-100fb61db00abb65", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-apl-code-review/SKILL.md"}, "properties": {"repobilityId": "1991cc337723bc4a", "scanner": "scanner-primary", "fingerprint": "100fb61db00abb65", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/prompts/sharedev/skills/sharedev-apl-code-review/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d4a768894be99958", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: backend/prompts/sharedev/skills/sharedev-pwc-subagent-driven-development/SKILL.md"}, "properties": {"repobilityId": "a24aeb6bad01ec4c", "scanner": "scanner-primary", "fingerprint": "d4a768894be99958", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/prompts/sharedev/skills/sharedev-pwc-subagent-driven-development/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-06af07bf11de5e40", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: backend/prompts/sharedev/specs/apl/SKILL.md"}, "properties": {"repobilityId": "18ae8a57be6c066a", "scanner": "scanner-primary", "fingerprint": "06af07bf11de5e40", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/prompts/sharedev/specs/apl/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1b907d76056fbab8", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/main.tsx:11"}, "properties": {"repobilityId": "b89c2b368024bfdb", "scanner": "scanner-primary", "fingerprint": "1b907d76056fbab8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a45f1ba0f477bda6", "level": "note", "message": {"text": "Legacy-named symbol `isLegacy` in frontend/src/components/TemplateSelector.tsx:31"}, "properties": {"repobilityId": "0e071b8f2e8ed24f", "scanner": "scanner-primary", "fingerprint": "a45f1ba0f477bda6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e24abea0c72e751f", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/console/research/ResearchWorkspace.tsx:90"}, "properties": {"repobilityId": "a972033dbe0bc3ce", "scanner": "scanner-primary", "fingerprint": "e24abea0c72e751f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ba76079ada36a9c6", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/components/console/research/ResearchQuestionnaire.tsx:70"}, "properties": {"repobilityId": "70d455527374a101", "scanner": "scanner-primary", "fingerprint": "ba76079ada36a9c6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b304dfb6cca28bb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/Challenge.tsx:125"}, "properties": {"repobilityId": "9e722310025103b4", "scanner": "scanner-primary", "fingerprint": "6b304dfb6cca28bb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-62a1a2a4c5380cdd", "level": "note", "message": {"text": "Legacy-named symbol `survey_v2` in frontend/src/pages/Demo.tsx:667"}, "properties": {"repobilityId": "25dc1b07974b9c29", "scanner": "scanner-primary", "fingerprint": "62a1a2a4c5380cdd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f6ad5200e372ae45", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/console/ConsoleProjectDetail.tsx:267"}, "properties": {"repobilityId": "34009635ea0d901d", "scanner": "scanner-primary", "fingerprint": "f6ad5200e372ae45", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cf6201aca1f67309", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/console/ConsoleProjectDetail.tsx:1487"}, "properties": {"repobilityId": "d08dc71dbb91b237", "scanner": "scanner-primary", "fingerprint": "cf6201aca1f67309", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8024b86fc2ca9ba7", "level": "note", "message": {"text": "Legacy-named symbol `isLegacy` in frontend/src/redesign/console/TemplateManager.tsx:27"}, "properties": {"repobilityId": "7a717ff40e4188e0", "scanner": "scanner-primary", "fingerprint": "8024b86fc2ca9ba7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fe6ac2a3ff16117d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/redesign/console/ConsoleProjectDetail.tsx:1614"}, "properties": {"repobilityId": "4ee89931760da719", "scanner": "scanner-primary", "fingerprint": "fe6ac2a3ff16117d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b4edf927f1709fe1", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/redesign/console/research/ResearchQuestionnaireDark.tsx:67"}, "properties": {"repobilityId": "13eb5ab309534f77", "scanner": "scanner-primary", "fingerprint": "b4edf927f1709fe1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b40906bf288e6d72", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/redesign/console/research/ResearchWorkspace.tsx:612"}, "properties": {"repobilityId": "6c95a6767900c654", "scanner": "scanner-primary", "fingerprint": "b40906bf288e6d72", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e4b1afa7c2f579c", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/redesign/console/canvas/canvasModel.ts:28"}, "properties": {"repobilityId": "2b9d5228bbae45fe", "scanner": "scanner-primary", "fingerprint": "8e4b1afa7c2f579c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-825e88512e1bdbfe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/take-screenshots.js:113"}, "properties": {"repobilityId": "c3bf110ddf560679", "scanner": "scanner-primary", "fingerprint": "825e88512e1bdbfe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-12ff7789e65cbe83", "level": "error", "message": {"text": "Blocking `httpx.post(...)` inside `async def main` \u2014 scripts/bootstrap.py:178"}, "properties": {"repobilityId": "4768c22e5cb49a6b", "scanner": "scanner-primary", "fingerprint": "12ff7789e65cbe83", "layer": "quality", "severity": "high", "confidence": 1.0, "tags": ["integrity", "sync-io-in-async", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/bootstrap.py"}, "region": {"startLine": 178}}}]}, {"ruleId": "scanner-4b7297afc38c4170", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/demo-video/narration/tts.py:69"}, "properties": {"repobilityId": "c0a49823725d379e", "scanner": "scanner-primary", "fingerprint": "4b7297afc38c4170", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4b5d82cb11cff47f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/demo-video/lib/auth.js:27"}, "properties": {"repobilityId": "99a74264309fae1f", "scanner": "scanner-primary", "fingerprint": "4b5d82cb11cff47f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8884a8b709c453e3", "level": "note", "message": {"text": "Legacy-named symbol `isLegacy` in meeting/frontend/src/components/TemplateSelector.tsx:31"}, "properties": {"repobilityId": "437755d0eb3a8072", "scanner": "scanner-primary", "fingerprint": "8884a8b709c453e3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-442208246012f58d", "level": "note", "message": {"text": "Legacy-named symbol `isLegacy` in meeting/frontend/src/redesign/console/TemplateManager.tsx:27"}, "properties": {"repobilityId": "8abafdc84b061326", "scanner": "scanner-primary", "fingerprint": "442208246012f58d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b54f7919fe3e169f", "level": "none", "message": {"text": "Commented-code block (9 lines) in backend/main.py:7"}, "properties": {"repobilityId": "a1550495a9878fe4", "scanner": "scanner-primary", "fingerprint": "b54f7919fe3e169f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-43d2c1dc858f3167", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/api/projects.py:313"}, "properties": {"repobilityId": "e67e0eb602d0dc61", "scanner": "scanner-primary", "fingerprint": "43d2c1dc858f3167", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8213adcbfaef18d5", "level": "note", "message": {"text": "Legacy-named symbol `insight_v2` in backend/api/briefs.py:26"}, "properties": {"repobilityId": "c4d2c79d30f74451", "scanner": "scanner-primary", "fingerprint": "8213adcbfaef18d5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-77d38ac4c910e2ff", "level": "note", "message": {"text": "Legacy-named symbol `insight_v2` in backend/scripts/migrate_v3_rename.py:6"}, "properties": {"repobilityId": "9daeaef6571999ca", "scanner": "scanner-primary", "fingerprint": "77d38ac4c910e2ff", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b6b6f6d47d87a3ba", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/scripts/migrate_v3_rename.py:50"}, "properties": {"repobilityId": "562b70f2b6a23a32", "scanner": "scanner-primary", "fingerprint": "b6b6f6d47d87a3ba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f393a1e4c9ac66ce", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/tasks/output_tasks.py:277"}, "properties": {"repobilityId": "e33388fe0b47860a", "scanner": "scanner-primary", "fingerprint": "f393a1e4c9ac66ce", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3d094959d91dc641", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/agents/converter_agent.py:697"}, "properties": {"repobilityId": "580c2dc6ff155da6", "scanner": "scanner-primary", "fingerprint": "3d094959d91dc641", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2f1d48c20ed01cb", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/services/smart_advice.py:59"}, "properties": {"repobilityId": "727fa7ed694b7006", "scanner": "scanner-primary", "fingerprint": "f2f1d48c20ed01cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e7ccf0cc4aac799c", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/services/agentic/runner.py:202"}, "properties": {"repobilityId": "953f5e99fdbdb1dd", "scanner": "scanner-primary", "fingerprint": "e7ccf0cc4aac799c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2364ade3d20bdfab", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/services/agentic/research/best_practices.py:443"}, "properties": {"repobilityId": "74eb2e4a687f1cec", "scanner": "scanner-primary", "fingerprint": "2364ade3d20bdfab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5fa5af25316da646", "level": "note", "message": {"text": "16 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "e0919a3f6a45e8c2", "scanner": "scanner-primary", "fingerprint": "5fa5af25316da646", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "4f9a88fafbc2d69b", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "ca31fc9078701efe", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "78bfb162cf65a519", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "1237187d6815a530", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "0d46d69b57849227", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "b8e2be29bbbaf452", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "3b434a3c2aab3f71", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "43d528a0c9888e02", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "141049822174e3ba", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "513366b936dc0bc2", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "20e089e1356b100d", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "47105660bf7d8eb6", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "1582fe42c523fed2", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "6ea05bd49ac4b74e", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "478ae6f8830241a0", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "f894817951149bb4", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "dc7b3c66c132657e", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "d73a8977785f087a", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-33a6b62e30ce7ab4", "level": "note", "message": {"text": "Near-duplicate function bodies in 6 places"}, "properties": {"repobilityId": "43ca5818713e65bc", "scanner": "scanner-primary", "fingerprint": "33a6b62e30ce7ab4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "3314c14a003f14c2", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-b2bb3abb6e218b67", "level": "warning", "message": {"text": "Frontend route `/ds` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "62ead9d28e95a8bf", "scanner": "scanner-primary", "fingerprint": "b2bb3abb6e218b67", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cf64a0e5c7f9aed7", "level": "warning", "message": {"text": "Frontend route `/demo/outline` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "32f6721101528997", "scanner": "scanner-primary", "fingerprint": "cf64a0e5c7f9aed7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3d75b77d0ea56699", "level": "warning", "message": {"text": "Frontend route `/demo-ppt` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "230bb7e69cf06b00", "scanner": "scanner-primary", "fingerprint": "3d75b77d0ea56699", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f4ae9bd644d0ea91", "level": "warning", "message": {"text": "Frontend route `console` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "b10efb9201a79dcf", "scanner": "scanner-primary", "fingerprint": "f4ae9bd644d0ea91", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8e11138a9f634ca9", "level": "warning", "message": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "c97671d7cb9bdc13", "scanner": "scanner-primary", "fingerprint": "8e11138a9f634ca9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-04fa5efc2fe45ef2", "level": "warning", "message": {"text": "Frontend route `qa` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "9aa6c6edf0423a3a", "scanner": "scanner-primary", "fingerprint": "04fa5efc2fe45ef2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e80e60163d276e3b", "level": "warning", "message": {"text": "Frontend route `documents` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "adc05bb236f8cc1e", "scanner": "scanner-primary", "fingerprint": "e80e60163d276e3b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-97d27999bfa3b3b4", "level": "warning", "message": {"text": "Frontend route `projects` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "56988875d64b3f13", "scanner": "scanner-primary", "fingerprint": "97d27999bfa3b3b4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e409b390602f9a6d", "level": "warning", "message": {"text": "Frontend route `insight` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "c4ea1b3c55dfe098", "scanner": "scanner-primary", "fingerprint": "e409b390602f9a6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-174300f5890d5905", "level": "warning", "message": {"text": "Frontend route `survey` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "e06a8247cd15d78f", "scanner": "scanner-primary", "fingerprint": "174300f5890d5905", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c803de2732e50807", "level": "warning", "message": {"text": "Frontend route `projects/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "8d4d4f533039f318", "scanner": "scanner-primary", "fingerprint": "c803de2732e50807", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1243940c9a89f323", "level": "warning", "message": {"text": "Frontend route `projects/:id/todos` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "a535fba6b85abef8", "scanner": "scanner-primary", "fingerprint": "1243940c9a89f323", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3dd2ce5435dd2065", "level": "warning", "message": {"text": "Frontend route `projects/:id/canvas` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "91d0eba98cbd740c", "scanner": "scanner-primary", "fingerprint": "3dd2ce5435dd2065", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bc4d1001d12c941a", "level": "warning", "message": {"text": "Frontend route `meeting` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "ce9dbae530288417", "scanner": "scanner-primary", "fingerprint": "bc4d1001d12c941a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-718eef2764c9c7ec", "level": "warning", "message": {"text": "Frontend route `meeting/new` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "d6865a6035eeb1ff", "scanner": "scanner-primary", "fingerprint": "718eef2764c9c7ec", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bf5e378b1a074407", "level": "warning", "message": {"text": "Frontend route `meeting/templates` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "4127169981ec7620", "scanner": "scanner-primary", "fingerprint": "bf5e378b1a074407", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4e637489bd20c1b2", "level": "warning", "message": {"text": "Frontend route `meeting/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "44be73564cb34f3d", "scanner": "scanner-primary", "fingerprint": "4e637489bd20c1b2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3c423cd4489dd4da", "level": "warning", "message": {"text": "Frontend route `chunks` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "d340fe0c65cdfc32", "scanner": "scanner-primary", "fingerprint": "3c423cd4489dd4da", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2cf74ad102492d5f", "level": "warning", "message": {"text": "Frontend route `review` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "8e089ce33eb8a348", "scanner": "scanner-primary", "fingerprint": "2cf74ad102492d5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3c210a1fb5b5f3d9", "level": "warning", "message": {"text": "Frontend route `challenge` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "8de50515104da9cf", "scanner": "scanner-primary", "fingerprint": "3c210a1fb5b5f3d9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-55109eacc2ace549", "level": "warning", "message": {"text": "Frontend route `challenge/history` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "a05cb80cacd9f5a3", "scanner": "scanner-primary", "fingerprint": "55109eacc2ace549", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-17bacb17f6efb788", "level": "warning", "message": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "7a6f6cf42324831f", "scanner": "scanner-primary", "fingerprint": "17bacb17f6efb788", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0ac160ffb66284b3", "level": "warning", "message": {"text": "Frontend route `personal-settings` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "816bc8b21522a02f", "scanner": "scanner-primary", "fingerprint": "0ac160ffb66284b3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-292f1a70fb15f7ce", "level": "warning", "message": {"text": "Frontend route `system-config` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "1300d7fd4c0d9ee9", "scanner": "scanner-primary", "fingerprint": "292f1a70fb15f7ce", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4de014f5ec3d869e", "level": "warning", "message": {"text": "Frontend route `invite-codes` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "83da4b77abbf4084", "scanner": "scanner-primary", "fingerprint": "4de014f5ec3d869e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-099feb2db9deff41", "level": "warning", "message": {"text": "Frontend route `bundle-memories` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "d381731502fd3d4f", "scanner": "scanner-primary", "fingerprint": "099feb2db9deff41", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e542ec86a3bcbf9f", "level": "error", "message": {"text": "FastAPI POST `ingest_meeting` without auth dependency \u2014 meeting/backend/api/meeting.py:1645"}, "properties": {"repobilityId": "22f537c03a9287b6", "scanner": "scanner-primary", "fingerprint": "e542ec86a3bcbf9f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "meeting/backend/api/meeting.py"}, "region": {"startLine": 1645}}}]}, {"ruleId": "scanner-381a73498daf1412", "level": "error", "message": {"text": "FastAPI POST `mcp_endpoint` without auth dependency \u2014 backend/api/mcp.py:653"}, "properties": {"repobilityId": "69468fc464826dbd", "scanner": "scanner-primary", "fingerprint": "381a73498daf1412", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/mcp.py"}, "region": {"startLine": 653}}}]}, {"ruleId": "scanner-1a788fa80e989d9a", "level": "error", "message": {"text": "FastAPI POST `sso_bind` without auth dependency \u2014 backend/api/auth.py:224"}, "properties": {"repobilityId": "5f41be7fdcdecf5d", "scanner": "scanner-primary", "fingerprint": "1a788fa80e989d9a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/auth.py"}, "region": {"startLine": 224}}}]}, {"ruleId": "scanner-e16eec46fa85f545", "level": "error", "message": {"text": "FastAPI PUT `update_model` without auth dependency \u2014 backend/api/agent_settings.py:37"}, "properties": {"repobilityId": "9178402730e1ef85", "scanner": "scanner-primary", "fingerprint": "e16eec46fa85f545", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/agent_settings.py"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-d8ec746cd6746458", "level": "error", "message": {"text": "FastAPI POST `create_model` without auth dependency \u2014 backend/api/agent_settings.py:44"}, "properties": {"repobilityId": "97625041649a6504", "scanner": "scanner-primary", "fingerprint": "d8ec746cd6746458", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/agent_settings.py"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-98abde98bc6fb996", "level": "error", "message": {"text": "FastAPI DELETE `delete_model` without auth dependency \u2014 backend/api/agent_settings.py:56"}, "properties": {"repobilityId": "879769ce33cfc5f7", "scanner": "scanner-primary", "fingerprint": "98abde98bc6fb996", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/agent_settings.py"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-58ed329da98ad975", "level": "error", "message": {"text": "FastAPI PUT `update_routing` without auth dependency \u2014 backend/api/agent_settings.py:83"}, "properties": {"repobilityId": "2bc876bd427035e0", "scanner": "scanner-primary", "fingerprint": "58ed329da98ad975", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/agent_settings.py"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-de1d7e7fb8db90f4", "level": "error", "message": {"text": "FastAPI DELETE `delete_routing` without auth dependency \u2014 backend/api/agent_settings.py:95"}, "properties": {"repobilityId": "47a54ecb86021284", "scanner": "scanner-primary", "fingerprint": "de1d7e7fb8db90f4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/agent_settings.py"}, "region": {"startLine": 95}}}]}, {"ruleId": "scanner-87a1b1e67d33093c", "level": "error", "message": {"text": "FastAPI PUT `update_api_key` without auth dependency \u2014 backend/api/agent_settings.py:141"}, "properties": {"repobilityId": "42cf6327f9188a7e", "scanner": "scanner-primary", "fingerprint": "87a1b1e67d33093c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/agent_settings.py"}, "region": {"startLine": 141}}}]}, {"ruleId": "scanner-b72f5c07aaf60c24", "level": "error", "message": {"text": "FastAPI DELETE `delete_api_key` without auth dependency \u2014 backend/api/agent_settings.py:148"}, "properties": {"repobilityId": "142bf750afbf6a9d", "scanner": "scanner-primary", "fingerprint": "b72f5c07aaf60c24", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/agent_settings.py"}, "region": {"startLine": 148}}}]}, {"ruleId": "scanner-df76c40391bbb34d", "level": "error", "message": {"text": "FastAPI PUT `update_task_params` without auth dependency \u2014 backend/api/agent_settings.py:179"}, "properties": {"repobilityId": "006354740c5d0f32", "scanner": "scanner-primary", "fingerprint": "df76c40391bbb34d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/agent_settings.py"}, "region": {"startLine": 179}}}]}, {"ruleId": "scanner-12af4d7070aea331", "level": "error", "message": {"text": "FastAPI PUT `update_prompt` without auth dependency \u2014 backend/api/agent_settings.py:214"}, "properties": {"repobilityId": "27e2e80012e44633", "scanner": "scanner-primary", "fingerprint": "12af4d7070aea331", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/agent_settings.py"}, "region": {"startLine": 214}}}]}, {"ruleId": "scanner-04cd6ff58957f072", "level": "error", "message": {"text": "FastAPI POST `reset_prompt` without auth dependency \u2014 backend/api/agent_settings.py:232"}, "properties": {"repobilityId": "fc7831222d7b8892", "scanner": "scanner-primary", "fingerprint": "04cd6ff58957f072", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/agent_settings.py"}, "region": {"startLine": 232}}}]}, {"ruleId": "scanner-0ebc4a711cade36a", "level": "error", "message": {"text": "FastAPI POST `force_seed` without auth dependency \u2014 backend/api/agent_settings.py:257"}, "properties": {"repobilityId": "ec4afa903e5ee58a", "scanner": "scanner-primary", "fingerprint": "0ebc4a711cade36a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/agent_settings.py"}, "region": {"startLine": 257}}}]}, {"ruleId": "scanner-fc70db11eefd49dc", "level": "error", "message": {"text": "FastAPI POST `invalidate_cache` without auth dependency \u2014 backend/api/agent_settings.py:264"}, "properties": {"repobilityId": "d60ba60e3612b4e8", "scanner": "scanner-primary", "fingerprint": "fc70db11eefd49dc", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/agent_settings.py"}, "region": {"startLine": 264}}}]}, {"ruleId": "scanner-65f63a0696ad7421", "level": "error", "message": {"text": "FastAPI PUT `update_output_agent` without auth dependency \u2014 backend/api/agent_settings.py:360"}, "properties": {"repobilityId": "17d58f250f36b9e4", "scanner": "scanner-primary", "fingerprint": "65f63a0696ad7421", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/agent_settings.py"}, "region": {"startLine": 360}}}]}, {"ruleId": "scanner-f4f03c174a37cd65", "level": "error", "message": {"text": "FastAPI PUT `update_embedding_config` without auth dependency \u2014 backend/api/agent_settings.py:421"}, "properties": {"repobilityId": "197376f29f83f69b", "scanner": "scanner-primary", "fingerprint": "f4f03c174a37cd65", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/agent_settings.py"}, "region": {"startLine": 421}}}]}, {"ruleId": "scanner-5dbbf9395a44d68c", "level": "error", "message": {"text": "FastAPI DELETE `reset_embedding_config` without auth dependency \u2014 backend/api/agent_settings.py:438"}, "properties": {"repobilityId": "4683f7f070e792f7", "scanner": "scanner-primary", "fingerprint": "5dbbf9395a44d68c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/agent_settings.py"}, "region": {"startLine": 438}}}]}, {"ruleId": "scanner-9a3643911da1847f", "level": "error", "message": {"text": "FastAPI PUT `update_rerank_config` without auth dependency \u2014 backend/api/agent_settings.py:455"}, "properties": {"repobilityId": "204e91140e42bcde", "scanner": "scanner-primary", "fingerprint": "9a3643911da1847f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/agent_settings.py"}, "region": {"startLine": 455}}}]}, {"ruleId": "scanner-60ec1550443223ba", "level": "error", "message": {"text": "FastAPI DELETE `reset_rerank_config` without auth dependency \u2014 backend/api/agent_settings.py:471"}, "properties": {"repobilityId": "787b72d2ca07793c", "scanner": "scanner-primary", "fingerprint": "60ec1550443223ba", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/agent_settings.py"}, "region": {"startLine": 471}}}]}, {"ruleId": "scanner-65295e576061e28d", "level": "error", "message": {"text": "FastAPI POST `ingest_meeting` without auth dependency \u2014 backend/api/meeting.py:1645"}, "properties": {"repobilityId": "7d02aca6e26c0526", "scanner": "scanner-primary", "fingerprint": "65295e576061e28d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api/meeting.py"}, "region": {"startLine": 1645}}}]}, {"ruleId": "scanner-9de6bd49845eab0a", "level": "error", "message": {"text": "Dangling fetch: GET /version.json?t=${Date.now()} (frontend/src/components/VersionWatcher.tsx:32)"}, "properties": {"repobilityId": "a4128b0f73a18550", "scanner": "scanner-primary", "fingerprint": "9de6bd49845eab0a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b6cb35c11801cc91", "level": "error", "message": {"text": "Dangling fetch: POST /api/challenge/run-stream (frontend/src/pages/Challenge.tsx:125)"}, "properties": {"repobilityId": "fe1dbe6976252d8b", "scanner": "scanner-primary", "fingerprint": "b6cb35c11801cc91", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-35c268ad9306182e", "level": "note", "message": {"text": "Unused endpoint: GET /credentials"}, "properties": {"repobilityId": "09a07073f7130ee8", "scanner": "scanner-primary", "fingerprint": "35c268ad9306182e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ad488e6a29eb0218", "level": "note", "message": {"text": "Unused endpoint: PUT /credentials"}, "properties": {"repobilityId": "728f851f2c5800a7", "scanner": "scanner-primary", "fingerprint": "ad488e6a29eb0218", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bdaa9c4a5a9008da", "level": "note", "message": {"text": "Unused endpoint: DELETE /credentials"}, "properties": {"repobilityId": "c93975293479e42a", "scanner": "scanner-primary", "fingerprint": "bdaa9c4a5a9008da", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "83283f08f203aae1", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-72eb8a13269a8eb3", "level": "note", "message": {"text": "Unused endpoint: GET /active"}, "properties": {"repobilityId": "4407c98e46eb5eec", "scanner": "scanner-primary", "fingerprint": "72eb8a13269a8eb3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7175a4c44ec5d614", "level": "note", "message": {"text": "Unused endpoint: GET /{template_id}"}, "properties": {"repobilityId": "338e799232d0d5c7", "scanner": "scanner-primary", "fingerprint": "7175a4c44ec5d614", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "a1962c2de8c76c92", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-469ef4853b9d103d", "level": "note", "message": {"text": "Unused endpoint: POST /{template_id}/activate"}, "properties": {"repobilityId": "f9b7ef14400ff33a", "scanner": "scanner-primary", "fingerprint": "469ef4853b9d103d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-303b07a07052d51b", "level": "note", "message": {"text": "Unused endpoint: POST /evolve"}, "properties": {"repobilityId": "869840d13ac789f2", "scanner": "scanner-primary", "fingerprint": "303b07a07052d51b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec2b8074078b3cc8", "level": "note", "message": {"text": "Unused endpoint: GET /placeholders"}, "properties": {"repobilityId": "3aa1eb8dae3e5924", "scanner": "scanner-primary", "fingerprint": "ec2b8074078b3cc8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6236b283b79811b8", "level": "note", "message": {"text": "Unused endpoint: POST /upload"}, "properties": {"repobilityId": "e1ddd917a89d51a1", "scanner": "scanner-primary", "fingerprint": "6236b283b79811b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-32690c96fbcb6cf7", "level": "note", "message": {"text": "Unused endpoint: PATCH /{template_id}"}, "properties": {"repobilityId": "1f2cf1a6228b33cc", "scanner": "scanner-primary", "fingerprint": "32690c96fbcb6cf7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-06f2d08d25a7279d", "level": "note", "message": {"text": "Unused endpoint: DELETE /{template_id}"}, "properties": {"repobilityId": "2937dcb9655579d9", "scanner": "scanner-primary", "fingerprint": "06f2d08d25a7279d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-096bf1d57b42fe3e", "level": "note", "message": {"text": "Unused endpoint: POST /{template_id}/render"}, "properties": {"repobilityId": "1d4e623f289c0e7a", "scanner": "scanner-primary", "fingerprint": "096bf1d57b42fe3e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-91d2dcff4eea3f94", "level": "note", "message": {"text": "Unused endpoint: POST /{template_id}/export-docx"}, "properties": {"repobilityId": "9441e77cbf65db6c", "scanner": "scanner-primary", "fingerprint": "91d2dcff4eea3f94", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-06c529cf65449933", "level": "note", "message": {"text": "Unused endpoint: POST /{template_id}/export-md"}, "properties": {"repobilityId": "f15fdc9161d5991b", "scanner": "scanner-primary", "fingerprint": "06c529cf65449933", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8a794262e0d1ee55", "level": "note", "message": {"text": "Unused endpoint: POST /from-text"}, "properties": {"repobilityId": "eb720edc522b3185", "scanner": "scanner-primary", "fingerprint": "8a794262e0d1ee55", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6f5843a70d73bb80", "level": "note", "message": {"text": "Unused endpoint: GET /illustration-styles"}, "properties": {"repobilityId": "dcf3f48dbece23ea", "scanner": "scanner-primary", "fingerprint": "6f5843a70d73bb80", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1ffdb9135fa27b93", "level": "note", "message": {"text": "Unused endpoint: GET /{meeting_id}"}, "properties": {"repobilityId": "a0fa8df3d066fd4e", "scanner": "scanner-primary", "fingerprint": "1ffdb9135fa27b93", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c5be948cff036e04", "level": "note", "message": {"text": "Unused endpoint: PATCH /{meeting_id}"}, "properties": {"repobilityId": "6eb367df3829db92", "scanner": "scanner-primary", "fingerprint": "c5be948cff036e04", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e54c3bbe466a56c0", "level": "note", "message": {"text": "Unused endpoint: DELETE /{meeting_id}"}, "properties": {"repobilityId": "4c8234d7f279d039", "scanner": "scanner-primary", "fingerprint": "e54c3bbe466a56c0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fa3bd008595924f8", "level": "note", "message": {"text": "Unused endpoint: GET /{meeting_id}/requirements"}, "properties": {"repobilityId": "67dfd6803f5cf532", "scanner": "scanner-primary", "fingerprint": "fa3bd008595924f8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd58b6912442a6eb", "level": "note", "message": {"text": "Unused endpoint: PUT /{meeting_id}/project"}, "properties": {"repobilityId": "f15562f1161c7924", "scanner": "scanner-primary", "fingerprint": "fd58b6912442a6eb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-be1a576216b6d6db", "level": "note", "message": {"text": "Unused endpoint: PUT /{meeting_id}/stakeholder-map"}, "properties": {"repobilityId": "592c136011837929", "scanner": "scanner-primary", "fingerprint": "be1a576216b6d6db", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-57b03587309d9187", "level": "note", "message": {"text": "Unused endpoint: PUT /{meeting_id}/process-flows"}, "properties": {"repobilityId": "50da436e3ee74e37", "scanner": "scanner-primary", "fingerprint": "57b03587309d9187", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4c9b0034174741b4", "level": "note", "message": {"text": "Unused endpoint: PUT /{meeting_id}/edited-minutes"}, "properties": {"repobilityId": "65350b93749fd3bc", "scanner": "scanner-primary", "fingerprint": "4c9b0034174741b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-acce2a5898fc9103", "level": "note", "message": {"text": "Unused endpoint: PATCH /{meeting_id}/requirements/{req_id}"}, "properties": {"repobilityId": "64f6dcf43e10ba06", "scanner": "scanner-primary", "fingerprint": "acce2a5898fc9103", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-57c6ef2a652c0f59", "level": "note", "message": {"text": "Unused endpoint: POST /{meeting_id}/requirements"}, "properties": {"repobilityId": "b5cbd7ca47adba0a", "scanner": "scanner-primary", "fingerprint": "57c6ef2a652c0f59", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cc7a27c8d37838d9", "level": "note", "message": {"text": "Unused endpoint: DELETE /{meeting_id}/requirements/{req_id}"}, "properties": {"repobilityId": "bcfbf94e57b15d4a", "scanner": "scanner-primary", "fingerprint": "cc7a27c8d37838d9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-39fa6854b5d23837", "level": "note", "message": {"text": "Unused endpoint: POST /{meeting_id}/stakeholders/rename"}, "properties": {"repobilityId": "8aedf1c7fe087d3a", "scanner": "scanner-primary", "fingerprint": "39fa6854b5d23837", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2592fcd1f7724080", "level": "note", "message": {"text": "Unused endpoint: POST /{meeting_id}/process"}, "properties": {"repobilityId": "7d63ef8afef24bb2", "scanner": "scanner-primary", "fingerprint": "2592fcd1f7724080", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-18bb5b149c5e6f59", "level": "note", "message": {"text": "Unused endpoint: POST /{meeting_id}/actions/polish"}, "properties": {"repobilityId": "e2e1332aefe93a33", "scanner": "scanner-primary", "fingerprint": "18bb5b149c5e6f59", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ddb569720a70fc91", "level": "note", "message": {"text": "Unused endpoint: POST /{meeting_id}/actions/summarize"}, "properties": {"repobilityId": "a46f1fe2f3816718", "scanner": "scanner-primary", "fingerprint": "ddb569720a70fc91", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a26f83b977691a2c", "level": "note", "message": {"text": "Unused endpoint: GET /{meeting_id}/export-docx"}, "properties": {"repobilityId": "0c73f031a81fade0", "scanner": "scanner-primary", "fingerprint": "a26f83b977691a2c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-283d05bedd5d81ce", "level": "note", "message": {"text": "Unused endpoint: POST /{meeting_id}/actions/extract_requirements"}, "properties": {"repobilityId": "ccfc63b0a719f2d0", "scanner": "scanner-primary", "fingerprint": "283d05bedd5d81ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a27a478493853997", "level": "note", "message": {"text": "Unused endpoint: POST /{meeting_id}/actions/extract_stakeholders"}, "properties": {"repobilityId": "533d24597ebb5153", "scanner": "scanner-primary", "fingerprint": "a27a478493853997", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9f26b3ba6163f800", "level": "note", "message": {"text": "Unused endpoint: POST /{meeting_id}/actions/extract_process_flows"}, "properties": {"repobilityId": "e3f4913a67be09a8", "scanner": "scanner-primary", "fingerprint": "9f26b3ba6163f800", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-54e83e11c3e9b235", "level": "note", "message": {"text": "Unused endpoint: POST /{meeting_id}/actions/extract_illustrations"}, "properties": {"repobilityId": "d2df8346859fbadd", "scanner": "scanner-primary", "fingerprint": "54e83e11c3e9b235", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-deb2c1aa8b46f8cb", "level": "note", "message": {"text": "Unused endpoint: POST /{meeting_id}/sync-kb"}, "properties": {"repobilityId": "2f1c61a6786b2b36", "scanner": "scanner-primary", "fingerprint": "deb2c1aa8b46f8cb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f40b00bbc56ab5d8", "level": "note", "message": {"text": "Unused endpoint: POST /{meeting_id}/sync-stakeholder-map-kb"}, "properties": {"repobilityId": "47c16dc543b53ef4", "scanner": "scanner-primary", "fingerprint": "f40b00bbc56ab5d8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-30f41fdf69ed89c8", "level": "note", "message": {"text": "Unused endpoint: GET /feishu-credentials"}, "properties": {"repobilityId": "cb9ac738350afca4", "scanner": "scanner-primary", "fingerprint": "30f41fdf69ed89c8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6f6131f020727c2a", "level": "note", "message": {"text": "Unused endpoint: PUT /feishu-credentials"}, "properties": {"repobilityId": "0500fcb8b0792730", "scanner": "scanner-primary", "fingerprint": "6f6131f020727c2a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-60831baa8b777f6c", "level": "note", "message": {"text": "Unused endpoint: DELETE /feishu-credentials"}, "properties": {"repobilityId": "b0970ab60ae46bf7", "scanner": "scanner-primary", "fingerprint": "60831baa8b777f6c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f230200e047fa6f5", "level": "note", "message": {"text": "Unused endpoint: POST /{meeting_id}/check-feishu-url"}, "properties": {"repobilityId": "de6aab6dfb113c89", "scanner": "scanner-primary", "fingerprint": "f230200e047fa6f5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-627b48dc680ce12d", "level": "note", "message": {"text": "Unused endpoint: POST /{meeting_id}/export-feishu"}, "properties": {"repobilityId": "9175996e5e2fab7f", "scanner": "scanner-primary", "fingerprint": "627b48dc680ce12d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6b9812210986958f", "level": "note", "message": {"text": "Unused endpoint: POST /{meeting_id}/sync-requirements"}, "properties": {"repobilityId": "3e38652aaba26de3", "scanner": "scanner-primary", "fingerprint": "6b9812210986958f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4b467d1d0e29d7e1", "level": "note", "message": {"text": "Unused endpoint: POST /{meeting_id}/sync-action-items"}, "properties": {"repobilityId": "a44aac7c49aa610d", "scanner": "scanner-primary", "fingerprint": "4b467d1d0e29d7e1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-38d728c53cd52b85", "level": "note", "message": {"text": "Unused endpoint: POST /{meeting_id}/create-action-kanban"}, "properties": {"repobilityId": "74a0caa28dda1b6d", "scanner": "scanner-primary", "fingerprint": "38d728c53cd52b85", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-067f1bb670713367", "level": "note", "message": {"text": "Unused endpoint: GET /{meeting_id}/audio"}, "properties": {"repobilityId": "290f539070bbd9e5", "scanner": "scanner-primary", "fingerprint": "067f1bb670713367", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5c36cb021e1bd4d7", "level": "note", "message": {"text": "Unused endpoint: POST /{meeting_id}/chat"}, "properties": {"repobilityId": "1526ca97b5953d3c", "scanner": "scanner-primary", "fingerprint": "5c36cb021e1bd4d7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}