{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-be7e487b096d3563", "name": "Possibly dead Python function: load_dialect_impl", "shortDescription": {"text": "Possibly dead Python function: load_dialect_impl"}, "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-a8f956f7d73d04e6", "name": "Possibly dead Python function: require_project_scope", "shortDescription": {"text": "Possibly dead Python function: require_project_scope"}, "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-d3f8f94d53229fdc", "name": "Possibly dead Python function: require_project_manager", "shortDescription": {"text": "Possibly dead Python function: require_project_manager"}, "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-45d333e248a89cd9", "name": "Possibly dead Python function: to_dict", "shortDescription": {"text": "Possibly dead Python function: to_dict"}, "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-2dc736f1c3bf6e33", "name": "Possibly dead Python function: create_from_dict", "shortDescription": {"text": "Possibly dead Python function: create_from_dict"}, "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-e32ff162cd584159", "name": "Possibly dead Python function: delete_by_id", "shortDescription": {"text": "Possibly dead Python function: delete_by_id"}, "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-6e07b74505afd4e7", "name": "Possibly dead Python function: list_by_reviewer_item", "shortDescription": {"text": "Possibly dead Python function: list_by_reviewer_item"}, "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-ac790b3fa022e554", "name": "Possibly dead Python function: invalidate", "shortDescription": {"text": "Possibly dead Python function: invalidate"}, "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-2bacbb4e5bb97038", "name": "Possibly dead Python function: list_files", "shortDescription": {"text": "Possibly dead Python function: list_files"}, "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-b7f3e79b3cad0369", "name": "Possibly dead Python function: to_dict", "shortDescription": {"text": "Possibly dead Python function: to_dict"}, "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-5b0066867efad7eb", "name": "Possibly dead Python function: decorator", "shortDescription": {"text": "Possibly dead Python function: decorator"}, "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-5145656e490c0b1c", "name": "Possibly dead Python function: register", "shortDescription": {"text": "Possibly dead Python function: register"}, "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-74973541457cb30c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/layout/SidebarHeader.tsx:70", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/layout/SidebarHeader.tsx:70"}, "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-3d6d55f79bce6e4e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/layout/MobileSidebar.tsx:38", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/layout/MobileSidebar.tsx:38"}, "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-804a09b0ecda3671", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/layout/UserMenu.tsx:54", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/layout/UserMenu.tsx:54"}, "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-e5ef6f989e9d9331", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/layout/SidebarNavItem.tsx:33", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/layout/SidebarNavItem.tsx:33"}, "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-1c1341c7607bd33b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/navigation/NotificationCenter.tsx:352", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/navigation/NotificationCenter.tsx:352"}, "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-2e192672677685dc", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/navigation/Topbar.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/navigation/Topbar.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-4804f03abe81f6d0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/shared/list/FilterCategoricalField.tsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/shared/list/FilterCategoricalField.tsx:94"}, "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-80aaba892fce5933", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/shared/list/ListRowCard.tsx:37", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/shared/list/ListRowCard.tsx:37"}, "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-c57a148160efd409", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/shared/list/ActiveFilterChips.tsx:30", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/shared/list/ActiveFilterChips.tsx:30"}, "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-7604269e3eb31a55", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/shared/list/FilterFacetMultiSelectField.tsx:91", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/shared/list/FilterFacetMultiSelectField.tsx:91"}, "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-84ca320c13a86f61", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/shared/comparison/ConsensusIndicator.tsx:49", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/shared/comparison/ConsensusIndicator.tsx:49"}, "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-50dee0fb847a78a1", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ui/file-drop-zone.tsx:398", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ui/file-drop-zone.tsx:398"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-db031fc362f36f50", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ui/MultiSelectWithOther.tsx:119", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ui/MultiSelectWithOther.tsx:119"}, "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-56daed8cf52fcbd7", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/patterns/PageHeader.tsx:36", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/patterns/PageHeader.tsx:36"}, "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-529f22983e456831", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/user/ApiKeysSection.tsx:385", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/user/ApiKeysSection.tsx:385"}, "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-42b9696918668fcf", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/articles/ArticlesList.tsx:923", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/articles/ArticlesList.tsx:923"}, "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-b0f64c4f87aaed24", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/articles/ZoteroImportDialog.tsx:274", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/articles/ZoteroImportDialog.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-499bc1ae543352a0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/articles/ArticleDetailDialog.tsx:324", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/articles/ArticleDetailDialog.tsx:324"}, "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-f4acc091b780c051", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/articles/ArticleFileUploadDialogNew.tsx:463", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/articles/ArticleFileUploadDialogNew.tsx:463"}, "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-1200adb53c5c2c52", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/articles/ArticleForm.tsx:1168", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/articles/ArticleForm.tsx:1168"}, "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-25e5a17e64819baf", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/articles/ArticleKeywordsField.tsx:62", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/articles/ArticleKeywordsField.tsx:62"}, "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-5c9b65c0dfd3db37", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/extraction/ArticleExtractionTable.tsx:1007", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/extraction/ArticleExtractionTable.tsx:1007"}, "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-f5cd5fb14bef0d51", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/extraction/ai/AISuggestionHistoryPopover.tsx:15", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/extraction/ai/AISuggestionHistoryPopover.tsx:152"}, "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-34f1538e8ae0ef9b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/extraction/hierarchy/ModelSelector.tsx:264", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/extraction/hierarchy/ModelSelector.tsx:264"}, "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-0e46b05567e7ea52", "name": "TODO/FIXME marker in shipping code \u2014 frontend/components/extraction/comparison/ModelLevelComparison.tsx:99", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/components/extraction/comparison/ModelLevelComparison.tsx:99"}, "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-df029dff291f65a8", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/project/settings/TemplateConsensusOverride.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/project/settings/TemplateConsensusOverride.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-d4326e78269a9682", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/project/settings/TeamMembersSection.tsx:221", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/project/settings/TeamMembersSection.tsx:221"}, "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-c1259f5266d98f59", "name": "TODO/FIXME marker in shipping code \u2014 frontend/lib/logger.ts:33", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/lib/logger.ts:33"}, "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-052470a798335daf", "name": "TODO/FIXME marker in shipping code \u2014 frontend/lib/extraction/observability.ts:225", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/lib/extraction/observability.ts:225"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eb20b06887f992f6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/pages/Dashboard.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/pages/Dashboard.tsx:171"}, "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-ce0dc93ba8ebd034", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/pages/QualityAssessmentFullScreen.tsx:447", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/pages/QualityAssessmentFullScreen.tsx:447"}, "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-6eb4413b135a276b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/pages/ProjectView.tsx:289", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/pages/ProjectView.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-ff6d4f91e07d7be3", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm"}, "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-42222223b4a3450e", "name": "Dockerfile pipes a remote installer into a shell", "shortDescription": {"text": "Dockerfile pipes a remote installer into a shell"}, "fullDescription": {"text": "Executing downloaded code during image build gives the remote endpoint build-time code execution. Prefer pinned packages or verify downloaded installers by checksum/signature."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "high", "confidence": 1.0}}, {"id": "scanner-714c31ca9f474ae6", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-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-dc90a0615102f09f", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/pdf-viewer/engines/mock/index.ts:114", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/pdf-viewer/engines/mock/index.ts:114"}, "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-876f447454ae3685", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/pdf-viewer/engines/pdfjs/page.ts:92", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/pdf-viewer/engines/pdfjs/page.ts:92"}, "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-46553c9cc2f9375d", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/pdf-viewer/primitives/TextLayer.tsx:41", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/pdf-viewer/primitives/TextLayer.tsx:41"}, "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-5a06d275ce20d9f9", "name": "Possible secret in frontend/lib/copy/auth.ts", "shortDescription": {"text": "Possible secret in frontend/lib/copy/auth.ts"}, "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-1063a2aaf3acf244", "name": "Possible secret in frontend/lib/copy/user.ts", "shortDescription": {"text": "Possible secret in frontend/lib/copy/user.ts"}, "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-cc83fce1429c979f", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/hooks/useKeyboardShortcuts.test.ts:27", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/hooks/useKeyboardShortcuts.test.ts:27"}, "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-f38bdc787464382f", "name": "Possible secret in frontend/e2e/flows/settings-api-keys.e2e.ts", "shortDescription": {"text": "Possible secret in frontend/e2e/flows/settings-api-keys.e2e.ts"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-b2a5831600e39e67", "name": "Possible secret in frontend/e2e/_fixtures/fixture-ids.ts", "shortDescription": {"text": "Possible secret in frontend/e2e/_fixtures/fixture-ids.ts"}, "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-74de4aca2ae97224", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "astral-sh/setup-uv@v7 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-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-python@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-dd90d5c5852699d5", "name": "Very large file: frontend/integrations/supabase/types.ts (2423 lines)", "shortDescription": {"text": "Very large file: frontend/integrations/supabase/types.ts (2423 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-385319d414c7de68", "name": "Very large file: frontend/types/api/schema.d.ts (4114 lines)", "shortDescription": {"text": "Very large file: frontend/types/api/schema.d.ts (4114 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-90d210025dc7c288", "name": "Very large file: frontend/components/articles/ArticlesList.tsx (1364 lines)", "shortDescription": {"text": "Very large file: frontend/components/articles/ArticlesList.tsx (1364 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-1c2c19af4e61e28e", "name": "Very large file: frontend/components/articles/ArticleForm.tsx (1272 lines)", "shortDescription": {"text": "Very large file: frontend/components/articles/ArticleForm.tsx (1272 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-1ade62e85da50a33", "name": "Very large file: frontend/components/extraction/ArticleExtractionTable.tsx (1198 lines)", "shortDescription": {"text": "Very large file: frontend/components/extraction/ArticleExtractionTable.tsx (1198 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-18b993e5840752d3", "name": "Very large file: backend/tests/unit/test_extraction_export_service.py (2193 lines)", "shortDescription": {"text": "Very large file: backend/tests/unit/test_extraction_export_service.py (2193 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-9e8f0c4cdc6087a9", "name": "Very large file: backend/tests/unit/test_section_extraction_service.py (1818 lines)", "shortDescription": {"text": "Very large file: backend/tests/unit/test_section_extraction_service.py (1818 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-d687666cab62a809", "name": "Very large file: backend/app/seed.py (1941 lines)", "shortDescription": {"text": "Very large file: backend/app/seed.py (1941 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-05875d06300b0f13", "name": "Very large file: backend/app/services/extraction_export_service.py (1521 lines)", "shortDescription": {"text": "Very large file: backend/app/services/extraction_export_service.py (1521 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-86534aa2e90c3744", "name": "Very large file: backend/alembic/versions/archive/0001_initial_public_schema.py (2783 lines)", "shortDescription": {"text": "Very large file: backend/alembic/versions/archive/0001_initial_public_schema.py (2783 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-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 58 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 205 placeholder/mock markers across 74 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-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-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.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-f81e7c86cac60cb1", "name": "Agent authority lacks a verifier contract: .claude/skills/architectural-quality-loop/references/concept-glossary.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/architectural-quality-loop/references/concept-glossary.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-5c9aa21d27d3e2f5", "name": "Agent authority lacks a verifier contract: .claude/skills/architectural-quality-loop/references/budget-policy.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/architectural-quality-loop/references/budget-policy.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-b46873b7b3aa2027", "name": "Agent authority lacks a verifier contract: .claude/skills/code-review/references/automated-pr-review.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/code-review/references/automated-pr-review.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-c16d27ca347b7872", "name": "Agent authority lacks a verifier contract: .claude/skills/ui-styling/references/tailwind-v4.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/ui-styling/references/tailwind-v4.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-bef304d0894de7f8", "name": "Agent authority lacks a verifier contract: .claude/skills/backend-development/references/structlog.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/backend-development/references/structlog.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-e221bd8f8e52c5be", "name": "Agent authority lacks a verifier contract: .claude/skills/backend-development/references/sqlalchemy.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/backend-development/references/sqlalchemy.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-6b458e41efbf50ca", "name": "Agent authority lacks a verifier contract: .claude/skills/backend-development/references/pydantic.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/backend-development/references/pydantic.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-c4aedfe4692d0a7c", "name": "Agent authority lacks a verifier contract: .claude/skills/frontend-ux/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/frontend-ux/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-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a1f81e236e08c51f", "name": "Commented-code block (5 lines) in playwright.config.ts:96", "shortDescription": {"text": "Commented-code block (5 lines) in playwright.config.ts:96"}, "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-aea6e62dc162bdfc", "name": "Commented-code block (5 lines) in vitest.config.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in vitest.config.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9d70362ac06ada9d", "name": "Commented-code block (7 lines) in frontend/integrations/api/client.ts:135", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/integrations/api/client.ts:135"}, "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-69205504e0fcbfa8", "name": "Commented-code block (5 lines) in frontend/pdf-viewer/PrumoPdfViewer.tsx:46", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/pdf-viewer/PrumoPdfViewer.tsx:46"}, "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-a6e861907f3a36ec", "name": "Commented-code block (8 lines) in frontend/pdf-viewer/primitives/Viewer.tsx:50", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/pdf-viewer/primitives/Viewer.tsx: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-817825fbd494a257", "name": "Commented-code block (7 lines) in frontend/test/rls-section-field.test.ts:77", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/test/rls-section-field.test.ts:77"}, "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-0d107b285bce0cc5", "name": "Commented-code block (8 lines) in frontend/test/hooks/useAutoSaveProposals.test.tsx:188", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/test/hooks/useAutoSaveProposals.test.tsx:188"}, "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-a06a457a7210ed27", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/test/hooks/useExtractionSession.test.tsx:191", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/test/hooks/useExtractionSession.test.tsx:191"}, "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-e99e1169d627beed", "name": "Commented-code block (7 lines) in frontend/test/hooks/useExtractedValues.test.tsx:126", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/test/hooks/useExtractedValues.test.tsx:126"}, "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-fd6344675e36e4f5", "name": "Commented-code block (6 lines) in frontend/test/hooks/useModelManagement.test.tsx:81", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/test/hooks/useModelManagement.test.tsx:81"}, "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-07d1ca10d0086ed9", "name": "Commented-code block (5 lines) in frontend/components/ui/resizable-panel.tsx:117", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/components/ui/resizable-panel.tsx:117"}, "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-0836f0deb0c52a5c", "name": "Commented-code block (5 lines) in frontend/components/runs/ReviewerAvatarStack.tsx:40", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/components/runs/ReviewerAvatarStack.tsx:40"}, "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-215d9e700a3ba6cd", "name": "Commented-code block (8 lines) in frontend/components/extraction/ArticleExtractionTable.tsx:289", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/components/extraction/ArticleExtractionTable.tsx:289"}, "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-dfcaa5fbb64c3ad1", "name": "Commented-code block (6 lines) in frontend/components/extraction/FieldInput.tsx:368", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/components/extraction/FieldInput.tsx:368"}, "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-084109182e78d2c1", "name": "Commented-code block (7 lines) in frontend/lib/utils.ts:4", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/lib/utils.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fe238ec1b0c37fb5", "name": "Commented-code block (6 lines) in frontend/lib/extraction/observability.ts:225", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/lib/extraction/observability.ts:225"}, "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-d1579eed95401006", "name": "Commented-code block (6 lines) in frontend/pages/Auth.tsx:336", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/pages/Auth.tsx:336"}, "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-1d3c401a151e7546", "name": "Commented-code block (7 lines) in frontend/pages/QualityAssessmentFullScreen.tsx:73", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/pages/QualityAssessmentFullScreen.tsx:73"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-37c3b45acc44920d", "name": "Commented-code block (5 lines) in frontend/pages/ExtractionFullScreen.tsx:137", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/pages/ExtractionFullScreen.tsx:137"}, "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-17c35f3ace377e38", "name": "Commented-code block (7 lines) in frontend/hooks/qa/useQAAssessmentSession.ts:53", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/hooks/qa/useQAAssessmentSession.ts:53"}, "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-f277ad30712949f6", "name": "Commented-code block (5 lines) in frontend/hooks/runs/useAutoSaveProposals.ts:124", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/hooks/runs/useAutoSaveProposals.ts:124"}, "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-7040fa2f59e7feb2", "name": "Commented-code block (5 lines) in frontend/hooks/extraction/useFullAIExtraction.ts:152", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/hooks/extraction/useFullAIExtraction.ts:152"}, "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-ac021c5c34b23918", "name": "Commented-code block (6 lines) in frontend/hooks/extraction/useExtractionSession.ts:22", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/hooks/extraction/useExtractionSession.ts:22"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-db1c0f1d568c28ca", "name": "Commented-code block (5 lines) in frontend/hooks/extraction/useExtractionData.ts:122", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/hooks/extraction/useExtractionData.ts:122"}, "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-b14b5ae5de5ce7c2", "name": "Commented-code block (10 lines) in frontend/hooks/extraction/useExtractedValues.ts:101", "shortDescription": {"text": "Commented-code block (10 lines) in frontend/hooks/extraction/useExtractedValues.ts:101"}, "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-2face56c081089a8", "name": "Commented-code block (6 lines) in frontend/hooks/extraction/ai/useAISuggestions.ts:51", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/hooks/extraction/ai/useAISuggestions.ts:51"}, "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-c42fbbdbacf98142", "name": "Commented-code block (6 lines) in frontend/hooks/extraction/helpers/queryEntityTypes.ts:76", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/hooks/extraction/helpers/queryEntityTypes.ts:76"}, "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-8f8920239393950a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/services/extractionExportService.ts:55", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/services/extractionExportService.ts:55"}, "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-3a4dcd2ed6fdb98f", "name": "Commented-code block (11 lines) in frontend/services/extractionValueService.ts:216", "shortDescription": {"text": "Commented-code block (11 lines) in frontend/services/extractionValueService.ts:216"}, "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-14921d4e9dc9c27e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/services/apiKeysService.ts:66", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/services/apiKeysService.ts:66"}, "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-bc4ee06a71f50411", "name": "Commented-code block (5 lines) in frontend/services/aiSuggestionService.ts:148", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/services/aiSuggestionService.ts:148"}, "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-9d3af32976104699", "name": "Commented-code block (6 lines) in frontend/services/extractionInstanceService.ts:497", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/services/extractionInstanceService.ts:497"}, "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-e8d2e9c51a44c19f", "name": "Commented-code block (6 lines) in frontend/services/errorTracking.ts:226", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/services/errorTracking.ts:226"}, "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-f745011999bcace0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/services/errorTracking.ts:243", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/services/errorTracking.ts:243"}, "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-7e0b8ca3ccae1c5c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/services/articlesExportService.ts:58", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/services/articlesExportService.ts:58"}, "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-3418bfd623c9b38a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/extraction-observability.e2e.ts:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/extraction-observability.e2e.ts:37"}, "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-b80c01296eafc369", "name": "Commented-code block (5 lines) in frontend/e2e/flows/hitl-run-lifecycle.api.e2e.ts:66", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/e2e/flows/hitl-run-lifecycle.api.e2e.ts:66"}, "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-aed061a7d90bdb7a", "name": "Commented-code block (5 lines) in frontend/e2e/flows/extraction-reopen.ui.e2e.ts:52", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/e2e/flows/extraction-reopen.ui.e2e.ts:52"}, "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-21b3b44fece25a38", "name": "Commented-code block (6 lines) in frontend/e2e/flows/extraction-value-coherence.ui.e2e.ts:51", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/e2e/flows/extraction-value-coherence.ui.e2e.ts:51"}, "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-9707eac0657118f1", "name": "Commented-code block (10 lines) in frontend/e2e/flows/extraction-refresh.ui.e2e.ts:110", "shortDescription": {"text": "Commented-code block (10 lines) in frontend/e2e/flows/extraction-refresh.ui.e2e.ts:110"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8be55f44e59fdd51", "name": "Commented-code block (5 lines) in frontend/e2e/remote/smoke-remote.e2e.ts:41", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/e2e/remote/smoke-remote.e2e.ts:41"}, "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-627bdb4fac5dc8ef", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/_fixtures/api.ts:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/_fixtures/api.ts:38"}, "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-961ead9abc81a349", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/_fixtures/global-teardown.ts:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/_fixtures/global-teardown.ts:19"}, "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-95f1f8d7cc02a55e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/_fixtures/storage.ts:4", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/_fixtures/storage.ts:4"}, "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-e51f99a5f1715374", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/_fixtures/ensure-fixtures.ts:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/_fixtures/ensure-fixtures.ts:16"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-81812f509b96b6f4", "name": "Commented-code block (5 lines) in frontend/e2e/_fixtures/hitl.ts:111", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/e2e/_fixtures/hitl.ts:111"}, "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-b64cbcdd7f2cf866", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/_fixtures/supabase-admin.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/_fixtures/supabase-admin.ts:29"}, "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-26cb1a692dba5280", "name": "Commented-code block (5 lines) in frontend/e2e/_fixtures/global-setup.ts:130", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/e2e/_fixtures/global-setup.ts:130"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5823c0a17089444f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/_fixtures/global-setup.ts:151", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/_fixtures/global-setup.ts:151"}, "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-9d3c120b58c6486e", "name": "Commented-code block (8 lines) in scripts/enumerate_compiler_bailouts.mjs:1", "shortDescription": {"text": "Commented-code block (8 lines) in scripts/enumerate_compiler_bailouts.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-33143801b7779b6b", "name": "Commented-code block (5 lines) in scripts/check_compiler_coverage.mjs:1", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/check_compiler_coverage.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-99ca5403543d3b3a", "name": "Legacy-named symbol `baseline_v1` in scripts/fitness/check_legacy_concepts.py:97", "shortDescription": {"text": "Legacy-named symbol `baseline_v1` in scripts/fitness/check_legacy_concepts.py:97"}, "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-ed98f92ed0f33704", "name": "Legacy-named symbol `baseline_v1` in backend/tests/integration/test_migration_roundtrip.py:47", "shortDescription": {"text": "Legacy-named symbol `baseline_v1` in backend/tests/integration/test_migration_roundtrip.py:47"}, "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-9420c3f443a0dd98", "name": "Commented-code block (5 lines) in backend/tests/integration/test_kind_discriminator.py:66", "shortDescription": {"text": "Commented-code block (5 lines) in backend/tests/integration/test_kind_discriminator.py:66"}, "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-7b3c6713633fc48d", "name": "Commented-code block (10 lines) in backend/tests/integration/conftest.py:96", "shortDescription": {"text": "Commented-code block (10 lines) in backend/tests/integration/conftest.py:96"}, "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-ddfb7effd6780d65", "name": "Commented-code block (7 lines) in backend/tests/integration/test_run_view_current_values.py:61", "shortDescription": {"text": "Commented-code block (7 lines) in backend/tests/integration/test_run_view_current_values.py:61"}, "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-01f75271322495f9", "name": "Commented-code block (6 lines) in backend/tests/integration/test_multi_run_scoping.py:193", "shortDescription": {"text": "Commented-code block (6 lines) in backend/tests/integration/test_multi_run_scoping.py:193"}, "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-fb7c448ddde2e547", "name": "Commented-code block (9 lines) in backend/tests/integration/test_run_lifecycle_concurrency.py:300", "shortDescription": {"text": "Commented-code block (9 lines) in backend/tests/integration/test_run_lifecycle_concurrency.py:300"}, "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-c1cd4a2632afdb4b", "name": "Commented-code block (6 lines) in backend/tests/integration/test_calculate_model_progress.py:489", "shortDescription": {"text": "Commented-code block (6 lines) in backend/tests/integration/test_calculate_model_progress.py:489"}, "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-42458872ed2c7c1a", "name": "Commented-code block (9 lines) in backend/tests/integration/test_hitl_session_concurrency.py:360", "shortDescription": {"text": "Commented-code block (9 lines) in backend/tests/integration/test_hitl_session_concurrency.py:360"}, "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-84e5d35b8aefbe25", "name": "Commented-code block (5 lines) in backend/tests/integration/test_hitl_session.py:903", "shortDescription": {"text": "Commented-code block (5 lines) in backend/tests/integration/test_hitl_session.py:903"}, "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-1681eddffed35c70", "name": "Commented-code block (6 lines) in backend/tests/integration/test_membership_guards.py:583", "shortDescription": {"text": "Commented-code block (6 lines) in backend/tests/integration/test_membership_guards.py:583"}, "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-686232b5579e0008", "name": "Commented-code block (5 lines) in backend/tests/integration/test_extraction_proposal_service.py:123", "shortDescription": {"text": "Commented-code block (5 lines) in backend/tests/integration/test_extraction_proposal_service.py:123"}, "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-d3a2fa5a24f92e97", "name": "Commented-code block (5 lines) in backend/tests/integration/test_run_lifecycle_service.py:301", "shortDescription": {"text": "Commented-code block (5 lines) in backend/tests/integration/test_run_lifecycle_service.py:301"}, "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-ea4f385c5c76a048", "name": "Commented-code block (7 lines) in backend/tests/integration/smoke_constraints/test_workflow_article_coherence.py:34", "shortDescription": {"text": "Commented-code block (7 lines) in backend/tests/integration/smoke_constraints/test_workflow_article_coherence.py:34"}, "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-b029e21a48e863e4", "name": "Commented-code block (5 lines) in backend/tests/unit/test_extraction_export_schemas.py:132", "shortDescription": {"text": "Commented-code block (5 lines) in backend/tests/unit/test_extraction_export_schemas.py:132"}, "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-3ab57bdbd7a5c465", "name": "Commented-code block (6 lines) in backend/tests/unit/test_section_extraction_service.py:293", "shortDescription": {"text": "Commented-code block (6 lines) in backend/tests/unit/test_section_extraction_service.py:293"}, "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-8e30ec16cf45aa3b", "name": "Legacy-named symbol `useLegacy` in backend/tests/unit/scripts/test_check_react_query_keys_canary.py:69", "shortDescription": {"text": "Legacy-named symbol `useLegacy` in backend/tests/unit/scripts/test_check_react_query_keys_canary.py:69"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9666c92b5ded3572", "name": "Legacy-named symbol `extraction_legacy` in backend/tests/unit/scripts/test_check_rls_coverage_canary.py:67", "shortDescription": {"text": "Legacy-named symbol `extraction_legacy` in backend/tests/unit/scripts/test_check_rls_coverage_canary.py:67"}, "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-d5b23c2b7d843547", "name": "Legacy-named symbol `0001_baseline_v1` in backend/app/models/article.py:313", "shortDescription": {"text": "Legacy-named symbol `0001_baseline_v1` in backend/app/models/article.py:313"}, "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-5e3ca593293556c2", "name": "Commented-code block (6 lines) in backend/app/models/extraction.py:313", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/models/extraction.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-32051ed23de22966", "name": "Commented-code block (5 lines) in backend/app/models/extraction_workflow.py:152", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/models/extraction_workflow.py:152"}, "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-900e325cba2a4f08", "name": "Commented-code block (10 lines) in backend/app/api/v1/endpoints/section_extraction.py:129", "shortDescription": {"text": "Commented-code block (10 lines) in backend/app/api/v1/endpoints/section_extraction.py:129"}, "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-19836ef449de216e", "name": "Commented-code block (6 lines) in backend/app/api/v1/endpoints/user_api_keys.py:190", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/api/v1/endpoints/user_api_keys.py:190"}, "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-6786cce50dc66f3d", "name": "Commented-code block (7 lines) in backend/app/api/v1/endpoints/extraction_export.py:372", "shortDescription": {"text": "Commented-code block (7 lines) in backend/app/api/v1/endpoints/extraction_export.py:372"}, "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-2110a6ccf2f839a2", "name": "Commented-code block (6 lines) in backend/app/api/v1/endpoints/articles_export.py:245", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/api/v1/endpoints/articles_export.py:245"}, "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-5cc883331c2d7e48", "name": "Commented-code block (8 lines) in backend/app/worker/celery_app.py:50", "shortDescription": {"text": "Commented-code block (8 lines) in backend/app/worker/celery_app.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-1b03221a55841bfe", "name": "Commented-code block (6 lines) in backend/app/services/hitl_session_service.py:209", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/services/hitl_session_service.py:209"}, "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-2bc3b06ebb95b18d", "name": "Commented-code block (6 lines) in backend/app/services/section_extraction_service.py:157", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/services/section_extraction_service.py:157"}, "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-d5a7f537282f3ef6", "name": "Commented-code block (5 lines) in backend/app/services/model_extraction_service.py:438", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/services/model_extraction_service.py:438"}, "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-153be28dadf7b632", "name": "Commented-code block (6 lines) in backend/app/services/run_lifecycle_service.py:173", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/services/run_lifecycle_service.py:173"}, "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-212ce64430f8138f", "name": "Commented-code block (15 lines) in backend/app/services/template_clone_service.py:80", "shortDescription": {"text": "Commented-code block (15 lines) in backend/app/services/template_clone_service.py:80"}, "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-1f3bf1c7ba64cc45", "name": "Commented-code block (5 lines) in backend/app/services/extraction_review_service.py:88", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/services/extraction_review_service.py:88"}, "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-958caf7332958e05", "name": "Commented-code block (16 lines) in backend/app/services/extraction_proposal_service.py:50", "shortDescription": {"text": "Commented-code block (16 lines) in backend/app/services/extraction_proposal_service.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-37be40456251bc8e", "name": "Commented-code block (5 lines) in backend/app/services/exports/extraction_xlsx_builder.py:64", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/services/exports/extraction_xlsx_builder.py:64"}, "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-77194faf5fd73e51", "name": "Commented-code block (5 lines) in backend/app/core/config.py:42", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/core/config.py:42"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f1f434d35aca4a08", "name": "Commented-code block (5 lines) in backend/alembic/versions/0017_backfill_role_in_snapshot.py:78", "shortDescription": {"text": "Commented-code block (5 lines) in backend/alembic/versions/0017_backfill_role_in_snapshot.py:78"}, "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-82e036d2745310b2", "name": "Legacy-named symbol `0001_baseline_v1` in backend/alembic/versions/0002_drop_extracted_values.py:4", "shortDescription": {"text": "Legacy-named symbol `0001_baseline_v1` in backend/alembic/versions/0002_drop_extracted_values.py:4"}, "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-1c645d1798b7a6d6", "name": "Commented-code block (6 lines) in backend/alembic/versions/0013_fix_calculate_model_progress.py:126", "shortDescription": {"text": "Commented-code block (6 lines) in backend/alembic/versions/0013_fix_calculate_model_progress.py:126"}, "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-9527043196977afe", "name": "Legacy-named symbol `baseline_v1` in backend/alembic/versions/0007_drop_migration_status.py:7", "shortDescription": {"text": "Legacy-named symbol `baseline_v1` in backend/alembic/versions/0007_drop_migration_status.py:7"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c87ce654c28af229", "name": "Commented-code block (8 lines) in backend/alembic/versions/0015_charms_studylevel_split.py:74", "shortDescription": {"text": "Commented-code block (8 lines) in backend/alembic/versions/0015_charms_studylevel_split.py:74"}, "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-9099a57afb1ef418", "name": "Commented-code block (5 lines) in backend/alembic/versions/0016_entity_role_column.py:154", "shortDescription": {"text": "Commented-code block (5 lines) in backend/alembic/versions/0016_entity_role_column.py:154"}, "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-a8943c78ff33d959", "name": "Legacy-named symbol `0001_baseline_v1` in backend/alembic/versions/0001_baseline_v1.py:3", "shortDescription": {"text": "Legacy-named symbol `0001_baseline_v1` in backend/alembic/versions/0001_baseline_v1.py:3"}, "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-c02b0f2146601b8e", "name": "Legacy-named symbol `0001_baseline_v1` in backend/alembic/versions/0003_storage_object_policies.py:12", "shortDescription": {"text": "Legacy-named symbol `0001_baseline_v1` in backend/alembic/versions/0003_storage_object_policies.py:12"}, "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-4a78f23d5ecc18a6", "name": "Commented-code block (7 lines) in backend/alembic/versions/0026_widen_template_snapshot.py:33", "shortDescription": {"text": "Commented-code block (7 lines) in backend/alembic/versions/0026_widen_template_snapshot.py:33"}, "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-8aa754baa8b4f928", "name": "Commented-code block (5 lines) in backend/alembic/versions/0020_feedback_outbox.py:112", "shortDescription": {"text": "Commented-code block (5 lines) in backend/alembic/versions/0020_feedback_outbox.py:112"}, "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-3cbded522ac8c58c", "name": "Legacy-named symbol `extraction_run_stage_old` in backend/alembic/versions/archive/20260427_0014_run_stage_enum_migratio", "shortDescription": {"text": "Legacy-named symbol `extraction_run_stage_old` in backend/alembic/versions/archive/20260427_0014_run_stage_enum_migration.py:18"}, "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-226522e03cfab62d", "name": "45 env vars used in code but missing from .env.example", "shortDescription": {"text": "45 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `CI`, `DEV`, `E2E_API_URL`, `E2E_ARTICLE_ID`, `E2E_AUTH_TOKEN`, `E2E_ENTITY_TYPE_ID`, `E2E_FRONTEND_URL`, `E2E_IMPORT_PROJECT_ID` + 37 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-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/fitness/check_react_query_keys.py:load_baseline, scripts/fitness/check_api_response_envelope.py:load_baseline, scripts/fitness/check_layered_arch.py:load_baseline\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/fitness/check_api_response_envelope.py:scan_file, scripts/fitness/check_api_response_envelope.py:scan\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-0027e313ade46c8f", "name": "Near-duplicate function bodies in 7 places", "shortDescription": {"text": "Near-duplicate function bodies in 7 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/app/services/extraction_consensus_service.py:record_consensus, backend/app/services/extraction_consensus_service.py:publish, backend/app/services/extraction_review_service.py:record_decision, backend/app/services/extraction_proposal_service.py:record_proposal\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-1d33a79cff34f9ac", "name": "Frontend route `/auth/reset-password` has no Link/navigate to it \u2014 frontend/App.tsx", "shortDescription": {"text": "Frontend route `/auth/reset-password` has no Link/navigate to it \u2014 frontend/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-d15b56a2a30d5b11", "name": "Frontend route `/projects/:projectId` has no Link/navigate to it \u2014 frontend/test/QualityAssessmentInterface.test.tsx", "shortDescription": {"text": "Frontend route `/projects/:projectId` has no Link/navigate to it \u2014 frontend/test/QualityAssessmentInterface.test.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-73ac53bb9dadf63c", "name": "Frontend route `/projects/:projectId/extraction/:articleId` has no Link/navigate to it \u2014 frontend/App.tsx", "shortDescription": {"text": "Frontend route `/projects/:projectId/extraction/:articleId` has no Link/navigate to it \u2014 frontend/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-fddc9ac67122708e", "name": "Frontend route `/projects/:projectId/articles/:articleId/quality-assessment/:templateId` has no Link/navigate to it \u2014 fr", "shortDescription": {"text": "Frontend route `/projects/:projectId/articles/:articleId/quality-assessment/:templateId` has no Link/navigate to it \u2014 frontend/test/QualityAssessmentFullScreen.test.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-a00ce1c9062cbf55", "name": "Frontend route `/projects/:projectId/articles/add` has no Link/navigate to it \u2014 frontend/App.tsx", "shortDescription": {"text": "Frontend route `/projects/:projectId/articles/add` has no Link/navigate to it \u2014 frontend/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-46896a05e59b0136", "name": "Frontend route `/projects/:projectId/articles/:articleId/edit` has no Link/navigate to it \u2014 frontend/App.tsx", "shortDescription": {"text": "Frontend route `/projects/:projectId/articles/:articleId/edit` has no Link/navigate to it \u2014 frontend/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-200787cd8ae71081", "name": "FastAPI POST `extract_section` without auth dependency \u2014 backend/app/api/v1/endpoints/section_extraction.py:65", "shortDescription": {"text": "FastAPI POST `extract_section` without auth dependency \u2014 backend/app/api/v1/endpoints/section_extraction.py:65"}, "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-0d745cbaa5d8240d", "name": "FastAPI POST `create_api_key` without auth dependency \u2014 backend/app/api/v1/endpoints/user_api_keys.py:105", "shortDescription": {"text": "FastAPI POST `create_api_key` without auth dependency \u2014 backend/app/api/v1/endpoints/user_api_keys.py:105"}, "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-62a846fe19221e6e", "name": "FastAPI PATCH `update_api_key` without auth dependency \u2014 backend/app/api/v1/endpoints/user_api_keys.py:171", "shortDescription": {"text": "FastAPI PATCH `update_api_key` without auth dependency \u2014 backend/app/api/v1/endpoints/user_api_keys.py:171"}, "fullDescription": {"text": "`@router.patch` 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-759c8aadac9d3f70", "name": "FastAPI DELETE `delete_api_key` without auth dependency \u2014 backend/app/api/v1/endpoints/user_api_keys.py:301", "shortDescription": {"text": "FastAPI DELETE `delete_api_key` without auth dependency \u2014 backend/app/api/v1/endpoints/user_api_keys.py:301"}, "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-6cebcbbf9d096226", "name": "FastAPI POST `validate_api_key` without auth dependency \u2014 backend/app/api/v1/endpoints/user_api_keys.py:355", "shortDescription": {"text": "FastAPI POST `validate_api_key` without auth dependency \u2014 backend/app/api/v1/endpoints/user_api_keys.py:355"}, "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-9c437fd07881a9e5", "name": "FastAPI POST `zotero_action` without auth dependency \u2014 backend/app/api/v1/endpoints/zotero_import.py:91", "shortDescription": {"text": "FastAPI POST `zotero_action` without auth dependency \u2014 backend/app/api/v1/endpoints/zotero_import.py:91"}, "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-05e0efbf9e9786a8", "name": "FastAPI POST `submit_feedback` without auth dependency \u2014 backend/app/api/v1/endpoints/feedback.py:18", "shortDescription": {"text": "FastAPI POST `submit_feedback` without auth dependency \u2014 backend/app/api/v1/endpoints/feedback.py:18"}, "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-6adee6b62594e9b2", "name": "FastAPI POST `start_extraction_export` without auth dependency \u2014 backend/app/api/v1/endpoints/extraction_export.py:125", "shortDescription": {"text": "FastAPI POST `start_extraction_export` without auth dependency \u2014 backend/app/api/v1/endpoints/extraction_export.py:125"}, "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-dbf463a768eaa628", "name": "FastAPI POST `cancel_extraction_export` without auth dependency \u2014 backend/app/api/v1/endpoints/extraction_export.py:444", "shortDescription": {"text": "FastAPI POST `cancel_extraction_export` without auth dependency \u2014 backend/app/api/v1/endpoints/extraction_export.py:444"}, "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-c227b350ec9cdda2", "name": "FastAPI DELETE `cancel_extraction_export` without auth dependency \u2014 backend/app/api/v1/endpoints/extraction_export.py:44", "shortDescription": {"text": "FastAPI DELETE `cancel_extraction_export` without auth dependency \u2014 backend/app/api/v1/endpoints/extraction_export.py:449"}, "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-fa1cd8d8a05bb3f3", "name": "FastAPI POST `extract_models` without auth dependency \u2014 backend/app/api/v1/endpoints/model_extraction.py:107", "shortDescription": {"text": "FastAPI POST `extract_models` without auth dependency \u2014 backend/app/api/v1/endpoints/model_extraction.py:107"}, "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-8ea8313113bd5608", "name": "FastAPI POST `start_export` without auth dependency \u2014 backend/app/api/v1/endpoints/articles_export.py:91", "shortDescription": {"text": "FastAPI POST `start_export` without auth dependency \u2014 backend/app/api/v1/endpoints/articles_export.py:91"}, "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-8482667061520c96", "name": "FastAPI POST `cancel_export` without auth dependency \u2014 backend/app/api/v1/endpoints/articles_export.py:330", "shortDescription": {"text": "FastAPI POST `cancel_export` without auth dependency \u2014 backend/app/api/v1/endpoints/articles_export.py:330"}, "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-bcdde8a43f2b55bf", "name": "FastAPI DELETE `cancel_export` without auth dependency \u2014 backend/app/api/v1/endpoints/articles_export.py:335", "shortDescription": {"text": "FastAPI DELETE `cancel_export` without auth dependency \u2014 backend/app/api/v1/endpoints/articles_export.py:335"}, "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-0be22a0989bd0a9a", "name": "Dangling fetch: POST /api/errors (frontend/services/errorTracking.ts:227)", "shortDescription": {"text": "Dangling fetch: POST /api/errors (frontend/services/errorTracking.ts:227)"}, "fullDescription": {"text": "`frontend/services/errorTracking.ts:227` calls `POST /api/errors` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/errors`\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-788c08e825a28f78", "name": "Dangling fetch: POST /api/metrics (frontend/services/errorTracking.ts:243)", "shortDescription": {"text": "Dangling fetch: POST /api/metrics (frontend/services/errorTracking.ts:243)"}, "fullDescription": {"text": "`frontend/services/errorTracking.ts:243` calls `POST /api/metrics` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/metrics`\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-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`backend/app/main.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-27ac02018b635ba2", "name": "Unused endpoint: POST /extraction/sections", "shortDescription": {"text": "Unused endpoint: POST /extraction/sections"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/section_extraction.py` declares `POST /extraction/sections` 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": "`backend/app/api/v1/endpoints/user_api_keys.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-e8c80beb5035ed21", "name": "Unused endpoint: PATCH /{key_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{key_id}"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/user_api_keys.py` declares `PATCH /{key_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-e21cf4ee09f7c6a9", "name": "Unused endpoint: GET /providers", "shortDescription": {"text": "Unused endpoint: GET /providers"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/user_api_keys.py` declares `GET /providers` 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-38f0a0bf734e5bcc", "name": "Unused endpoint: DELETE /{key_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{key_id}"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/user_api_keys.py` declares `DELETE /{key_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-b905b06393a342f9", "name": "Unused endpoint: POST /{key_id}/validate", "shortDescription": {"text": "Unused endpoint: POST /{key_id}/validate"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/user_api_keys.py` declares `POST /{key_id}/validate` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-85a63c934adce435", "name": "Unused endpoint: POST /zotero/{action}", "shortDescription": {"text": "Unused endpoint: POST /zotero/{action}"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/zotero_import.py` declares `POST /zotero/{action}` 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-67ec58b621385b7e", "name": "Unused endpoint: GET /articles/{article_id}/citations", "shortDescription": {"text": "Unused endpoint: GET /articles/{article_id}/citations"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/citations.py` declares `GET /articles/{article_id}/citations` 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-fa69f831f41695af", "name": "Unused endpoint: POST /hitl/sessions", "shortDescription": {"text": "Unused endpoint: POST /hitl/sessions"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/hitl_sessions.py` declares `POST /hitl/sessions` 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-b2676239b16ebeda", "name": "Unused endpoint: POST /{project_id}/extraction-export", "shortDescription": {"text": "Unused endpoint: POST /{project_id}/extraction-export"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/extraction_export.py` declares `POST /{project_id}/extraction-export` 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-b11971dd07f8b6a2", "name": "Unused endpoint: GET /{project_id}/extraction-export/reviewers", "shortDescription": {"text": "Unused endpoint: GET /{project_id}/extraction-export/reviewers"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/extraction_export.py` declares `GET /{project_id}/extraction-export/reviewers` 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-d9f05f08039e6313", "name": "Unused endpoint: GET /{project_id}/extraction-export/status/{job_id}", "shortDescription": {"text": "Unused endpoint: GET /{project_id}/extraction-export/status/{job_id}"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/extraction_export.py` declares `GET /{project_id}/extraction-export/status/{job_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-cb40cedab1428ef4", "name": "Unused endpoint: POST /{project_id}/extraction-export/status/{job_id}/cancel", "shortDescription": {"text": "Unused endpoint: POST /{project_id}/extraction-export/status/{job_id}/cancel"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/extraction_export.py` declares `POST /{project_id}/extraction-export/status/{job_id}/cancel` 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-8fc249926c253404", "name": "Unused endpoint: DELETE /{project_id}/extraction-export/status/{job_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{project_id}/extraction-export/status/{job_id}"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/extraction_export.py` declares `DELETE /{project_id}/extraction-export/status/{job_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-bad01ac2222e29f1", "name": "Unused endpoint: GET /{run_id}", "shortDescription": {"text": "Unused endpoint: GET /{run_id}"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/extraction_runs.py` declares `GET /{run_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-d693d50a6e36918f", "name": "Unused endpoint: GET /{run_id}/view", "shortDescription": {"text": "Unused endpoint: GET /{run_id}/view"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/extraction_runs.py` declares `GET /{run_id}/view` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-53e356f7b305babb", "name": "Unused endpoint: POST /{run_id}/proposals", "shortDescription": {"text": "Unused endpoint: POST /{run_id}/proposals"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/extraction_runs.py` declares `POST /{run_id}/proposals` 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-77d006ab69ade80c", "name": "Unused endpoint: POST /{run_id}/decisions", "shortDescription": {"text": "Unused endpoint: POST /{run_id}/decisions"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/extraction_runs.py` declares `POST /{run_id}/decisions` 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-c8cb130a7d31cb99", "name": "Unused endpoint: POST /{run_id}/consensus", "shortDescription": {"text": "Unused endpoint: POST /{run_id}/consensus"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/extraction_runs.py` declares `POST /{run_id}/consensus` 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-28ce9bc580dde7de", "name": "Unused endpoint: POST /{run_id}/advance", "shortDescription": {"text": "Unused endpoint: POST /{run_id}/advance"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/extraction_runs.py` declares `POST /{run_id}/advance` 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-e4e0461553079261", "name": "Unused endpoint: GET /{run_id}/reviewers", "shortDescription": {"text": "Unused endpoint: GET /{run_id}/reviewers"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/extraction_runs.py` declares `GET /{run_id}/reviewers` 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-b2b1ff1e02e7fcd2", "name": "Unused endpoint: POST /{run_id}/reopen", "shortDescription": {"text": "Unused endpoint: POST /{run_id}/reopen"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/extraction_runs.py` declares `POST /{run_id}/reopen` 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-e260dd758fa06018", "name": "Unused endpoint: POST /extraction/models/manual", "shortDescription": {"text": "Unused endpoint: POST /extraction/models/manual"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/model_extraction.py` declares `POST /extraction/models/manual` 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-06957c196dd7d907", "name": "Unused endpoint: POST /extraction/models", "shortDescription": {"text": "Unused endpoint: POST /extraction/models"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/model_extraction.py` declares `POST /extraction/models` 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-6880fece47cc87de", "name": "Unused endpoint: GET /{article_file_id}/text-blocks", "shortDescription": {"text": "Unused endpoint: GET /{article_file_id}/text-blocks"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/article_text_blocks.py` declares `GET /{article_file_id}/text-blocks` 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-c718beb53b365b0c", "name": "Unused endpoint: POST /{project_id}/templates/clone", "shortDescription": {"text": "Unused endpoint: POST /{project_id}/templates/clone"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/project_templates.py` declares `POST /{project_id}/templates/clone` 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-81f10542ba365c41", "name": "Unused endpoint: PATCH /{project_id}/templates/{template_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{project_id}/templates/{template_id}"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/project_templates.py` declares `PATCH /{project_id}/templates/{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-bd7edcd64ccd7699", "name": "Unused endpoint: GET /projects/{project_id}/hitl-config", "shortDescription": {"text": "Unused endpoint: GET /projects/{project_id}/hitl-config"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/hitl_configs.py` declares `GET /projects/{project_id}/hitl-config` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f5a74f19aee43fae", "name": "Unused endpoint: PUT /projects/{project_id}/hitl-config", "shortDescription": {"text": "Unused endpoint: PUT /projects/{project_id}/hitl-config"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/hitl_configs.py` declares `PUT /projects/{project_id}/hitl-config` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ce55c77e726fcf10", "name": "Unused endpoint: DELETE /projects/{project_id}/hitl-config", "shortDescription": {"text": "Unused endpoint: DELETE /projects/{project_id}/hitl-config"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/hitl_configs.py` declares `DELETE /projects/{project_id}/hitl-config` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-db6b0c15a15c7def", "name": "Unused endpoint: GET /projects/{project_id}/templates/{project_template_id}/hitl-config", "shortDescription": {"text": "Unused endpoint: GET /projects/{project_id}/templates/{project_template_id}/hitl-config"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/hitl_configs.py` declares `GET /projects/{project_id}/templates/{project_template_id}/hitl-config` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1d9ab17d00523153", "name": "Unused endpoint: PUT /projects/{project_id}/templates/{project_template_id}/hitl-config", "shortDescription": {"text": "Unused endpoint: PUT /projects/{project_id}/templates/{project_template_id}/hitl-config"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/hitl_configs.py` declares `PUT /projects/{project_id}/templates/{project_template_id}/hitl-config` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-287d10dbb4925a93", "name": "Unused endpoint: DELETE /projects/{project_id}/templates/{project_template_id}/hitl-config", "shortDescription": {"text": "Unused endpoint: DELETE /projects/{project_id}/templates/{project_template_id}/hitl-config"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/hitl_configs.py` declares `DELETE /projects/{project_id}/templates/{project_template_id}/hitl-config` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-02062ae42a8de61d", "name": "Unused endpoint: POST /articles-export", "shortDescription": {"text": "Unused endpoint: POST /articles-export"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/articles_export.py` declares `POST /articles-export` 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-a7ff0a73f07973a8", "name": "Unused endpoint: GET /articles-export/status/{job_id}", "shortDescription": {"text": "Unused endpoint: GET /articles-export/status/{job_id}"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/articles_export.py` declares `GET /articles-export/status/{job_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-7939e0723b5e6054", "name": "Unused endpoint: POST /articles-export/status/{job_id}/cancel", "shortDescription": {"text": "Unused endpoint: POST /articles-export/status/{job_id}/cancel"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/articles_export.py` declares `POST /articles-export/status/{job_id}/cancel` 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-310b80abe03c0098", "name": "Unused endpoint: DELETE /articles-export/status/{job_id}", "shortDescription": {"text": "Unused endpoint: DELETE /articles-export/status/{job_id}"}, "fullDescription": {"text": "`backend/app/api/v1/endpoints/articles_export.py` declares `DELETE /articles-export/status/{job_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/17834"}, "properties": {"repository": "raphaelfh/prumo", "repoUrl": "https://github.com/raphaelfh/prumo", "branch": "main"}, "results": [{"ruleId": "scanner-be7e487b096d3563", "level": "note", "message": {"text": "Possibly dead Python function: load_dialect_impl"}, "properties": {"repobilityId": "9d417a770df5be39", "scanner": "scanner-primary", "fingerprint": "be7e487b096d3563", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/models/base.py:115"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a8f956f7d73d04e6", "level": "note", "message": {"text": "Possibly dead Python function: require_project_scope"}, "properties": {"repobilityId": "9ce54201743fd561", "scanner": "scanner-primary", "fingerprint": "a8f956f7d73d04e6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/deps/security.py:46"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d3f8f94d53229fdc", "level": "note", "message": {"text": "Possibly dead Python function: require_project_manager"}, "properties": {"repobilityId": "bd0f1bc8eccb6aca", "scanner": "scanner-primary", "fingerprint": "d3f8f94d53229fdc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/deps/security.py:73"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-45d333e248a89cd9", "level": "note", "message": {"text": "Possibly dead Python function: to_dict"}, "properties": {"repobilityId": "017f31ed997ca27d", "scanner": "scanner-primary", "fingerprint": "45d333e248a89cd9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/services/model_extraction_service.py:552"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2dc736f1c3bf6e33", "level": "note", "message": {"text": "Possibly dead Python function: create_from_dict"}, "properties": {"repobilityId": "b9e43943ab75c3bd", "scanner": "scanner-primary", "fingerprint": "2dc736f1c3bf6e33", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/repositories/base.py:171"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e32ff162cd584159", "level": "note", "message": {"text": "Possibly dead Python function: delete_by_id"}, "properties": {"repobilityId": "bbc7be601e45d153", "scanner": "scanner-primary", "fingerprint": "e32ff162cd584159", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/repositories/base.py:251"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6e07b74505afd4e7", "level": "note", "message": {"text": "Possibly dead Python function: list_by_reviewer_item"}, "properties": {"repobilityId": "f38e42e31a9ddc76", "scanner": "scanner-primary", "fingerprint": "6e07b74505afd4e7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/repositories/extraction_reviewer_decision_repository.py:32"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ac790b3fa022e554", "level": "note", "message": {"text": "Possibly dead Python function: invalidate"}, "properties": {"repobilityId": "528be77e1d75b539", "scanner": "scanner-primary", "fingerprint": "ac790b3fa022e554", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/core/security.py:99"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2bacbb4e5bb97038", "level": "note", "message": {"text": "Possibly dead Python function: list_files"}, "properties": {"repobilityId": "91ca1a1efd8eab71", "scanner": "scanner-primary", "fingerprint": "2bacbb4e5bb97038", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/infrastructure/storage/supabase_storage.py:215"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b7f3e79b3cad0369", "level": "note", "message": {"text": "Possibly dead Python function: to_dict"}, "properties": {"repobilityId": "017f31ed997ca27d", "scanner": "scanner-primary", "fingerprint": "b7f3e79b3cad0369", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/domain/events/base.py:40"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5b0066867efad7eb", "level": "note", "message": {"text": "Possibly dead Python function: decorator"}, "properties": {"repobilityId": "ffbcbc9bc189af1c", "scanner": "scanner-primary", "fingerprint": "5b0066867efad7eb", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/domain/events/base.py:101"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5145656e490c0b1c", "level": "note", "message": {"text": "Possibly dead Python function: register"}, "properties": {"repobilityId": "3dcfff96740bd31f", "scanner": "scanner-primary", "fingerprint": "5145656e490c0b1c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/domain/events/base.py:119"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-74973541457cb30c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/layout/SidebarHeader.tsx:70"}, "properties": {"repobilityId": "aac1af004b839ca2", "scanner": "scanner-primary", "fingerprint": "74973541457cb30c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3d6d55f79bce6e4e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/layout/MobileSidebar.tsx:38"}, "properties": {"repobilityId": "f96d51ddb9c018f6", "scanner": "scanner-primary", "fingerprint": "3d6d55f79bce6e4e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-804a09b0ecda3671", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/layout/UserMenu.tsx:54"}, "properties": {"repobilityId": "c119d93506279f70", "scanner": "scanner-primary", "fingerprint": "804a09b0ecda3671", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e5ef6f989e9d9331", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/layout/SidebarNavItem.tsx:33"}, "properties": {"repobilityId": "1da20ce31b6e9c3c", "scanner": "scanner-primary", "fingerprint": "e5ef6f989e9d9331", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c1341c7607bd33b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/navigation/NotificationCenter.tsx:352"}, "properties": {"repobilityId": "55f540b036a12f0b", "scanner": "scanner-primary", "fingerprint": "1c1341c7607bd33b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2e192672677685dc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/navigation/Topbar.tsx:124"}, "properties": {"repobilityId": "ab56321441f82748", "scanner": "scanner-primary", "fingerprint": "2e192672677685dc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4804f03abe81f6d0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/shared/list/FilterCategoricalField.tsx:94"}, "properties": {"repobilityId": "926267336d6aaea3", "scanner": "scanner-primary", "fingerprint": "4804f03abe81f6d0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-80aaba892fce5933", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/shared/list/ListRowCard.tsx:37"}, "properties": {"repobilityId": "abe7463ffd575bdd", "scanner": "scanner-primary", "fingerprint": "80aaba892fce5933", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c57a148160efd409", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/shared/list/ActiveFilterChips.tsx:30"}, "properties": {"repobilityId": "f0aacd48d871ad6e", "scanner": "scanner-primary", "fingerprint": "c57a148160efd409", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7604269e3eb31a55", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/shared/list/FilterFacetMultiSelectField.tsx:91"}, "properties": {"repobilityId": "a84e9093ab389b6e", "scanner": "scanner-primary", "fingerprint": "7604269e3eb31a55", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84ca320c13a86f61", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/shared/comparison/ConsensusIndicator.tsx:49"}, "properties": {"repobilityId": "0c583e2bf142dfdd", "scanner": "scanner-primary", "fingerprint": "84ca320c13a86f61", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-50dee0fb847a78a1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ui/file-drop-zone.tsx:398"}, "properties": {"repobilityId": "59591b31d8fad462", "scanner": "scanner-primary", "fingerprint": "50dee0fb847a78a1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-db031fc362f36f50", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/ui/MultiSelectWithOther.tsx:119"}, "properties": {"repobilityId": "ece11eaa422d7809", "scanner": "scanner-primary", "fingerprint": "db031fc362f36f50", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-56daed8cf52fcbd7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/patterns/PageHeader.tsx:36"}, "properties": {"repobilityId": "1e690019855315d4", "scanner": "scanner-primary", "fingerprint": "56daed8cf52fcbd7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-529f22983e456831", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/user/ApiKeysSection.tsx:385"}, "properties": {"repobilityId": "f74fa1e5931b23c9", "scanner": "scanner-primary", "fingerprint": "529f22983e456831", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-42b9696918668fcf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/articles/ArticlesList.tsx:923"}, "properties": {"repobilityId": "553fc55106af6bc1", "scanner": "scanner-primary", "fingerprint": "42b9696918668fcf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b0f64c4f87aaed24", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/articles/ZoteroImportDialog.tsx:274"}, "properties": {"repobilityId": "c74d871eab63d9a6", "scanner": "scanner-primary", "fingerprint": "b0f64c4f87aaed24", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-499bc1ae543352a0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/articles/ArticleDetailDialog.tsx:324"}, "properties": {"repobilityId": "f1bc9462bd3fbe29", "scanner": "scanner-primary", "fingerprint": "499bc1ae543352a0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4acc091b780c051", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/articles/ArticleFileUploadDialogNew.tsx:463"}, "properties": {"repobilityId": "2352701251f589dc", "scanner": "scanner-primary", "fingerprint": "f4acc091b780c051", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1200adb53c5c2c52", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/articles/ArticleForm.tsx:1168"}, "properties": {"repobilityId": "72a309dcb8f8f8f7", "scanner": "scanner-primary", "fingerprint": "1200adb53c5c2c52", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-25e5a17e64819baf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/articles/ArticleKeywordsField.tsx:62"}, "properties": {"repobilityId": "a0d41dc7b2e7c586", "scanner": "scanner-primary", "fingerprint": "25e5a17e64819baf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5c9b65c0dfd3db37", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/extraction/ArticleExtractionTable.tsx:1007"}, "properties": {"repobilityId": "a4d7562d29ba4842", "scanner": "scanner-primary", "fingerprint": "5c9b65c0dfd3db37", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f5cd5fb14bef0d51", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/extraction/ai/AISuggestionHistoryPopover.tsx:152"}, "properties": {"repobilityId": "c4652fc7c4507cf2", "scanner": "scanner-primary", "fingerprint": "f5cd5fb14bef0d51", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-34f1538e8ae0ef9b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/extraction/hierarchy/ModelSelector.tsx:264"}, "properties": {"repobilityId": "528630d8586e174d", "scanner": "scanner-primary", "fingerprint": "34f1538e8ae0ef9b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0e46b05567e7ea52", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/components/extraction/comparison/ModelLevelComparison.tsx:99"}, "properties": {"repobilityId": "a990a5ba12272a32", "scanner": "scanner-primary", "fingerprint": "0e46b05567e7ea52", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-df029dff291f65a8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/project/settings/TemplateConsensusOverride.tsx:133"}, "properties": {"repobilityId": "546e6cb5db8fa9cf", "scanner": "scanner-primary", "fingerprint": "df029dff291f65a8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4326e78269a9682", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/components/project/settings/TeamMembersSection.tsx:221"}, "properties": {"repobilityId": "591a110de3cbb408", "scanner": "scanner-primary", "fingerprint": "d4326e78269a9682", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c1259f5266d98f59", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/lib/logger.ts:33"}, "properties": {"repobilityId": "c03c2bebbd2b1497", "scanner": "scanner-primary", "fingerprint": "c1259f5266d98f59", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-052470a798335daf", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/lib/extraction/observability.ts:225"}, "properties": {"repobilityId": "fc25739d05d5fe00", "scanner": "scanner-primary", "fingerprint": "052470a798335daf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-eb20b06887f992f6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/pages/Dashboard.tsx:171"}, "properties": {"repobilityId": "2a124b9f9263c71b", "scanner": "scanner-primary", "fingerprint": "eb20b06887f992f6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce0dc93ba8ebd034", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/pages/QualityAssessmentFullScreen.tsx:447"}, "properties": {"repobilityId": "1e97bae491f9717e", "scanner": "scanner-primary", "fingerprint": "ce0dc93ba8ebd034", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6eb4413b135a276b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/pages/ProjectView.tsx:289"}, "properties": {"repobilityId": "666806f1551d5d54", "scanner": "scanner-primary", "fingerprint": "6eb4413b135a276b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ff6d4f91e07d7be3", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-bookworm"}, "properties": {"repobilityId": "b38d60e5707f0030", "scanner": "scanner-primary", "fingerprint": "ff6d4f91e07d7be3", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".devcontainer/Dockerfile"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-42222223b4a3450e", "level": "error", "message": {"text": "Dockerfile pipes a remote installer into a shell"}, "properties": {"repobilityId": "d1fff86119a5dc17", "scanner": "scanner-primary", "fingerprint": "42222223b4a3450e", "layer": "hardware", "severity": "high", "confidence": 1.0, "tags": ["supply-chain", "docker", "remote-installer"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".devcontainer/Dockerfile"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-714c31ca9f474ae6", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "95b3179358c89fad", "scanner": "scanner-primary", "fingerprint": "714c31ca9f474ae6", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-714c31ca9f474ae6", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "7198257b73148af7", "scanner": "scanner-primary", "fingerprint": "714c31ca9f474ae6", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/Dockerfile"}, "region": {"startLine": 19}}}]}, {"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-dc90a0615102f09f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/pdf-viewer/engines/mock/index.ts:114"}, "properties": {"repobilityId": "5c33af0347f95f61", "scanner": "scanner-primary", "fingerprint": "dc90a0615102f09f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/pdf-viewer/engines/mock/index.ts"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-876f447454ae3685", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/pdf-viewer/engines/pdfjs/page.ts:92"}, "properties": {"repobilityId": "a2eb0f714a74ff6c", "scanner": "scanner-primary", "fingerprint": "876f447454ae3685", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/pdf-viewer/engines/pdfjs/page.ts"}, "region": {"startLine": 92}}}]}, {"ruleId": "scanner-46553c9cc2f9375d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/pdf-viewer/primitives/TextLayer.tsx:41"}, "properties": {"repobilityId": "6a9f61582172f588", "scanner": "scanner-primary", "fingerprint": "46553c9cc2f9375d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/pdf-viewer/primitives/TextLayer.tsx"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-5a06d275ce20d9f9", "level": "error", "message": {"text": "Possible secret in frontend/lib/copy/auth.ts"}, "properties": {"repobilityId": "62766bb78df4bd4e", "scanner": "scanner-primary", "fingerprint": "5a06d275ce20d9f9", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/lib/copy/auth.ts"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-5a06d275ce20d9f9", "level": "error", "message": {"text": "Possible secret in frontend/lib/copy/auth.ts"}, "properties": {"repobilityId": "62766bb78df4bd4e", "scanner": "scanner-primary", "fingerprint": "5a06d275ce20d9f9", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/lib/copy/auth.ts"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-5a06d275ce20d9f9", "level": "error", "message": {"text": "Possible secret in frontend/lib/copy/auth.ts"}, "properties": {"repobilityId": "62766bb78df4bd4e", "scanner": "scanner-primary", "fingerprint": "5a06d275ce20d9f9", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/lib/copy/auth.ts"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-5a06d275ce20d9f9", "level": "error", "message": {"text": "Possible secret in frontend/lib/copy/auth.ts"}, "properties": {"repobilityId": "62766bb78df4bd4e", "scanner": "scanner-primary", "fingerprint": "5a06d275ce20d9f9", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/lib/copy/auth.ts"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-1063a2aaf3acf244", "level": "error", "message": {"text": "Possible secret in frontend/lib/copy/user.ts"}, "properties": {"repobilityId": "45d6e30001b3c5ef", "scanner": "scanner-primary", "fingerprint": "1063a2aaf3acf244", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/lib/copy/user.ts"}, "region": {"startLine": 54}}}]}, {"ruleId": "scanner-1063a2aaf3acf244", "level": "error", "message": {"text": "Possible secret in frontend/lib/copy/user.ts"}, "properties": {"repobilityId": "45d6e30001b3c5ef", "scanner": "scanner-primary", "fingerprint": "1063a2aaf3acf244", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/lib/copy/user.ts"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-1063a2aaf3acf244", "level": "error", "message": {"text": "Possible secret in frontend/lib/copy/user.ts"}, "properties": {"repobilityId": "45d6e30001b3c5ef", "scanner": "scanner-primary", "fingerprint": "1063a2aaf3acf244", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/lib/copy/user.ts"}, "region": {"startLine": 61}}}]}, {"ruleId": "scanner-cc83fce1429c979f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/hooks/useKeyboardShortcuts.test.ts:27"}, "properties": {"repobilityId": "1b19699a8e4e4748", "scanner": "scanner-primary", "fingerprint": "cc83fce1429c979f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/hooks/useKeyboardShortcuts.test.ts"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-f38bdc787464382f", "level": "error", "message": {"text": "Possible secret in frontend/e2e/flows/settings-api-keys.e2e.ts"}, "properties": {"repobilityId": "d625643dae2c610f", "scanner": "scanner-primary", "fingerprint": "f38bdc787464382f", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/e2e/flows/settings-api-keys.e2e.ts"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-b2a5831600e39e67", "level": "error", "message": {"text": "Possible secret in frontend/e2e/_fixtures/fixture-ids.ts"}, "properties": {"repobilityId": "1127219f548acaf3", "scanner": "scanner-primary", "fingerprint": "b2a5831600e39e67", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/e2e/_fixtures/fixture-ids.ts"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-74de4aca2ae97224", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d6c869a77568b799", "scanner": "scanner-primary", "fingerprint": "74de4aca2ae97224", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/worker-smoke.yml"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1b0add4759a308ec", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ef7e6ef84bc585df", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1b0add4759a308ec", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "90dca2b9a9fbfb28", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 87}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1b0add4759a308ec", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 139}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ef7e6ef84bc585df", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 144}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4effa0820a061a14", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 317}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1b0add4759a308ec", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 361}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ef7e6ef84bc585df", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 366}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "34724acf4d6dbe60", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 436}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9efbe00d4aa88280", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 439}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4a63b1fd6887cae9", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 456}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4a63b1fd6887cae9", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 492}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4a63b1fd6887cae9", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 559}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a22664b58dca3181", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 696}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "90dca2b9a9fbfb28", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 721}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4a63b1fd6887cae9", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 741}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "90dca2b9a9fbfb28", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 769}}}]}, {"ruleId": "scanner-dd90d5c5852699d5", "level": "note", "message": {"text": "Very large file: frontend/integrations/supabase/types.ts (2423 lines)"}, "properties": {"repobilityId": "9fc3d87eeb678c51", "scanner": "scanner-primary", "fingerprint": "dd90d5c5852699d5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-385319d414c7de68", "level": "note", "message": {"text": "Very large file: frontend/types/api/schema.d.ts (4114 lines)"}, "properties": {"repobilityId": "ef5e6cce5a2c562c", "scanner": "scanner-primary", "fingerprint": "385319d414c7de68", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-90d210025dc7c288", "level": "note", "message": {"text": "Very large file: frontend/components/articles/ArticlesList.tsx (1364 lines)"}, "properties": {"repobilityId": "51ef85a540ebee49", "scanner": "scanner-primary", "fingerprint": "90d210025dc7c288", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1c2c19af4e61e28e", "level": "note", "message": {"text": "Very large file: frontend/components/articles/ArticleForm.tsx (1272 lines)"}, "properties": {"repobilityId": "96eb1042f5ff272e", "scanner": "scanner-primary", "fingerprint": "1c2c19af4e61e28e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1ade62e85da50a33", "level": "note", "message": {"text": "Very large file: frontend/components/extraction/ArticleExtractionTable.tsx (1198 lines)"}, "properties": {"repobilityId": "ee06c6748b6fb6f2", "scanner": "scanner-primary", "fingerprint": "1ade62e85da50a33", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-18b993e5840752d3", "level": "note", "message": {"text": "Very large file: backend/tests/unit/test_extraction_export_service.py (2193 lines)"}, "properties": {"repobilityId": "aaadae8a1bad8bc3", "scanner": "scanner-primary", "fingerprint": "18b993e5840752d3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9e8f0c4cdc6087a9", "level": "note", "message": {"text": "Very large file: backend/tests/unit/test_section_extraction_service.py (1818 lines)"}, "properties": {"repobilityId": "9a36965ba092f47d", "scanner": "scanner-primary", "fingerprint": "9e8f0c4cdc6087a9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d687666cab62a809", "level": "note", "message": {"text": "Very large file: backend/app/seed.py (1941 lines)"}, "properties": {"repobilityId": "027f5db745c9b222", "scanner": "scanner-primary", "fingerprint": "d687666cab62a809", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-05875d06300b0f13", "level": "note", "message": {"text": "Very large file: backend/app/services/extraction_export_service.py (1521 lines)"}, "properties": {"repobilityId": "5ba4b25bcb597702", "scanner": "scanner-primary", "fingerprint": "05875d06300b0f13", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-86534aa2e90c3744", "level": "note", "message": {"text": "Very large file: backend/alembic/versions/archive/0001_initial_public_schema.py (2783 lines)"}, "properties": {"repobilityId": "6e191df21881dd74", "scanner": "scanner-primary", "fingerprint": "86534aa2e90c3744", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "8ad08c83ff51a6f0", "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": "b5020c5b53f78e40", "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": "03eaa0262aa1c3fb", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "cd367594acec262f", "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": "6b45e38320086d31", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f81e7c86cac60cb1", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/architectural-quality-loop/references/concept-glossary.md"}, "properties": {"repobilityId": "45f9c63350ece3bd", "scanner": "scanner-primary", "fingerprint": "f81e7c86cac60cb1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/architectural-quality-loop/references/concept-glossary.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5c9aa21d27d3e2f5", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/architectural-quality-loop/references/budget-policy.md"}, "properties": {"repobilityId": "6278b3660f3fdc94", "scanner": "scanner-primary", "fingerprint": "5c9aa21d27d3e2f5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/architectural-quality-loop/references/budget-policy.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b46873b7b3aa2027", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/code-review/references/automated-pr-review.md"}, "properties": {"repobilityId": "a87972ca5ba606e2", "scanner": "scanner-primary", "fingerprint": "b46873b7b3aa2027", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/code-review/references/automated-pr-review.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c16d27ca347b7872", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/ui-styling/references/tailwind-v4.md"}, "properties": {"repobilityId": "52e87896569ead24", "scanner": "scanner-primary", "fingerprint": "c16d27ca347b7872", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/ui-styling/references/tailwind-v4.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bef304d0894de7f8", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/backend-development/references/structlog.md"}, "properties": {"repobilityId": "c84ee6c6bca28529", "scanner": "scanner-primary", "fingerprint": "bef304d0894de7f8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/backend-development/references/structlog.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e221bd8f8e52c5be", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/backend-development/references/sqlalchemy.md"}, "properties": {"repobilityId": "69a215f4dc19ae74", "scanner": "scanner-primary", "fingerprint": "e221bd8f8e52c5be", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/backend-development/references/sqlalchemy.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6b458e41efbf50ca", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/backend-development/references/pydantic.md"}, "properties": {"repobilityId": "9c6b7c233de672bf", "scanner": "scanner-primary", "fingerprint": "6b458e41efbf50ca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/backend-development/references/pydantic.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c4aedfe4692d0a7c", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/frontend-ux/SKILL.md"}, "properties": {"repobilityId": "7248722fbff1d287", "scanner": "scanner-primary", "fingerprint": "c4aedfe4692d0a7c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/frontend-ux/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-a1f81e236e08c51f", "level": "none", "message": {"text": "Commented-code block (5 lines) in playwright.config.ts:96"}, "properties": {"repobilityId": "2c49a5609de367d7", "scanner": "scanner-primary", "fingerprint": "a1f81e236e08c51f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aea6e62dc162bdfc", "level": "none", "message": {"text": "Commented-code block (5 lines) in vitest.config.ts:8"}, "properties": {"repobilityId": "5fa11dc8b0ee5f9a", "scanner": "scanner-primary", "fingerprint": "aea6e62dc162bdfc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9d70362ac06ada9d", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/integrations/api/client.ts:135"}, "properties": {"repobilityId": "ad5362417476f925", "scanner": "scanner-primary", "fingerprint": "9d70362ac06ada9d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-69205504e0fcbfa8", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/pdf-viewer/PrumoPdfViewer.tsx:46"}, "properties": {"repobilityId": "f085a6c44a38ec02", "scanner": "scanner-primary", "fingerprint": "69205504e0fcbfa8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a6e861907f3a36ec", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/pdf-viewer/primitives/Viewer.tsx:50"}, "properties": {"repobilityId": "cc26c8209cca5188", "scanner": "scanner-primary", "fingerprint": "a6e861907f3a36ec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-817825fbd494a257", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/test/rls-section-field.test.ts:77"}, "properties": {"repobilityId": "2992a2c066417c73", "scanner": "scanner-primary", "fingerprint": "817825fbd494a257", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0d107b285bce0cc5", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/test/hooks/useAutoSaveProposals.test.tsx:188"}, "properties": {"repobilityId": "00e05fd4d98e9b81", "scanner": "scanner-primary", "fingerprint": "0d107b285bce0cc5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a06a457a7210ed27", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/test/hooks/useExtractionSession.test.tsx:191"}, "properties": {"repobilityId": "ccca29b25d328619", "scanner": "scanner-primary", "fingerprint": "a06a457a7210ed27", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e99e1169d627beed", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/test/hooks/useExtractedValues.test.tsx:126"}, "properties": {"repobilityId": "770d0695c30002af", "scanner": "scanner-primary", "fingerprint": "e99e1169d627beed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fd6344675e36e4f5", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/test/hooks/useModelManagement.test.tsx:81"}, "properties": {"repobilityId": "4e0692e78dfb6e68", "scanner": "scanner-primary", "fingerprint": "fd6344675e36e4f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-07d1ca10d0086ed9", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/components/ui/resizable-panel.tsx:117"}, "properties": {"repobilityId": "5b55cede8630dbc3", "scanner": "scanner-primary", "fingerprint": "07d1ca10d0086ed9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0836f0deb0c52a5c", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/components/runs/ReviewerAvatarStack.tsx:40"}, "properties": {"repobilityId": "10625e0817428e93", "scanner": "scanner-primary", "fingerprint": "0836f0deb0c52a5c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-215d9e700a3ba6cd", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/components/extraction/ArticleExtractionTable.tsx:289"}, "properties": {"repobilityId": "0a397e252ae3ef0c", "scanner": "scanner-primary", "fingerprint": "215d9e700a3ba6cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dfcaa5fbb64c3ad1", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/components/extraction/FieldInput.tsx:368"}, "properties": {"repobilityId": "f3cd0b0fffb995b5", "scanner": "scanner-primary", "fingerprint": "dfcaa5fbb64c3ad1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-084109182e78d2c1", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/lib/utils.ts:4"}, "properties": {"repobilityId": "faa2598de4464e80", "scanner": "scanner-primary", "fingerprint": "084109182e78d2c1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe238ec1b0c37fb5", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/lib/extraction/observability.ts:225"}, "properties": {"repobilityId": "d2c405f254983b82", "scanner": "scanner-primary", "fingerprint": "fe238ec1b0c37fb5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d1579eed95401006", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/pages/Auth.tsx:336"}, "properties": {"repobilityId": "a81a6caabc7a11c4", "scanner": "scanner-primary", "fingerprint": "d1579eed95401006", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1d3c401a151e7546", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/pages/QualityAssessmentFullScreen.tsx:73"}, "properties": {"repobilityId": "a173d66785299eed", "scanner": "scanner-primary", "fingerprint": "1d3c401a151e7546", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-37c3b45acc44920d", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/pages/ExtractionFullScreen.tsx:137"}, "properties": {"repobilityId": "507a83a642e35300", "scanner": "scanner-primary", "fingerprint": "37c3b45acc44920d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-17c35f3ace377e38", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/hooks/qa/useQAAssessmentSession.ts:53"}, "properties": {"repobilityId": "93b448d32101a946", "scanner": "scanner-primary", "fingerprint": "17c35f3ace377e38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f277ad30712949f6", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/hooks/runs/useAutoSaveProposals.ts:124"}, "properties": {"repobilityId": "0e9c02e046e0114f", "scanner": "scanner-primary", "fingerprint": "f277ad30712949f6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7040fa2f59e7feb2", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/hooks/extraction/useFullAIExtraction.ts:152"}, "properties": {"repobilityId": "a414fef145445248", "scanner": "scanner-primary", "fingerprint": "7040fa2f59e7feb2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ac021c5c34b23918", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/hooks/extraction/useExtractionSession.ts:22"}, "properties": {"repobilityId": "e54b317bef32a1c4", "scanner": "scanner-primary", "fingerprint": "ac021c5c34b23918", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-db1c0f1d568c28ca", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/hooks/extraction/useExtractionData.ts:122"}, "properties": {"repobilityId": "b6f24aa80e702514", "scanner": "scanner-primary", "fingerprint": "db1c0f1d568c28ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b14b5ae5de5ce7c2", "level": "none", "message": {"text": "Commented-code block (10 lines) in frontend/hooks/extraction/useExtractedValues.ts:101"}, "properties": {"repobilityId": "b6823ee21c44262b", "scanner": "scanner-primary", "fingerprint": "b14b5ae5de5ce7c2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2face56c081089a8", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/hooks/extraction/ai/useAISuggestions.ts:51"}, "properties": {"repobilityId": "b25cbcb541c83833", "scanner": "scanner-primary", "fingerprint": "2face56c081089a8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c42fbbdbacf98142", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/hooks/extraction/helpers/queryEntityTypes.ts:76"}, "properties": {"repobilityId": "fcc5b9ad5efa1e93", "scanner": "scanner-primary", "fingerprint": "c42fbbdbacf98142", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8f8920239393950a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/services/extractionExportService.ts:55"}, "properties": {"repobilityId": "4ae7d1465d0de0a9", "scanner": "scanner-primary", "fingerprint": "8f8920239393950a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3a4dcd2ed6fdb98f", "level": "none", "message": {"text": "Commented-code block (11 lines) in frontend/services/extractionValueService.ts:216"}, "properties": {"repobilityId": "85c01d69bb69ac60", "scanner": "scanner-primary", "fingerprint": "3a4dcd2ed6fdb98f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-14921d4e9dc9c27e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/services/apiKeysService.ts:66"}, "properties": {"repobilityId": "bfffb4a16925df30", "scanner": "scanner-primary", "fingerprint": "14921d4e9dc9c27e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bc4ee06a71f50411", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/services/aiSuggestionService.ts:148"}, "properties": {"repobilityId": "8d661a6454f368ce", "scanner": "scanner-primary", "fingerprint": "bc4ee06a71f50411", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9d3af32976104699", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/services/extractionInstanceService.ts:497"}, "properties": {"repobilityId": "11fc0025c51aeecc", "scanner": "scanner-primary", "fingerprint": "9d3af32976104699", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e8d2e9c51a44c19f", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/services/errorTracking.ts:226"}, "properties": {"repobilityId": "eb7f62413f397bd1", "scanner": "scanner-primary", "fingerprint": "e8d2e9c51a44c19f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f745011999bcace0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/services/errorTracking.ts:243"}, "properties": {"repobilityId": "d1eafaccae5f8a12", "scanner": "scanner-primary", "fingerprint": "f745011999bcace0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7e0b8ca3ccae1c5c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/services/articlesExportService.ts:58"}, "properties": {"repobilityId": "cd4f9faf32631ec5", "scanner": "scanner-primary", "fingerprint": "7e0b8ca3ccae1c5c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3418bfd623c9b38a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/extraction-observability.e2e.ts:37"}, "properties": {"repobilityId": "3e3d9b3b01625a09", "scanner": "scanner-primary", "fingerprint": "3418bfd623c9b38a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b80c01296eafc369", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/e2e/flows/hitl-run-lifecycle.api.e2e.ts:66"}, "properties": {"repobilityId": "244b1e4bb1f507b9", "scanner": "scanner-primary", "fingerprint": "b80c01296eafc369", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aed061a7d90bdb7a", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/e2e/flows/extraction-reopen.ui.e2e.ts:52"}, "properties": {"repobilityId": "c0e42fbcd4d7bfde", "scanner": "scanner-primary", "fingerprint": "aed061a7d90bdb7a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-21b3b44fece25a38", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/e2e/flows/extraction-value-coherence.ui.e2e.ts:51"}, "properties": {"repobilityId": "be3b17ecc7cf2d8e", "scanner": "scanner-primary", "fingerprint": "21b3b44fece25a38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9707eac0657118f1", "level": "none", "message": {"text": "Commented-code block (10 lines) in frontend/e2e/flows/extraction-refresh.ui.e2e.ts:110"}, "properties": {"repobilityId": "f1f98e5b61853a77", "scanner": "scanner-primary", "fingerprint": "9707eac0657118f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8be55f44e59fdd51", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/e2e/remote/smoke-remote.e2e.ts:41"}, "properties": {"repobilityId": "42b7fc34a784a103", "scanner": "scanner-primary", "fingerprint": "8be55f44e59fdd51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-627bdb4fac5dc8ef", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/_fixtures/api.ts:38"}, "properties": {"repobilityId": "dfd5792ed63681fa", "scanner": "scanner-primary", "fingerprint": "627bdb4fac5dc8ef", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-961ead9abc81a349", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/_fixtures/global-teardown.ts:19"}, "properties": {"repobilityId": "aba2cd1c6656b3c2", "scanner": "scanner-primary", "fingerprint": "961ead9abc81a349", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-95f1f8d7cc02a55e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/_fixtures/storage.ts:4"}, "properties": {"repobilityId": "efb0d6fccd7d5fc2", "scanner": "scanner-primary", "fingerprint": "95f1f8d7cc02a55e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e51f99a5f1715374", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/_fixtures/ensure-fixtures.ts:16"}, "properties": {"repobilityId": "ffd85d94cae8725a", "scanner": "scanner-primary", "fingerprint": "e51f99a5f1715374", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-81812f509b96b6f4", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/e2e/_fixtures/hitl.ts:111"}, "properties": {"repobilityId": "8bbca34adcb11f68", "scanner": "scanner-primary", "fingerprint": "81812f509b96b6f4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b64cbcdd7f2cf866", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/_fixtures/supabase-admin.ts:29"}, "properties": {"repobilityId": "71191ffdac1dd3e3", "scanner": "scanner-primary", "fingerprint": "b64cbcdd7f2cf866", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-26cb1a692dba5280", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/e2e/_fixtures/global-setup.ts:130"}, "properties": {"repobilityId": "6db4d6447f95337a", "scanner": "scanner-primary", "fingerprint": "26cb1a692dba5280", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5823c0a17089444f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/e2e/_fixtures/global-setup.ts:151"}, "properties": {"repobilityId": "d9574e164baf2120", "scanner": "scanner-primary", "fingerprint": "5823c0a17089444f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9d3c120b58c6486e", "level": "none", "message": {"text": "Commented-code block (8 lines) in scripts/enumerate_compiler_bailouts.mjs:1"}, "properties": {"repobilityId": "089ea45275c6d601", "scanner": "scanner-primary", "fingerprint": "9d3c120b58c6486e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-33143801b7779b6b", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/check_compiler_coverage.mjs:1"}, "properties": {"repobilityId": "f6f32ec1ebb8caa1", "scanner": "scanner-primary", "fingerprint": "33143801b7779b6b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-99ca5403543d3b3a", "level": "note", "message": {"text": "Legacy-named symbol `baseline_v1` in scripts/fitness/check_legacy_concepts.py:97"}, "properties": {"repobilityId": "64a1488b17d8f6b4", "scanner": "scanner-primary", "fingerprint": "99ca5403543d3b3a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ed98f92ed0f33704", "level": "note", "message": {"text": "Legacy-named symbol `baseline_v1` in backend/tests/integration/test_migration_roundtrip.py:47"}, "properties": {"repobilityId": "587cf2ccaccb312e", "scanner": "scanner-primary", "fingerprint": "ed98f92ed0f33704", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9420c3f443a0dd98", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/tests/integration/test_kind_discriminator.py:66"}, "properties": {"repobilityId": "124beb473e8c26df", "scanner": "scanner-primary", "fingerprint": "9420c3f443a0dd98", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b3c6713633fc48d", "level": "none", "message": {"text": "Commented-code block (10 lines) in backend/tests/integration/conftest.py:96"}, "properties": {"repobilityId": "615f6210e8dd844e", "scanner": "scanner-primary", "fingerprint": "7b3c6713633fc48d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ddfb7effd6780d65", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/tests/integration/test_run_view_current_values.py:61"}, "properties": {"repobilityId": "040ea2fcd9c458cc", "scanner": "scanner-primary", "fingerprint": "ddfb7effd6780d65", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-01f75271322495f9", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/tests/integration/test_multi_run_scoping.py:193"}, "properties": {"repobilityId": "5bf6049e28b97e7c", "scanner": "scanner-primary", "fingerprint": "01f75271322495f9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fb7c448ddde2e547", "level": "none", "message": {"text": "Commented-code block (9 lines) in backend/tests/integration/test_run_lifecycle_concurrency.py:300"}, "properties": {"repobilityId": "dffd2d5b2bbdb8fe", "scanner": "scanner-primary", "fingerprint": "fb7c448ddde2e547", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c1cd4a2632afdb4b", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/tests/integration/test_calculate_model_progress.py:489"}, "properties": {"repobilityId": "a537fa99316b7e97", "scanner": "scanner-primary", "fingerprint": "c1cd4a2632afdb4b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-42458872ed2c7c1a", "level": "none", "message": {"text": "Commented-code block (9 lines) in backend/tests/integration/test_hitl_session_concurrency.py:360"}, "properties": {"repobilityId": "63ae04a075a9d823", "scanner": "scanner-primary", "fingerprint": "42458872ed2c7c1a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-84e5d35b8aefbe25", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/tests/integration/test_hitl_session.py:903"}, "properties": {"repobilityId": "709f98bc4206b189", "scanner": "scanner-primary", "fingerprint": "84e5d35b8aefbe25", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1681eddffed35c70", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/tests/integration/test_membership_guards.py:583"}, "properties": {"repobilityId": "a230b077b5ac223c", "scanner": "scanner-primary", "fingerprint": "1681eddffed35c70", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-686232b5579e0008", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/tests/integration/test_extraction_proposal_service.py:123"}, "properties": {"repobilityId": "91c8fe2d2bbb48cb", "scanner": "scanner-primary", "fingerprint": "686232b5579e0008", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d3a2fa5a24f92e97", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/tests/integration/test_run_lifecycle_service.py:301"}, "properties": {"repobilityId": "dbeb54cf9758de25", "scanner": "scanner-primary", "fingerprint": "d3a2fa5a24f92e97", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea4f385c5c76a048", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/tests/integration/smoke_constraints/test_workflow_article_coherence.py:34"}, "properties": {"repobilityId": "1bb025809093562b", "scanner": "scanner-primary", "fingerprint": "ea4f385c5c76a048", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b029e21a48e863e4", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/tests/unit/test_extraction_export_schemas.py:132"}, "properties": {"repobilityId": "63d2c12e54c83b6e", "scanner": "scanner-primary", "fingerprint": "b029e21a48e863e4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3ab57bdbd7a5c465", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/tests/unit/test_section_extraction_service.py:293"}, "properties": {"repobilityId": "68cc5870263e1462", "scanner": "scanner-primary", "fingerprint": "3ab57bdbd7a5c465", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e30ec16cf45aa3b", "level": "note", "message": {"text": "Legacy-named symbol `useLegacy` in backend/tests/unit/scripts/test_check_react_query_keys_canary.py:69"}, "properties": {"repobilityId": "aa467a3377adc2ff", "scanner": "scanner-primary", "fingerprint": "8e30ec16cf45aa3b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9666c92b5ded3572", "level": "note", "message": {"text": "Legacy-named symbol `extraction_legacy` in backend/tests/unit/scripts/test_check_rls_coverage_canary.py:67"}, "properties": {"repobilityId": "075aa7fd98f89f89", "scanner": "scanner-primary", "fingerprint": "9666c92b5ded3572", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d5b23c2b7d843547", "level": "note", "message": {"text": "Legacy-named symbol `0001_baseline_v1` in backend/app/models/article.py:313"}, "properties": {"repobilityId": "007762da8624b75a", "scanner": "scanner-primary", "fingerprint": "d5b23c2b7d843547", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5e3ca593293556c2", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/models/extraction.py:313"}, "properties": {"repobilityId": "74e9c7b6bd523877", "scanner": "scanner-primary", "fingerprint": "5e3ca593293556c2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-32051ed23de22966", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/models/extraction_workflow.py:152"}, "properties": {"repobilityId": "ff81aec6eff4b129", "scanner": "scanner-primary", "fingerprint": "32051ed23de22966", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-900e325cba2a4f08", "level": "none", "message": {"text": "Commented-code block (10 lines) in backend/app/api/v1/endpoints/section_extraction.py:129"}, "properties": {"repobilityId": "2011b76272d09f0f", "scanner": "scanner-primary", "fingerprint": "900e325cba2a4f08", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-19836ef449de216e", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/api/v1/endpoints/user_api_keys.py:190"}, "properties": {"repobilityId": "08b247568937f897", "scanner": "scanner-primary", "fingerprint": "19836ef449de216e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6786cce50dc66f3d", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/app/api/v1/endpoints/extraction_export.py:372"}, "properties": {"repobilityId": "28ba25e225fb2901", "scanner": "scanner-primary", "fingerprint": "6786cce50dc66f3d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2110a6ccf2f839a2", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/api/v1/endpoints/articles_export.py:245"}, "properties": {"repobilityId": "07930891bb6faddd", "scanner": "scanner-primary", "fingerprint": "2110a6ccf2f839a2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5cc883331c2d7e48", "level": "none", "message": {"text": "Commented-code block (8 lines) in backend/app/worker/celery_app.py:50"}, "properties": {"repobilityId": "8824584c0f092fdb", "scanner": "scanner-primary", "fingerprint": "5cc883331c2d7e48", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b03221a55841bfe", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/services/hitl_session_service.py:209"}, "properties": {"repobilityId": "6f6ce935f1b641ee", "scanner": "scanner-primary", "fingerprint": "1b03221a55841bfe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2bc3b06ebb95b18d", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/services/section_extraction_service.py:157"}, "properties": {"repobilityId": "84fee22bc40b0d7d", "scanner": "scanner-primary", "fingerprint": "2bc3b06ebb95b18d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d5a7f537282f3ef6", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/services/model_extraction_service.py:438"}, "properties": {"repobilityId": "f9625e5cccabe4e7", "scanner": "scanner-primary", "fingerprint": "d5a7f537282f3ef6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-153be28dadf7b632", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/services/run_lifecycle_service.py:173"}, "properties": {"repobilityId": "4a8818d9a2f42e75", "scanner": "scanner-primary", "fingerprint": "153be28dadf7b632", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-212ce64430f8138f", "level": "none", "message": {"text": "Commented-code block (15 lines) in backend/app/services/template_clone_service.py:80"}, "properties": {"repobilityId": "f16833ef026b1743", "scanner": "scanner-primary", "fingerprint": "212ce64430f8138f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f3bf1c7ba64cc45", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/services/extraction_review_service.py:88"}, "properties": {"repobilityId": "ee36a7001b8eca81", "scanner": "scanner-primary", "fingerprint": "1f3bf1c7ba64cc45", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-958caf7332958e05", "level": "none", "message": {"text": "Commented-code block (16 lines) in backend/app/services/extraction_proposal_service.py:50"}, "properties": {"repobilityId": "951d7bfcad6a6efd", "scanner": "scanner-primary", "fingerprint": "958caf7332958e05", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-37be40456251bc8e", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/services/exports/extraction_xlsx_builder.py:64"}, "properties": {"repobilityId": "522de5f687c8ae9b", "scanner": "scanner-primary", "fingerprint": "37be40456251bc8e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-77194faf5fd73e51", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/core/config.py:42"}, "properties": {"repobilityId": "3778d1a851a2f707", "scanner": "scanner-primary", "fingerprint": "77194faf5fd73e51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f1f434d35aca4a08", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/alembic/versions/0017_backfill_role_in_snapshot.py:78"}, "properties": {"repobilityId": "3aa5dea5da0db668", "scanner": "scanner-primary", "fingerprint": "f1f434d35aca4a08", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-82e036d2745310b2", "level": "note", "message": {"text": "Legacy-named symbol `0001_baseline_v1` in backend/alembic/versions/0002_drop_extracted_values.py:4"}, "properties": {"repobilityId": "6d527cabf5092b46", "scanner": "scanner-primary", "fingerprint": "82e036d2745310b2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1c645d1798b7a6d6", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/alembic/versions/0013_fix_calculate_model_progress.py:126"}, "properties": {"repobilityId": "8d8e65f27cd5fd1d", "scanner": "scanner-primary", "fingerprint": "1c645d1798b7a6d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9527043196977afe", "level": "note", "message": {"text": "Legacy-named symbol `baseline_v1` in backend/alembic/versions/0007_drop_migration_status.py:7"}, "properties": {"repobilityId": "47511fbece1caafb", "scanner": "scanner-primary", "fingerprint": "9527043196977afe", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c87ce654c28af229", "level": "none", "message": {"text": "Commented-code block (8 lines) in backend/alembic/versions/0015_charms_studylevel_split.py:74"}, "properties": {"repobilityId": "19f3d5666a009b05", "scanner": "scanner-primary", "fingerprint": "c87ce654c28af229", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9099a57afb1ef418", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/alembic/versions/0016_entity_role_column.py:154"}, "properties": {"repobilityId": "2bc303f958198b66", "scanner": "scanner-primary", "fingerprint": "9099a57afb1ef418", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a8943c78ff33d959", "level": "note", "message": {"text": "Legacy-named symbol `0001_baseline_v1` in backend/alembic/versions/0001_baseline_v1.py:3"}, "properties": {"repobilityId": "c47b8eb3fbf1db54", "scanner": "scanner-primary", "fingerprint": "a8943c78ff33d959", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c02b0f2146601b8e", "level": "note", "message": {"text": "Legacy-named symbol `0001_baseline_v1` in backend/alembic/versions/0003_storage_object_policies.py:12"}, "properties": {"repobilityId": "f6727b21aa570210", "scanner": "scanner-primary", "fingerprint": "c02b0f2146601b8e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4a78f23d5ecc18a6", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/alembic/versions/0026_widen_template_snapshot.py:33"}, "properties": {"repobilityId": "cdcfa9d191b6d910", "scanner": "scanner-primary", "fingerprint": "4a78f23d5ecc18a6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8aa754baa8b4f928", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/alembic/versions/0020_feedback_outbox.py:112"}, "properties": {"repobilityId": "2e60b0d946ea5793", "scanner": "scanner-primary", "fingerprint": "8aa754baa8b4f928", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3cbded522ac8c58c", "level": "note", "message": {"text": "Legacy-named symbol `extraction_run_stage_old` in backend/alembic/versions/archive/20260427_0014_run_stage_enum_migration.py:18"}, "properties": {"repobilityId": "5876ac635e09be43", "scanner": "scanner-primary", "fingerprint": "3cbded522ac8c58c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-226522e03cfab62d", "level": "note", "message": {"text": "45 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "147ecc9c5b87abb5", "scanner": "scanner-primary", "fingerprint": "226522e03cfab62d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "5b0a3a768c26fa01", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "c59b7db8b50ceb27", "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": "52d47d00c6ca3bd8", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "887ee6264d6482fd", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "fb5a6fc635d63068", "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": "9b6640ab169d2710", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-0027e313ade46c8f", "level": "note", "message": {"text": "Near-duplicate function bodies in 7 places"}, "properties": {"repobilityId": "e19579e10863fddf", "scanner": "scanner-primary", "fingerprint": "0027e313ade46c8f", "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": "4ff2cde4471dad39", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "f48a0da891eb172f", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "f37d2e1de8ac2acf", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "fa6b0f4adf078ced", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "84bf148d20cb6d96", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "ab85ee9811fe83ca", "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": "cae3b1d076ae26f6", "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": "ba0df26b56530620", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "0372b63b99ad714f", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "a946fb1a2444a11f", "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": "6147f0f157dc15d6", "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": "423b5be0f2ad6344", "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": "fe71322ceaf45682", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-1d33a79cff34f9ac", "level": "warning", "message": {"text": "Frontend route `/auth/reset-password` has no Link/navigate to it \u2014 frontend/App.tsx"}, "properties": {"repobilityId": "21f2ba01541ba976", "scanner": "scanner-primary", "fingerprint": "1d33a79cff34f9ac", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d15b56a2a30d5b11", "level": "warning", "message": {"text": "Frontend route `/projects/:projectId` has no Link/navigate to it \u2014 frontend/test/QualityAssessmentInterface.test.tsx"}, "properties": {"repobilityId": "c0ab3d5a21926b11", "scanner": "scanner-primary", "fingerprint": "d15b56a2a30d5b11", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-73ac53bb9dadf63c", "level": "warning", "message": {"text": "Frontend route `/projects/:projectId/extraction/:articleId` has no Link/navigate to it \u2014 frontend/App.tsx"}, "properties": {"repobilityId": "b8c85a98f0dfc162", "scanner": "scanner-primary", "fingerprint": "73ac53bb9dadf63c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fddc9ac67122708e", "level": "warning", "message": {"text": "Frontend route `/projects/:projectId/articles/:articleId/quality-assessment/:templateId` has no Link/navigate to it \u2014 frontend/test/QualityAssessmentFullScreen.test.tsx"}, "properties": {"repobilityId": "e34d0b66341da078", "scanner": "scanner-primary", "fingerprint": "fddc9ac67122708e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a00ce1c9062cbf55", "level": "warning", "message": {"text": "Frontend route `/projects/:projectId/articles/add` has no Link/navigate to it \u2014 frontend/App.tsx"}, "properties": {"repobilityId": "e1c7d331896d1d09", "scanner": "scanner-primary", "fingerprint": "a00ce1c9062cbf55", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-46896a05e59b0136", "level": "warning", "message": {"text": "Frontend route `/projects/:projectId/articles/:articleId/edit` has no Link/navigate to it \u2014 frontend/App.tsx"}, "properties": {"repobilityId": "de52d215839dc0c7", "scanner": "scanner-primary", "fingerprint": "46896a05e59b0136", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-200787cd8ae71081", "level": "error", "message": {"text": "FastAPI POST `extract_section` without auth dependency \u2014 backend/app/api/v1/endpoints/section_extraction.py:65"}, "properties": {"repobilityId": "6510ef775fc69da5", "scanner": "scanner-primary", "fingerprint": "200787cd8ae71081", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/endpoints/section_extraction.py"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-0d745cbaa5d8240d", "level": "error", "message": {"text": "FastAPI POST `create_api_key` without auth dependency \u2014 backend/app/api/v1/endpoints/user_api_keys.py:105"}, "properties": {"repobilityId": "1eeac2c7c09b9a7d", "scanner": "scanner-primary", "fingerprint": "0d745cbaa5d8240d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/endpoints/user_api_keys.py"}, "region": {"startLine": 105}}}]}, {"ruleId": "scanner-62a846fe19221e6e", "level": "error", "message": {"text": "FastAPI PATCH `update_api_key` without auth dependency \u2014 backend/app/api/v1/endpoints/user_api_keys.py:171"}, "properties": {"repobilityId": "66028fbb7890706c", "scanner": "scanner-primary", "fingerprint": "62a846fe19221e6e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/endpoints/user_api_keys.py"}, "region": {"startLine": 171}}}]}, {"ruleId": "scanner-759c8aadac9d3f70", "level": "error", "message": {"text": "FastAPI DELETE `delete_api_key` without auth dependency \u2014 backend/app/api/v1/endpoints/user_api_keys.py:301"}, "properties": {"repobilityId": "7dd5b5c03f6e83b6", "scanner": "scanner-primary", "fingerprint": "759c8aadac9d3f70", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/endpoints/user_api_keys.py"}, "region": {"startLine": 301}}}]}, {"ruleId": "scanner-6cebcbbf9d096226", "level": "error", "message": {"text": "FastAPI POST `validate_api_key` without auth dependency \u2014 backend/app/api/v1/endpoints/user_api_keys.py:355"}, "properties": {"repobilityId": "7185ac2226193a3b", "scanner": "scanner-primary", "fingerprint": "6cebcbbf9d096226", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/endpoints/user_api_keys.py"}, "region": {"startLine": 355}}}]}, {"ruleId": "scanner-9c437fd07881a9e5", "level": "error", "message": {"text": "FastAPI POST `zotero_action` without auth dependency \u2014 backend/app/api/v1/endpoints/zotero_import.py:91"}, "properties": {"repobilityId": "c57312f7ff75984f", "scanner": "scanner-primary", "fingerprint": "9c437fd07881a9e5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/endpoints/zotero_import.py"}, "region": {"startLine": 91}}}]}, {"ruleId": "scanner-05e0efbf9e9786a8", "level": "error", "message": {"text": "FastAPI POST `submit_feedback` without auth dependency \u2014 backend/app/api/v1/endpoints/feedback.py:18"}, "properties": {"repobilityId": "aac6a8cc36aac0ba", "scanner": "scanner-primary", "fingerprint": "05e0efbf9e9786a8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/endpoints/feedback.py"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-6adee6b62594e9b2", "level": "error", "message": {"text": "FastAPI POST `start_extraction_export` without auth dependency \u2014 backend/app/api/v1/endpoints/extraction_export.py:125"}, "properties": {"repobilityId": "ce6c10c5185cd50a", "scanner": "scanner-primary", "fingerprint": "6adee6b62594e9b2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/endpoints/extraction_export.py"}, "region": {"startLine": 125}}}]}, {"ruleId": "scanner-dbf463a768eaa628", "level": "error", "message": {"text": "FastAPI POST `cancel_extraction_export` without auth dependency \u2014 backend/app/api/v1/endpoints/extraction_export.py:444"}, "properties": {"repobilityId": "a0745eee1696f0ef", "scanner": "scanner-primary", "fingerprint": "dbf463a768eaa628", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/endpoints/extraction_export.py"}, "region": {"startLine": 444}}}]}, {"ruleId": "scanner-c227b350ec9cdda2", "level": "error", "message": {"text": "FastAPI DELETE `cancel_extraction_export` without auth dependency \u2014 backend/app/api/v1/endpoints/extraction_export.py:449"}, "properties": {"repobilityId": "8c97c422e5d873de", "scanner": "scanner-primary", "fingerprint": "c227b350ec9cdda2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/endpoints/extraction_export.py"}, "region": {"startLine": 449}}}]}, {"ruleId": "scanner-fa1cd8d8a05bb3f3", "level": "error", "message": {"text": "FastAPI POST `extract_models` without auth dependency \u2014 backend/app/api/v1/endpoints/model_extraction.py:107"}, "properties": {"repobilityId": "977307b044541968", "scanner": "scanner-primary", "fingerprint": "fa1cd8d8a05bb3f3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/endpoints/model_extraction.py"}, "region": {"startLine": 107}}}]}, {"ruleId": "scanner-8ea8313113bd5608", "level": "error", "message": {"text": "FastAPI POST `start_export` without auth dependency \u2014 backend/app/api/v1/endpoints/articles_export.py:91"}, "properties": {"repobilityId": "ed9975031d09fa51", "scanner": "scanner-primary", "fingerprint": "8ea8313113bd5608", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/endpoints/articles_export.py"}, "region": {"startLine": 91}}}]}, {"ruleId": "scanner-8482667061520c96", "level": "error", "message": {"text": "FastAPI POST `cancel_export` without auth dependency \u2014 backend/app/api/v1/endpoints/articles_export.py:330"}, "properties": {"repobilityId": "1bc8e9c9db28f651", "scanner": "scanner-primary", "fingerprint": "8482667061520c96", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/endpoints/articles_export.py"}, "region": {"startLine": 330}}}]}, {"ruleId": "scanner-bcdde8a43f2b55bf", "level": "error", "message": {"text": "FastAPI DELETE `cancel_export` without auth dependency \u2014 backend/app/api/v1/endpoints/articles_export.py:335"}, "properties": {"repobilityId": "55b50bf08624ba79", "scanner": "scanner-primary", "fingerprint": "bcdde8a43f2b55bf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/endpoints/articles_export.py"}, "region": {"startLine": 335}}}]}, {"ruleId": "scanner-0be22a0989bd0a9a", "level": "error", "message": {"text": "Dangling fetch: POST /api/errors (frontend/services/errorTracking.ts:227)"}, "properties": {"repobilityId": "e905c7df058701c9", "scanner": "scanner-primary", "fingerprint": "0be22a0989bd0a9a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-788c08e825a28f78", "level": "error", "message": {"text": "Dangling fetch: POST /api/metrics (frontend/services/errorTracking.ts:243)"}, "properties": {"repobilityId": "b040e6cfe8d239a6", "scanner": "scanner-primary", "fingerprint": "788c08e825a28f78", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "9a7ab29051c0367b", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-27ac02018b635ba2", "level": "note", "message": {"text": "Unused endpoint: POST /extraction/sections"}, "properties": {"repobilityId": "0381543999ee3d8a", "scanner": "scanner-primary", "fingerprint": "27ac02018b635ba2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "866409a3cedb5c17", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e8c80beb5035ed21", "level": "note", "message": {"text": "Unused endpoint: PATCH /{key_id}"}, "properties": {"repobilityId": "036d408ae8391b68", "scanner": "scanner-primary", "fingerprint": "e8c80beb5035ed21", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e21cf4ee09f7c6a9", "level": "note", "message": {"text": "Unused endpoint: GET /providers"}, "properties": {"repobilityId": "dc820e5969c29654", "scanner": "scanner-primary", "fingerprint": "e21cf4ee09f7c6a9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-38f0a0bf734e5bcc", "level": "note", "message": {"text": "Unused endpoint: DELETE /{key_id}"}, "properties": {"repobilityId": "2c7cdb5a67ee8ea0", "scanner": "scanner-primary", "fingerprint": "38f0a0bf734e5bcc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b905b06393a342f9", "level": "note", "message": {"text": "Unused endpoint: POST /{key_id}/validate"}, "properties": {"repobilityId": "822c2432940230be", "scanner": "scanner-primary", "fingerprint": "b905b06393a342f9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-85a63c934adce435", "level": "note", "message": {"text": "Unused endpoint: POST /zotero/{action}"}, "properties": {"repobilityId": "bcc28d5ba6909d73", "scanner": "scanner-primary", "fingerprint": "85a63c934adce435", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-67ec58b621385b7e", "level": "note", "message": {"text": "Unused endpoint: GET /articles/{article_id}/citations"}, "properties": {"repobilityId": "9f83516142000971", "scanner": "scanner-primary", "fingerprint": "67ec58b621385b7e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fa69f831f41695af", "level": "note", "message": {"text": "Unused endpoint: POST /hitl/sessions"}, "properties": {"repobilityId": "457df45bb2bb9d27", "scanner": "scanner-primary", "fingerprint": "fa69f831f41695af", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b2676239b16ebeda", "level": "note", "message": {"text": "Unused endpoint: POST /{project_id}/extraction-export"}, "properties": {"repobilityId": "a057215b17ceb7e7", "scanner": "scanner-primary", "fingerprint": "b2676239b16ebeda", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b11971dd07f8b6a2", "level": "note", "message": {"text": "Unused endpoint: GET /{project_id}/extraction-export/reviewers"}, "properties": {"repobilityId": "8e5a8a0dfda8ccc6", "scanner": "scanner-primary", "fingerprint": "b11971dd07f8b6a2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d9f05f08039e6313", "level": "note", "message": {"text": "Unused endpoint: GET /{project_id}/extraction-export/status/{job_id}"}, "properties": {"repobilityId": "bb1d0d0b5f9ad402", "scanner": "scanner-primary", "fingerprint": "d9f05f08039e6313", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cb40cedab1428ef4", "level": "note", "message": {"text": "Unused endpoint: POST /{project_id}/extraction-export/status/{job_id}/cancel"}, "properties": {"repobilityId": "58c7a734928549f0", "scanner": "scanner-primary", "fingerprint": "cb40cedab1428ef4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8fc249926c253404", "level": "note", "message": {"text": "Unused endpoint: DELETE /{project_id}/extraction-export/status/{job_id}"}, "properties": {"repobilityId": "5fbb330b55c62f4e", "scanner": "scanner-primary", "fingerprint": "8fc249926c253404", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bad01ac2222e29f1", "level": "note", "message": {"text": "Unused endpoint: GET /{run_id}"}, "properties": {"repobilityId": "85f7f04ff6891d74", "scanner": "scanner-primary", "fingerprint": "bad01ac2222e29f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d693d50a6e36918f", "level": "note", "message": {"text": "Unused endpoint: GET /{run_id}/view"}, "properties": {"repobilityId": "740c19156c0dc35e", "scanner": "scanner-primary", "fingerprint": "d693d50a6e36918f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-53e356f7b305babb", "level": "note", "message": {"text": "Unused endpoint: POST /{run_id}/proposals"}, "properties": {"repobilityId": "4c203c91d56cf6f0", "scanner": "scanner-primary", "fingerprint": "53e356f7b305babb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-77d006ab69ade80c", "level": "note", "message": {"text": "Unused endpoint: POST /{run_id}/decisions"}, "properties": {"repobilityId": "df1acaa732672450", "scanner": "scanner-primary", "fingerprint": "77d006ab69ade80c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c8cb130a7d31cb99", "level": "note", "message": {"text": "Unused endpoint: POST /{run_id}/consensus"}, "properties": {"repobilityId": "7f9d843dd8c724f6", "scanner": "scanner-primary", "fingerprint": "c8cb130a7d31cb99", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-28ce9bc580dde7de", "level": "note", "message": {"text": "Unused endpoint: POST /{run_id}/advance"}, "properties": {"repobilityId": "26548b76859f26b0", "scanner": "scanner-primary", "fingerprint": "28ce9bc580dde7de", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e4e0461553079261", "level": "note", "message": {"text": "Unused endpoint: GET /{run_id}/reviewers"}, "properties": {"repobilityId": "b07fbaeea327c68f", "scanner": "scanner-primary", "fingerprint": "e4e0461553079261", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b2b1ff1e02e7fcd2", "level": "note", "message": {"text": "Unused endpoint: POST /{run_id}/reopen"}, "properties": {"repobilityId": "8c301487625e1450", "scanner": "scanner-primary", "fingerprint": "b2b1ff1e02e7fcd2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e260dd758fa06018", "level": "note", "message": {"text": "Unused endpoint: POST /extraction/models/manual"}, "properties": {"repobilityId": "7caa298cabd33ff6", "scanner": "scanner-primary", "fingerprint": "e260dd758fa06018", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-06957c196dd7d907", "level": "note", "message": {"text": "Unused endpoint: POST /extraction/models"}, "properties": {"repobilityId": "0878642ce4a37f6f", "scanner": "scanner-primary", "fingerprint": "06957c196dd7d907", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6880fece47cc87de", "level": "note", "message": {"text": "Unused endpoint: GET /{article_file_id}/text-blocks"}, "properties": {"repobilityId": "74293b60db593bbe", "scanner": "scanner-primary", "fingerprint": "6880fece47cc87de", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c718beb53b365b0c", "level": "note", "message": {"text": "Unused endpoint: POST /{project_id}/templates/clone"}, "properties": {"repobilityId": "2a3680690f4bb855", "scanner": "scanner-primary", "fingerprint": "c718beb53b365b0c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-81f10542ba365c41", "level": "note", "message": {"text": "Unused endpoint: PATCH /{project_id}/templates/{template_id}"}, "properties": {"repobilityId": "7e23ee080bbb47aa", "scanner": "scanner-primary", "fingerprint": "81f10542ba365c41", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bd7edcd64ccd7699", "level": "note", "message": {"text": "Unused endpoint: GET /projects/{project_id}/hitl-config"}, "properties": {"repobilityId": "cb7c1087f985dbfa", "scanner": "scanner-primary", "fingerprint": "bd7edcd64ccd7699", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f5a74f19aee43fae", "level": "note", "message": {"text": "Unused endpoint: PUT /projects/{project_id}/hitl-config"}, "properties": {"repobilityId": "16ef0b6ee30e9dbf", "scanner": "scanner-primary", "fingerprint": "f5a74f19aee43fae", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ce55c77e726fcf10", "level": "note", "message": {"text": "Unused endpoint: DELETE /projects/{project_id}/hitl-config"}, "properties": {"repobilityId": "8344cf82dba10f23", "scanner": "scanner-primary", "fingerprint": "ce55c77e726fcf10", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-db6b0c15a15c7def", "level": "note", "message": {"text": "Unused endpoint: GET /projects/{project_id}/templates/{project_template_id}/hitl-config"}, "properties": {"repobilityId": "02b50d40bcb4c2ff", "scanner": "scanner-primary", "fingerprint": "db6b0c15a15c7def", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1d9ab17d00523153", "level": "note", "message": {"text": "Unused endpoint: PUT /projects/{project_id}/templates/{project_template_id}/hitl-config"}, "properties": {"repobilityId": "f16915baad4ad50f", "scanner": "scanner-primary", "fingerprint": "1d9ab17d00523153", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-287d10dbb4925a93", "level": "note", "message": {"text": "Unused endpoint: DELETE /projects/{project_id}/templates/{project_template_id}/hitl-config"}, "properties": {"repobilityId": "bd37230c62441368", "scanner": "scanner-primary", "fingerprint": "287d10dbb4925a93", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-02062ae42a8de61d", "level": "note", "message": {"text": "Unused endpoint: POST /articles-export"}, "properties": {"repobilityId": "d5fcf9be97828a89", "scanner": "scanner-primary", "fingerprint": "02062ae42a8de61d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a7ff0a73f07973a8", "level": "note", "message": {"text": "Unused endpoint: GET /articles-export/status/{job_id}"}, "properties": {"repobilityId": "680a68f2359b5d22", "scanner": "scanner-primary", "fingerprint": "a7ff0a73f07973a8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7939e0723b5e6054", "level": "note", "message": {"text": "Unused endpoint: POST /articles-export/status/{job_id}/cancel"}, "properties": {"repobilityId": "b0729cbb103f34d6", "scanner": "scanner-primary", "fingerprint": "7939e0723b5e6054", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-310b80abe03c0098", "level": "note", "message": {"text": "Unused endpoint: DELETE /articles-export/status/{job_id}"}, "properties": {"repobilityId": "fcd0e5c2464f1808", "scanner": "scanner-primary", "fingerprint": "310b80abe03c0098", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}