{"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-eda52e9a870185b8", "name": "Possibly dead Python function: calculate_aso_score", "shortDescription": {"text": "Possibly dead Python function: calculate_aso_score"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-55cbf2237995c722", "name": "Possibly dead Python function: identify_gaps", "shortDescription": {"text": "Possibly dead Python function: identify_gaps"}, "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-4684a87130ab21e6", "name": "Possibly dead Python function: analyze_competitor_set", "shortDescription": {"text": "Possibly dead Python function: analyze_competitor_set"}, "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-46aa0f783d94e9d4", "name": "Possibly dead Python function: translate_metadata", "shortDescription": {"text": "Possibly dead Python function: translate_metadata"}, "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-e8079cbf54bbc3ad", "name": "Possibly dead Python function: adapt_keywords", "shortDescription": {"text": "Possibly dead Python function: adapt_keywords"}, "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-8bbc80dc298011ef", "name": "Possibly dead Python function: validate_translations", "shortDescription": {"text": "Possibly dead Python function: validate_translations"}, "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-4930ad618b468f33", "name": "Possibly dead Python function: plan_localization_strategy", "shortDescription": {"text": "Possibly dead Python function: plan_localization_strategy"}, "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-cd452367584dcfe8", "name": "Possibly dead Python function: track_sentiment_trends", "shortDescription": {"text": "Possibly dead Python function: track_sentiment_trends"}, "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-29c43ca8d080aca9", "name": "Possibly dead Python function: generate_response_templates", "shortDescription": {"text": "Possibly dead Python function: generate_response_templates"}, "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-a9e0cc1f41d7e648", "name": "Possibly dead Python function: analyze_reviews", "shortDescription": {"text": "Possibly dead Python function: analyze_reviews"}, "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-32a6c15706469d3b", "name": "Possibly dead Python function: validate_app_store_compliance", "shortDescription": {"text": "Possibly dead Python function: validate_app_store_compliance"}, "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-0a797e7f89e3c32f", "name": "Possibly dead Python function: create_update_plan", "shortDescription": {"text": "Possibly dead Python function: create_update_plan"}, "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-7f0cb2bc2f7847a5", "name": "Possibly dead Python function: optimize_launch_timing", "shortDescription": {"text": "Possibly dead Python function: optimize_launch_timing"}, "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-ad7ebd6f9187d42d", "name": "Possibly dead Python function: plan_seasonal_campaigns", "shortDescription": {"text": "Possibly dead Python function: plan_seasonal_campaigns"}, "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-ad8c734d3919d708", "name": "Possibly dead Python function: generate_launch_checklist", "shortDescription": {"text": "Possibly dead Python function: generate_launch_checklist"}, "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-c1df182910652d50", "name": "Possibly dead Python function: validate_character_limits", "shortDescription": {"text": "Possibly dead Python function: validate_character_limits"}, "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-393573300e8bc506", "name": "Possibly dead Python function: optimize_app_metadata", "shortDescription": {"text": "Possibly dead Python function: optimize_app_metadata"}, "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-7a1ad050a907310a", "name": "Possibly dead Python function: find_long_tail_opportunities", "shortDescription": {"text": "Possibly dead Python function: find_long_tail_opportunities"}, "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-660421b61fee8c62", "name": "Possibly dead Python function: extract_keywords_from_text", "shortDescription": {"text": "Possibly dead Python function: extract_keywords_from_text"}, "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-78c578f69a52e4f6", "name": "Possibly dead Python function: analyze_keyword_set", "shortDescription": {"text": "Possibly dead Python function: analyze_keyword_set"}, "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-8d22b0aec0d12dba", "name": "Possibly dead Python function: analyze_all", "shortDescription": {"text": "Possibly dead Python function: analyze_all"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8ca7e522b169df07", "name": "Possibly dead Python function: generate_insights", "shortDescription": {"text": "Possibly dead Python function: generate_insights"}, "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-5db95286a3f421ce", "name": "Stray `console.log` in TS/JS \u2014 frontend/test-supabase.js:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/test-supabase.js:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-103a5db3e408c95e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/nav-projects.tsx:91", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/nav-projects.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-009016965278e1f7", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/team-switcher.tsx:75", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/team-switcher.tsx:75"}, "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-4a045637df48a24c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/nav-boards.tsx:215", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/nav-boards.tsx:215"}, "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-56e91940fcfb8447", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin-sidebar.tsx:88", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin-sidebar.tsx:88"}, "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-b34d79d010c5fdf8", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/brand-logo.tsx:113", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/brand-logo.tsx:113"}, "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-ec34de5461504d51", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/nav-user.tsx:76", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/nav-user.tsx:76"}, "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-3b0345a77326a2a6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/integrations/integration-catalog.tsx:198", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/integrations/integration-catalog.tsx:198"}, "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-08d6375432ae27de", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/integrations/integration-test-chat.tsx:262", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/integrations/integration-test-chat.tsx:262"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-21fe97f3ad544bef", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/integrations/integration-connection-card.ts", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/integrations/integration-connection-card.tsx:98"}, "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-cf37409c5f7c4ebc", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/orchestration/pod-context-sidebar.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/orchestration/pod-context-sidebar.tsx:71"}, "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-f12e2e5e056a6406", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/pods/pod-card.tsx:58", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/pods/pod-card.tsx:58"}, "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-5cbb0285a3306dfe", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/pods/execution-history-panel.tsx:43", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/pods/execution-history-panel.tsx:43"}, "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-1f57a142888f30b4", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/pods/assign-boards-dialog.tsx:146", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/pods/assign-boards-dialog.tsx:146"}, "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-9e4fe4a8fcdf7c02", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/pods/route-editor-sheet.tsx:103", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/pods/route-editor-sheet.tsx:103"}, "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-65d3e5ec02b9c355", "name": "React Flow <MiniMap> without dark background \u2014 frontend/src/components/pods/pod-board-canvas.tsx:388", "shortDescription": {"text": "React Flow <MiniMap> without dark background \u2014 frontend/src/components/pods/pod-board-canvas.tsx:388"}, "fullDescription": {"text": "A bare <MiniMap> renders with the vendor's white default in dark themes. Wrap the canvas in a class that overrides `.react-flow__minimap` background, or pass an explicit `style`/`maskColor`/`bgColor`.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.minimap.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9f647760b6598a42", "name": "React Flow <Controls> without dark theming \u2014 frontend/src/components/pods/pod-board-canvas.tsx:387", "shortDescription": {"text": "React Flow <Controls> without dark theming \u2014 frontend/src/components/pods/pod-board-canvas.tsx:387"}, "fullDescription": {"text": "`<Controls>` ships with white buttons. Override `.react-flow__controls` and `.react-flow__controls-button` in your stylesheet or pass a styled wrapper.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.controls.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d7e4ac1ab29675f1", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/pods/pod-board-canvas.tsx:74", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/pods/pod-board-canvas.tsx:74"}, "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-096cacc2c695fa8d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/chat/entity-cards.tsx:67", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/chat/entity-cards.tsx:67"}, "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-a77d7360bf42a821", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/chat/slash-palette.tsx:380", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/chat/slash-palette.tsx:380"}, "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-bf78f9414ccafb01", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/theme/GlobalThemeInjector.tsx:43", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/theme/GlobalThemeInjector.tsx:43"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6994dcdd9c61f6e1", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tasks/category-list.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tasks/category-list.tsx:80"}, "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-991cec216c645629", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/components/tasks/task-ai-chat.tsx:123", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/components/tasks/task-ai-chat.tsx:123"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-16014b6d3d0e9079", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/tasks/task-ai-chat.tsx:382", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/tasks/task-ai-chat.tsx:382"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6ffa34d31250a85c", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/components/marketing/CustomerValidatorModal.tsx:269", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/components/marketing/CustomerValidatorModal.tsx:269"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a5b6d1d65ade256c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/backbones/backbone-connection-card.tsx:64", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/backbones/backbone-connection-card.tsx:64"}, "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-7389e3d91b048023", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/boards/board-card.tsx:85", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/boards/board-card.tsx:85"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8b097703549cb2f9", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/boards/board-ai-chat.tsx:516", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/boards/board-ai-chat.tsx:516"}, "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-4118fcb87c343639", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/boards/board-ai-chat.tsx:498", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/boards/board-ai-chat.tsx:498"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-51188a11f5a7e63f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/boards/step-config-drawer.tsx:169", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/boards/step-config-drawer.tsx:169"}, "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-1cf3bd5ab223c2a0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/boards/step-editor.tsx:210", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/boards/step-editor.tsx:210"}, "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-7c617284f333d85e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/boards/create-board-dialog.tsx:99", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/boards/create-board-dialog.tsx:99"}, "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-15c02ecb507d511e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/boards/board-kanban-column.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/boards/board-kanban-column.tsx:86"}, "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-fafa87fa019e495b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/layout.tsx:177", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/layout.tsx:177"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-264b4c3089147833", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/settings/integrations/page.tsx:705", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/settings/integrations/page.tsx:705"}, "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-e8090e0d2cff35a8", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/settings/syncs/page.tsx:472", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/settings/syncs/page.tsx:472"}, "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-1fdceef1497b920f", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/settings/usage/page.tsx:236", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/settings/usage/page.tsx:236"}, "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-a4713ff08feaac8d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/settings/categories/page.tsx:674", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/settings/categories/page.tsx:674"}, "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-9c993c160b00f49b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/settings/skills/page.tsx:780", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/settings/skills/page.tsx:780"}, "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-e7d47dbd30b79468", "name": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/app/dashboard/settings/skills/page.tsx:543", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/app/dashboard/settings/skills/page.tsx:543"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea5ec27586914c4d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/settings/webhooks/page.tsx:271", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/settings/webhooks/page.tsx:271"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-27c53c09bb74822d", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/app/dashboard/chat/actions.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/app/dashboard/chat/actions.ts:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-628a31623d30c8cc", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/chat/page.tsx:305", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/chat/page.tsx:305"}, "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-2630783f3886a517", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/cockpit/page.tsx:535", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/cockpit/page.tsx:535"}, "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-828e67b96c3743b4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/dashboard/cockpit/page.tsx:1288", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/dashboard/cockpit/page.tsx:1288"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2a0eb0f6d73a5c1e", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/agents/page.tsx:47", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/agents/page.tsx:47"}, "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-a6eb432b77aee15c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/agents/[agentId]/page.tsx:191", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/agents/[agentId]/page.tsx:191"}, "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-626fe9ae437e881c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/inbox/page.tsx:199", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/inbox/page.tsx:199"}, "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-edecda40a2a30344", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/boards/page.tsx:329", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/boards/page.tsx:329"}, "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-54c05ae73c8f5da5", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/knowledge/page.tsx:477", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/knowledge/page.tsx:477"}, "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-ba59fee17bef5764", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/onboarding/components/live-preview.tsx:51", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/onboarding/components/live-preview.tsx:51"}, "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-c080f9d476da8040", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/onboarding/components/step-boards.tsx:104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/onboarding/components/step-boards.tsx:104"}, "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-18f47ffc2b5a3a25", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/app/(auth)/actions.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/app/(auth)/actions.ts:44"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ba0f75f4f7b92a87", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/(marketing)/layout.tsx:41", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/(marketing)/layout.tsx:41"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2acf8096eefad973", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/lib/i18n/i18n.server.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/lib/i18n/i18n.server.ts:28"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e928c9c50380a122", "name": "TODO/FIXME marker in shipping code \u2014 frontend/src/kit/shadcn/data-table.tsx:29", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/kit/shadcn/data-table.tsx:29"}, "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-9f547a1c7a67a43a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/kit/shadcn/chart.tsx:81", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/kit/shadcn/chart.tsx:81"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-064373d11de9a616", "name": "Stray `console.log` in TS/JS \u2014 backend/test-openclaw-ws.ts:59", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/test-openclaw-ws.ts:59"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a4429943a2741783", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/auth-e2e-smoke.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/auth-e2e-smoke.ts:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4e99bb15d7bc1588", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/db-smoke.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/db-smoke.ts:17"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8f4e2b98a1125a12", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/setup-supabase.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/setup-supabase.ts:17"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d73681cde1dd2ff9", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/categories-pilot-smoke.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/categories-pilot-smoke.ts:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4d22338ffb7ae13d", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/sources-pilot-smoke.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/sources-pilot-smoke.ts:9"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b87f8022cd3cb39a", "name": "TODO/FIXME marker in shipping code \u2014 backend/src/adapters/__template__/template.adapter.ts:73", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 backend/src/adapters/__template__/template.adapter.ts:73"}, "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-b81b453abfb8618c", "name": "TODO/FIXME marker in shipping code \u2014 backend/src/users/users.service.ts:213", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 backend/src/users/users.service.ts:213"}, "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-74cd62e6dab0225e", "name": "TODO/FIXME marker in shipping code \u2014 backend/src/sync/sync.service.ts:388", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 backend/src/sync/sync.service.ts:388"}, "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-9381ffa729441c00", "name": "Stray `console.log` in TS/JS \u2014 backend/src/common/utils/encryption.util.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/common/utils/encryption.util.ts:33"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9b7fc21150332fa4", "name": "TODO/FIXME marker in shipping code \u2014 backend/src/teams/teams.service.ts:134", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 backend/src/teams/teams.service.ts:134"}, "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-693e211828c4d24c", "name": "Stray `console.log` in TS/JS \u2014 backend/src/teams/teams.service.ts:135", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/teams/teams.service.ts:135"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8474b7412127c9a7", "name": "TODO/FIXME marker in shipping code \u2014 backend/src/tasks/tasks.service.ts:886", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 backend/src/tasks/tasks.service.ts:886"}, "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-2d01ee6ab3ec43ca", "name": "Privileged port 10 in use", "shortDescription": {"text": "Privileged port 10 in use"}, "fullDescription": {"text": "Port 10 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-662da348442b75fd", "name": "Privileged port 1000 in use", "shortDescription": {"text": "Privileged port 1000 in use"}, "fullDescription": {"text": "Port 1000 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-faa134129e5545ff", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3d2a6283f9ebab24", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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-60405a1b4230f915", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/integrations/integration-test-chat.tsx:262", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/integrations/integration-test-chat.tsx:262"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-140d706621039c61", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/theme/GlobalThemeInjector.tsx:43", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/theme/GlobalThemeInjector.tsx:43"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0b58214596692a8f", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/tasks/task-ai-chat.tsx:382", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/tasks/task-ai-chat.tsx:382"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5fce2f095cb36e9f", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/boards/board-ai-chat.tsx:498", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/boards/board-ai-chat.tsx:498"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a748313f8823275b", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/layout.tsx:177", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/layout.tsx:177"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-df18bf56d51618d4", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/dashboard/cockpit/page.tsx:1288", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/dashboard/cockpit/page.tsx:1288"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8b9647c9372b8a94", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/(marketing)/layout.tsx:41", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/(marketing)/layout.tsx:41"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b92df745a4bdcce2", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/kit/shadcn/chart.tsx:81", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/kit/shadcn/chart.tsx:81"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-54affae81111d90e", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/architecture-visual.html:659", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/architecture-visual.html:659"}, "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-b85297733f6271a3", "name": "Possible secret in scripts/install.sh", "shortDescription": {"text": "Possible secret in scripts/install.sh"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-746a564cf1082f6a", "name": "Possible secret in backend/scripts/auth-e2e-smoke.ts", "shortDescription": {"text": "Possible secret in backend/scripts/auth-e2e-smoke.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-f5d42ecc92bc4f6a", "name": "Possible secret in backend/src/auth/auth.service.spec.ts", "shortDescription": {"text": "Possible secret in backend/src/auth/auth.service.spec.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-263e2921993f686e", "name": "Insecure pattern 'node_child_process' in backend/src/backbone/adapters/claude-code.adapter.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in backend/src/backbone/adapters/claude-code.adapter.ts:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b841c61fdfcff569", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "amannn/action-semantic-pull-request@v5 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-7f1e4527e6fecffa", "name": "GitHub Action tracks a moving branch", "shortDescription": {"text": "GitHub Action tracks a moving branch"}, "fullDescription": {"text": "trufflesecurity/trufflehog@main 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": "high", "confidence": 1.0}}, {"id": "scanner-46c644c6227e4d4a", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1838a141491ce38c", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8432a85471867659", "name": "Very large file: frontend/src/components/tasks/task-detail-panel.tsx (869 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/tasks/task-detail-panel.tsx (869 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-93c61688d6f303f3", "name": "Very large file: frontend/src/app/dashboard/settings/categories/page.tsx (1682 lines)", "shortDescription": {"text": "Very large file: frontend/src/app/dashboard/settings/categories/page.tsx (1682 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-512a9cb30e703177", "name": "Very large file: frontend/src/app/dashboard/cockpit/page.tsx (1861 lines)", "shortDescription": {"text": "Very large file: frontend/src/app/dashboard/cockpit/page.tsx (1861 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-75ce5d4895ffd6a1", "name": "Very large file: backend/src/conversations/conversations.service.ts (3182 lines)", "shortDescription": {"text": "Very large file: backend/src/conversations/conversations.service.ts (3182 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-04460e357cd7882c", "name": "Very large file: backend/src/db/schema.ts (2058 lines)", "shortDescription": {"text": "Very large file: backend/src/db/schema.ts (2058 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "18 test file(s) for 733 source file(s) (ratio 0.02). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-206264ae68b18167", "name": "Node manifest has dependencies but no lockfile: packages/openclaw-plugin/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/openclaw-plugin/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "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 138 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 283 placeholder/mock markers across 101 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-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bea357a6497a2d5d", "name": "Agent authority lacks a verifier contract: CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: CLAUDE.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-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-92da119092a384bf", "name": "Agent authority lacks a verifier contract: .claude/evals/scenarios/S001-cockpit-idle-live-transition.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/evals/scenarios/S001-cockpit-idle-live-transition.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-6bc5564ed6831cc9", "name": "Agent authority lacks a verifier contract: .claude/evals/scenarios/orchestration/S004-autonomy-dial.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/evals/scenarios/orchestration/S004-autonomy-dial.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-3a3dcab32aecb1f3", "name": "Agent instruction/config may expose a secret: .claude/skills/app-store-optimization/references/keyword-research-guide.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/skills/app-store-optimization/references/keyword-research-guide.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2e6c349fe742d947", "name": "Agent authority lacks a verifier contract: .claude/skills/taskclaw-builder/references/workflow.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/taskclaw-builder/references/workflow.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-b4a5eb1908a916fe", "name": "Agent authority lacks a verifier contract: .claude/skills/content-creator/examples/seo_optimization_example.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/content-creator/examples/seo_optimization_example.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-b7a322502f5314c2", "name": "Agent authority lacks a verifier contract: .claude/skills/content-creator/examples/brand_voice_analysis_example.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/content-creator/examples/brand_voice_analysis_example.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-1e6d76d710fb509a", "name": "Agent authority lacks a verifier contract: .claude/skills/taskclaw-shared/bundle_format.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/taskclaw-shared/bundle_format.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-42e635e16f31d986", "name": "Agent authority lacks a verifier contract: .claude/skills/board-architect/references/step_types.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/board-architect/references/step_types.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-1f096fef4940daab", "name": "Agent authority lacks a verifier contract: .claude/skills/board-architect/references/manifest_schema.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/board-architect/references/manifest_schema.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-d396487d556f7db1", "name": "Agent instruction/config may expose a secret: .claude/skills/dev-setup/SKILL.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/skills/dev-setup/SKILL.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-977d52a9dda532c3", "name": "Agent authority lacks a verifier contract: .claude/skills/dev-setup/references/env-vars.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/dev-setup/references/env-vars.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-330dfc934e31f64c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/eslint.config.mjs:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/eslint.config.mjs:31"}, "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-0e37ab8308611219", "name": "Commented-code block (6 lines) in frontend/next.config.ts:5", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/next.config.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e5418793da212ac6", "name": "Commented-code block (5 lines) in frontend/src/components/integrations/setup-guide-renderer.tsx:7", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/integrations/setup-guide-renderer.tsx:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a7ef19bf0f9ceb1d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/events/route.ts:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/events/route.ts:22"}, "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-32921fdd9f4c086b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/[...path]/route.ts:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/[...path]/route.ts:34"}, "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-aaa7697b5b42076d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/skills-actions.ts:67", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/skills-actions.ts:67"}, "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-92cdc44cb603da28", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/settings/memory/actions.ts:190", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/settings/memory/actions.ts:190"}, "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-7ac3aca940a8d1a5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/settings/skills/actions.ts:43", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/settings/skills/actions.ts:43"}, "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-c553e0caf4e13d04", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/settings/agent-sync/actions.ts:118", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/settings/agent-sync/actions.ts:118"}, "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-cce992d99cf1f4ff", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/pods/bundle-actions.ts:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/pods/bundle-actions.ts:33"}, "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-cc71f5c4b637cbc8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/pods/actions.ts:272", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/pods/actions.ts:272"}, "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-8cb1248e5b025266", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/chat/actions.ts:97", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/chat/actions.ts:97"}, "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-83fb4907e0edf3a5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/tasks/actions.ts:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/tasks/actions.ts:49"}, "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-401c1fd3ab442fb5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/agents/actions.ts:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/agents/actions.ts:56"}, "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-e2eacdb76c9beb69", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/factory/actions.ts:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/factory/actions.ts:35"}, "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-df46f2cf102d6a60", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/inbox/actions.ts:67", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/inbox/actions.ts:67"}, "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-c84f669f972be066", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/knowledge/actions.ts:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/knowledge/actions.ts:34"}, "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-ec03509554ae1ed7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/admin/settings/actions.ts:10", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/admin/settings/actions.ts:10"}, "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-84d045df386ceb84", "name": "Commented-code block (7 lines) in frontend/src/app/onboarding/page.tsx:20", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/app/onboarding/page.tsx:20"}, "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-3fc50067a82d1fbd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/(auth)/actions.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/(auth)/actions.ts:23"}, "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-e1489f8b189a80b7", "name": "Commented-code block (6 lines) in frontend/src/lib/auth.ts:30", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/lib/auth.ts:30"}, "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-aaae3337ce6d77ec", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/auth.ts:85", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/auth.ts:85"}, "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-feb6b127894a5e70", "name": "Commented-code block (6 lines) in frontend/src/lib/public-config.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/src/lib/public-config.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e924582f0c349025", "name": "Commented-code block (8 lines) in frontend/src/lib/api-base.ts:3", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/lib/api-base.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c71bd8032c9d2514", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/use-orchestration-events.ts:64", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/use-orchestration-events.ts:64"}, "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-5e5bbe1331e20428", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/kit/makerkit/version-updater.tsx:103", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/kit/makerkit/version-updater.tsx:103"}, "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-65853a1d9c5f9a9f", "name": "Legacy-named symbol `post_copy` in .claude/skills/social-media-analyzer/scripts/calculate_metrics.py:125", "shortDescription": {"text": "Legacy-named symbol `post_copy` in .claude/skills/social-media-analyzer/scripts/calculate_metrics.py:125"}, "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-59364aed0e3e6f11", "name": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/integrations/oauth/oauth.service.ts:267", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/integrations/oauth/oauth.service.ts:267"}, "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-ba8a1c914858b372", "name": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/adapters/clickup/clickup.adapter.ts:267", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/adapters/clickup/clickup.adapter.ts:267"}, "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-ba728fbe7e086e8d", "name": "Commented-code block (5 lines) in backend/src/syncs/dto/syncs.schema.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/syncs/dto/syncs.schema.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8094c4e78f3c2f4a", "name": "Commented-code block (5 lines) in backend/src/users/users.service.ts:213", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/users/users.service.ts:213"}, "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-a0b36615416e43ad", "name": "Commented-code block (5 lines) in backend/src/ai-assistant/ai-assistant.service.ts:287", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/ai-assistant/ai-assistant.service.ts:287"}, "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-b0c8ad70726a768e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/ai-assistant/tools/upload-to-storage.tool.ts:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/ai-assistant/tools/upload-to-storage.tool.ts:33"}, "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-03fc15a74e72cbd6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/ai-assistant/tools/elevenlabs-clone-voice.tool.ts:81", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/ai-assistant/tools/elevenlabs-clone-voice.tool.ts:81"}, "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-3805b48134fc96e5", "name": "Legacy-named symbol `eleven_multilingual_v2` in backend/src/ai-assistant/tools/elevenlabs-tts.tool.ts:49", "shortDescription": {"text": "Legacy-named symbol `eleven_multilingual_v2` in backend/src/ai-assistant/tools/elevenlabs-tts.tool.ts:49"}, "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-d307657f0ee93847", "name": "Commented-code block (5 lines) in backend/src/pods/pod-bundle.service.ts:115", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/pods/pod-bundle.service.ts:115"}, "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-92b340fb1e7bdab4", "name": "Commented-code block (8 lines) in backend/src/pods/dto/pod-bundle.schema.ts:3", "shortDescription": {"text": "Commented-code block (8 lines) in backend/src/pods/dto/pod-bundle.schema.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c14ffb8bc7f8f771", "name": "Commented-code block (5 lines) in backend/src/projects/projects.service.ts:198", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/projects/projects.service.ts:198"}, "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-0cdcf43b239dad02", "name": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/common/utils/retry.util.ts:69", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/common/utils/retry.util.ts:69"}, "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-9245647852ed5be7", "name": "Commented-code block (5 lines) in backend/src/common/utils/snake-keys.util.ts:30", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/common/utils/snake-keys.util.ts:30"}, "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-6e705242e20fec70", "name": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/mcp/api-client.ts:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/mcp/api-client.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-52f4cae416b52d50", "name": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/memory/adapters/obsidian-memory.adapter.ts:205", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/memory/adapters/obsidian-memory.adapter.ts:205"}, "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-37d53949ff931835", "name": "Commented-code block (5 lines) in backend/src/memory/adapters/default-memory.adapter.ts:87", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/memory/adapters/default-memory.adapter.ts:87"}, "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-5cd96741b5379ab8", "name": "Commented-code block (7 lines) in backend/src/inbox/inbox.service.ts:115", "shortDescription": {"text": "Commented-code block (7 lines) in backend/src/inbox/inbox.service.ts:115"}, "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-4b817cdf9a363cdc", "name": "Commented-code block (5 lines) in backend/src/ee/langfuse/langfuse.service.ts:334", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/ee/langfuse/langfuse.service.ts:334"}, "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-b0b7578dd2a289b6", "name": "26 env vars used in code but missing from .env.example", "shortDescription": {"text": "26 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ALLOWED_ORIGINS`, `ANTHROPIC_API_KEY`, `BRAND_NAME`, `COOKIE_SECURE`, `INTERNAL_API_URL`, `NEXT_PUBLIC_BRAND_ICON_LOGO`, `NEXT_PUBLIC_BRAND_IMAGE_PATH`, `NEXT_PUBLIC_ENABLE_SIDEBAR_TRIGGER` + 18 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-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\n.claude/skills/social-media-analyzer/scripts/calculate_metrics.py:safe_divide, .claude/skills/campaign-analytics/scripts/funnel_analyzer.py:safe_divide, .claude/skills/campaign-analytics/scripts/attribution_analyzer.py:safe_divide, .claude/skills/campaign-analytics/scripts/campaign_roi_calculator.py:safe_divide\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-28dd52556708dac1", "name": "Dangling fetch: GET https://api.replicate.com/v1/predictions/${prediction_id} (backend/src/ai-assistant/tools/replicate-", "shortDescription": {"text": "Dangling fetch: GET https://api.replicate.com/v1/predictions/${prediction_id} (backend/src/ai-assistant/tools/replicate-poll.tool.ts:16)"}, "fullDescription": {"text": "`backend/src/ai-assistant/tools/replicate-poll.tool.ts:16` calls `GET https://api.replicate.com/v1/predictions/${prediction_id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.replicate.com/v1/predictions/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b7da16e02127e214", "name": "Dangling fetch: POST https://api.replicate.com/v1/files (backend/src/ai-assistant/tools/upload-to-storage.tool.ts:33)", "shortDescription": {"text": "Dangling fetch: POST https://api.replicate.com/v1/files (backend/src/ai-assistant/tools/upload-to-storage.tool.ts:33)"}, "fullDescription": {"text": "`backend/src/ai-assistant/tools/upload-to-storage.tool.ts:33` calls `POST https://api.replicate.com/v1/files` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.replicate.com/v1/files`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-18d1681ab62f98f7", "name": "Dangling fetch: POST https://api.elevenlabs.io/v1/voices/add (backend/src/ai-assistant/tools/elevenlabs-clone-voice.tool", "shortDescription": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/voices/add (backend/src/ai-assistant/tools/elevenlabs-clone-voice.tool.ts:81)"}, "fullDescription": {"text": "`backend/src/ai-assistant/tools/elevenlabs-clone-voice.tool.ts:81` calls `POST https://api.elevenlabs.io/v1/voices/add` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.elevenlabs.io/v1/voices/add`\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-1221b0f4e77402f1", "name": "Dangling fetch: POST https://api.replicate.com/v1/predictions (backend/src/ai-assistant/tools/replicate-predict.tool.ts:", "shortDescription": {"text": "Dangling fetch: POST https://api.replicate.com/v1/predictions (backend/src/ai-assistant/tools/replicate-predict.tool.ts:31)"}, "fullDescription": {"text": "`backend/src/ai-assistant/tools/replicate-predict.tool.ts:31` calls `POST https://api.replicate.com/v1/predictions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.replicate.com/v1/predictions`\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-02fee88196bfb38a", "name": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${voice_id} (backend/src/ai-assistant/tools/elevenlabs-", "shortDescription": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${voice_id} (backend/src/ai-assistant/tools/elevenlabs-tts.tool.ts:38)"}, "fullDescription": {"text": "`backend/src/ai-assistant/tools/elevenlabs-tts.tool.ts:38` calls `POST https://api.elevenlabs.io/v1/text-to-speech/${voice_id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.elevenlabs.io/v1/text-to-speech/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0895658787e671f3", "name": "Dangling fetch: GET https://api.example.com/data (backend/src/common/utils/retry.util.ts:69)", "shortDescription": {"text": "Dangling fetch: GET https://api.example.com/data (backend/src/common/utils/retry.util.ts:69)"}, "fullDescription": {"text": "`backend/src/common/utils/retry.util.ts:69` calls `GET https://api.example.com/data` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.example.com/data`\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-99addbde9e252c23", "name": "Dangling fetch: GET https://api.anthropic.com/v1/models (backend/src/backbone/adapters/anthropic.adapter.ts:49)", "shortDescription": {"text": "Dangling fetch: GET https://api.anthropic.com/v1/models (backend/src/backbone/adapters/anthropic.adapter.ts:49)"}, "fullDescription": {"text": "`backend/src/backbone/adapters/anthropic.adapter.ts:49` calls `GET https://api.anthropic.com/v1/models` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/models`\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-a977c4f370f77fa7", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (backend/src/backbone/adapters/anthropic.adapter.ts:126)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (backend/src/backbone/adapters/anthropic.adapter.ts:126)"}, "fullDescription": {"text": "`backend/src/backbone/adapters/anthropic.adapter.ts:126` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-73614bfd02f5b1e2", "name": "Unused endpoint: GET /accounts/:accountId/integrations/definitions", "shortDescription": {"text": "Unused endpoint: GET /accounts/:accountId/integrations/definitions"}, "fullDescription": {"text": "`backend/src/integrations/integrations.controller.ts` declares `GET /accounts/:accountId/integrations/definitions` 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-4fa0b00e0bb90208", "name": "Unused endpoint: GET /accounts/:accountId/integrations/definitions/:defId", "shortDescription": {"text": "Unused endpoint: GET /accounts/:accountId/integrations/definitions/:defId"}, "fullDescription": {"text": "`backend/src/integrations/integrations.controller.ts` declares `GET /accounts/:accountId/integrations/definitions/:defId` 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-64f96d65c579cc32", "name": "Unused endpoint: POST /accounts/:accountId/integrations/definitions", "shortDescription": {"text": "Unused endpoint: POST /accounts/:accountId/integrations/definitions"}, "fullDescription": {"text": "`backend/src/integrations/integrations.controller.ts` declares `POST /accounts/:accountId/integrations/definitions` 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-50fccd8a48446f9f", "name": "Unused endpoint: PATCH /accounts/:accountId/integrations/definitions/:defId", "shortDescription": {"text": "Unused endpoint: PATCH /accounts/:accountId/integrations/definitions/:defId"}, "fullDescription": {"text": "`backend/src/integrations/integrations.controller.ts` declares `PATCH /accounts/:accountId/integrations/definitions/:defId` 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-3b244a88e4363a67", "name": "Unused endpoint: DELETE /accounts/:accountId/integrations/definitions/:defId", "shortDescription": {"text": "Unused endpoint: DELETE /accounts/:accountId/integrations/definitions/:defId"}, "fullDescription": {"text": "`backend/src/integrations/integrations.controller.ts` declares `DELETE /accounts/:accountId/integrations/definitions/:defId` 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-f1eb85e10c37b967", "name": "Unused endpoint: GET /accounts/:accountId/integrations/connections", "shortDescription": {"text": "Unused endpoint: GET /accounts/:accountId/integrations/connections"}, "fullDescription": {"text": "`backend/src/integrations/integrations.controller.ts` declares `GET /accounts/:accountId/integrations/connections` 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-6555a5d68cdcd191", "name": "Unused endpoint: GET /accounts/:accountId/integrations/connections/:connId", "shortDescription": {"text": "Unused endpoint: GET /accounts/:accountId/integrations/connections/:connId"}, "fullDescription": {"text": "`backend/src/integrations/integrations.controller.ts` declares `GET /accounts/:accountId/integrations/connections/:connId` 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-75ae8028971753eb", "name": "Unused endpoint: POST /accounts/:accountId/integrations/connections", "shortDescription": {"text": "Unused endpoint: POST /accounts/:accountId/integrations/connections"}, "fullDescription": {"text": "`backend/src/integrations/integrations.controller.ts` declares `POST /accounts/:accountId/integrations/connections` 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-b7607aabe25cbee8", "name": "Unused endpoint: PATCH /accounts/:accountId/integrations/connections/:connId", "shortDescription": {"text": "Unused endpoint: PATCH /accounts/:accountId/integrations/connections/:connId"}, "fullDescription": {"text": "`backend/src/integrations/integrations.controller.ts` declares `PATCH /accounts/:accountId/integrations/connections/:connId` 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-6b164b80baeb819e", "name": "Unused endpoint: DELETE /accounts/:accountId/integrations/connections/:connId", "shortDescription": {"text": "Unused endpoint: DELETE /accounts/:accountId/integrations/connections/:connId"}, "fullDescription": {"text": "`backend/src/integrations/integrations.controller.ts` declares `DELETE /accounts/:accountId/integrations/connections/:connId` 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-78c76a976d3c6ed1", "name": "Unused endpoint: POST /accounts/:accountId/integrations/connections/:connId/toggle", "shortDescription": {"text": "Unused endpoint: POST /accounts/:accountId/integrations/connections/:connId/toggle"}, "fullDescription": {"text": "`backend/src/integrations/integrations.controller.ts` declares `POST /accounts/:accountId/integrations/connections/:connId/toggle` 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-9c6760f2c6989274", "name": "Unused endpoint: POST /accounts/:accountId/integrations/connections/:connId/health-check", "shortDescription": {"text": "Unused endpoint: POST /accounts/:accountId/integrations/connections/:connId/health-check"}, "fullDescription": {"text": "`backend/src/integrations/integrations.controller.ts` declares `POST /accounts/:accountId/integrations/connections/:connId/health-check` 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-0846bb79b0957669", "name": "Unused endpoint: DELETE /accounts/:accountId/integrations/:refId", "shortDescription": {"text": "Unused endpoint: DELETE /accounts/:accountId/integrations/:refId"}, "fullDescription": {"text": "`backend/src/integrations/integrations.controller.ts` declares `DELETE /accounts/:accountId/integrations/:refId` 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-209515dbe22658a4", "name": "Unused endpoint: GET /accounts/:accountId/integrations/oauth/:defId/authorize", "shortDescription": {"text": "Unused endpoint: GET /accounts/:accountId/integrations/oauth/:defId/authorize"}, "fullDescription": {"text": "`backend/src/integrations/oauth/oauth.controller.ts` declares `GET /accounts/:accountId/integrations/oauth/:defId/authorize` 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-a59166e005f5aadf", "name": "Unused endpoint: GET /integrations/oauth/callback", "shortDescription": {"text": "Unused endpoint: GET /integrations/oauth/callback"}, "fullDescription": {"text": "`backend/src/integrations/oauth/oauth.controller.ts` declares `GET /integrations/oauth/callback` 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-766d75be9e5d4415", "name": "Unused endpoint: GET /accounts/:accountId/syncs/:id", "shortDescription": {"text": "Unused endpoint: GET /accounts/:accountId/syncs/:id"}, "fullDescription": {"text": "`backend/src/syncs/syncs.controller.ts` declares `GET /accounts/:accountId/syncs/: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-8e60e418cb275fee", "name": "Unused endpoint: GET /accounts/:accountId/syncs/:id/runs", "shortDescription": {"text": "Unused endpoint: GET /accounts/:accountId/syncs/:id/runs"}, "fullDescription": {"text": "`backend/src/syncs/syncs.controller.ts` declares `GET /accounts/:accountId/syncs/:id/runs` 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-27c58a6838645efd", "name": "Unused endpoint: GET /accounts/:accountId/syncs/:id/skills", "shortDescription": {"text": "Unused endpoint: GET /accounts/:accountId/syncs/:id/skills"}, "fullDescription": {"text": "`backend/src/syncs/syncs.controller.ts` declares `GET /accounts/:accountId/syncs/:id/skills` 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-db2b5253386bd34f", "name": "Unused endpoint: PATCH /accounts/:accountId/syncs/:id", "shortDescription": {"text": "Unused endpoint: PATCH /accounts/:accountId/syncs/:id"}, "fullDescription": {"text": "`backend/src/syncs/syncs.controller.ts` declares `PATCH /accounts/:accountId/syncs/: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-01718db10e667759", "name": "Unused endpoint: DELETE /accounts/:accountId/syncs/:id", "shortDescription": {"text": "Unused endpoint: DELETE /accounts/:accountId/syncs/:id"}, "fullDescription": {"text": "`backend/src/syncs/syncs.controller.ts` declares `DELETE /accounts/:accountId/syncs/: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-b4b905af82c47b14", "name": "Unused endpoint: POST /accounts/:accountId/syncs/:id/run", "shortDescription": {"text": "Unused endpoint: POST /accounts/:accountId/syncs/:id/run"}, "fullDescription": {"text": "`backend/src/syncs/syncs.controller.ts` declares `POST /accounts/:accountId/syncs/:id/run` 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-3bb3ff08475b5e3e", "name": "Unused endpoint: GET /admin/users/:id", "shortDescription": {"text": "Unused endpoint: GET /admin/users/:id"}, "fullDescription": {"text": "`backend/src/users/admin-users.controller.ts` declares `GET /admin/users/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f2d6e145d2d95edc", "name": "Unused endpoint: PUT /admin/users/:id/role", "shortDescription": {"text": "Unused endpoint: PUT /admin/users/:id/role"}, "fullDescription": {"text": "`backend/src/users/admin-users.controller.ts` declares `PUT /admin/users/:id/role` 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-760aab83e3537bb1", "name": "Unused endpoint: PUT /admin/users/:id/status", "shortDescription": {"text": "Unused endpoint: PUT /admin/users/:id/status"}, "fullDescription": {"text": "`backend/src/users/admin-users.controller.ts` declares `PUT /admin/users/:id/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4f864f796ee568fb", "name": "Unused endpoint: DELETE /admin/users/:id", "shortDescription": {"text": "Unused endpoint: DELETE /admin/users/:id"}, "fullDescription": {"text": "`backend/src/users/admin-users.controller.ts` declares `DELETE /admin/users/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a8b657222dd85be2", "name": "Unused endpoint: GET /users/me", "shortDescription": {"text": "Unused endpoint: GET /users/me"}, "fullDescription": {"text": "`backend/src/users/users.controller.ts` declares `GET /users/me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd337b48ce3494de", "name": "Unused endpoint: GET /users/me/preferences", "shortDescription": {"text": "Unused endpoint: GET /users/me/preferences"}, "fullDescription": {"text": "`backend/src/users/users.controller.ts` declares `GET /users/me/preferences` 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-46d5497ceb6ca0d9", "name": "Unused endpoint: PATCH /users/me/preferences", "shortDescription": {"text": "Unused endpoint: PATCH /users/me/preferences"}, "fullDescription": {"text": "`backend/src/users/users.controller.ts` declares `PATCH /users/me/preferences` 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-752d3df931cacfb0", "name": "Unused endpoint: POST /accounts/:accountId/sync/sources/:sourceId", "shortDescription": {"text": "Unused endpoint: POST /accounts/:accountId/sync/sources/:sourceId"}, "fullDescription": {"text": "`backend/src/sync/sync.controller.ts` declares `POST /accounts/:accountId/sync/sources/:sourceId` 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-8945f5b85a9770b9", "name": "Unused endpoint: GET /accounts/:accountId/sync/status", "shortDescription": {"text": "Unused endpoint: GET /accounts/:accountId/sync/status"}, "fullDescription": {"text": "`backend/src/sync/sync.controller.ts` declares `GET /accounts/:accountId/sync/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-73e3f7726dc9e315", "name": "Unused endpoint: GET /accounts/:accountId/orchestrations/:oid", "shortDescription": {"text": "Unused endpoint: GET /accounts/:accountId/orchestrations/:oid"}, "fullDescription": {"text": "`backend/src/orchestration/orchestration.controller.ts` declares `GET /accounts/:accountId/orchestrations/:oid` 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-773b68a1763ba988", "name": "Unused endpoint: POST /accounts/:accountId/orchestrations/:oid/approve", "shortDescription": {"text": "Unused endpoint: POST /accounts/:accountId/orchestrations/:oid/approve"}, "fullDescription": {"text": "`backend/src/orchestration/orchestration.controller.ts` declares `POST /accounts/:accountId/orchestrations/:oid/approve` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fc13e50c3ef8c3ff", "name": "Unused endpoint: POST /accounts/:accountId/orchestrations/:oid/reject", "shortDescription": {"text": "Unused endpoint: POST /accounts/:accountId/orchestrations/:oid/reject"}, "fullDescription": {"text": "`backend/src/orchestration/orchestration.controller.ts` declares `POST /accounts/:accountId/orchestrations/:oid/reject` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8fdbacfe9430a6ed", "name": "Unused endpoint: POST /auth/login", "shortDescription": {"text": "Unused endpoint: POST /auth/login"}, "fullDescription": {"text": "`backend/src/auth/auth.controller.ts` declares `POST /auth/login` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4a12d5ed34c864c6", "name": "Unused endpoint: POST /auth/signup", "shortDescription": {"text": "Unused endpoint: POST /auth/signup"}, "fullDescription": {"text": "`backend/src/auth/auth.controller.ts` declares `POST /auth/signup` 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-b36892106ecdc9aa", "name": "Unused endpoint: POST /auth/refresh", "shortDescription": {"text": "Unused endpoint: POST /auth/refresh"}, "fullDescription": {"text": "`backend/src/auth/auth.controller.ts` declares `POST /auth/refresh` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c059f57186114027", "name": "Unused endpoint: POST /auth/logout", "shortDescription": {"text": "Unused endpoint: POST /auth/logout"}, "fullDescription": {"text": "`backend/src/auth/auth.controller.ts` declares `POST /auth/logout` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ac42422b23e45104", "name": "Unused endpoint: GET /auth/me", "shortDescription": {"text": "Unused endpoint: GET /auth/me"}, "fullDescription": {"text": "`backend/src/auth/auth.controller.ts` declares `GET /auth/me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e2fe5b92648ca462", "name": "Unused endpoint: POST /auth/forgot-password", "shortDescription": {"text": "Unused endpoint: POST /auth/forgot-password"}, "fullDescription": {"text": "`backend/src/auth/auth.controller.ts` declares `POST /auth/forgot-password` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-deb8df763a50c73a", "name": "Unused endpoint: POST /auth/reset-password", "shortDescription": {"text": "Unused endpoint: POST /auth/reset-password"}, "fullDescription": {"text": "`backend/src/auth/auth.controller.ts` declares `POST /auth/reset-password` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5e6138f2554741cd", "name": "Unused endpoint: POST /auth/update-password", "shortDescription": {"text": "Unused endpoint: POST /auth/update-password"}, "fullDescription": {"text": "`backend/src/auth/auth.controller.ts` declares `POST /auth/update-password` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aff09493cb3ba0ea", "name": "Unused endpoint: DELETE /accounts/:accountId/api-keys/:keyId", "shortDescription": {"text": "Unused endpoint: DELETE /accounts/:accountId/api-keys/:keyId"}, "fullDescription": {"text": "`backend/src/auth/api-keys/api-keys.controller.ts` declares `DELETE /accounts/:accountId/api-keys/:keyId` 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-4c57e1860b4fad98", "name": "Unused endpoint: GET /accounts/:accountId/board-routing/routes", "shortDescription": {"text": "Unused endpoint: GET /accounts/:accountId/board-routing/routes"}, "fullDescription": {"text": "`backend/src/board-routing/board-routing.controller.ts` declares `GET /accounts/:accountId/board-routing/routes` 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-0283bb343ed503d8", "name": "Unused endpoint: POST /accounts/:accountId/board-routing/routes", "shortDescription": {"text": "Unused endpoint: POST /accounts/:accountId/board-routing/routes"}, "fullDescription": {"text": "`backend/src/board-routing/board-routing.controller.ts` declares `POST /accounts/:accountId/board-routing/routes` 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-159c637f234d6a1e", "name": "Unused endpoint: GET /accounts/:accountId/board-routing/routes/:routeId", "shortDescription": {"text": "Unused endpoint: GET /accounts/:accountId/board-routing/routes/:routeId"}, "fullDescription": {"text": "`backend/src/board-routing/board-routing.controller.ts` declares `GET /accounts/:accountId/board-routing/routes/:routeId` 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-3572195ff01ef467", "name": "Unused endpoint: PATCH /accounts/:accountId/board-routing/routes/:routeId", "shortDescription": {"text": "Unused endpoint: PATCH /accounts/:accountId/board-routing/routes/:routeId"}, "fullDescription": {"text": "`backend/src/board-routing/board-routing.controller.ts` declares `PATCH /accounts/:accountId/board-routing/routes/:routeId` 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-b7fd4c97f210c1f5", "name": "Unused endpoint: DELETE /accounts/:accountId/board-routing/routes/:routeId", "shortDescription": {"text": "Unused endpoint: DELETE /accounts/:accountId/board-routing/routes/:routeId"}, "fullDescription": {"text": "`backend/src/board-routing/board-routing.controller.ts` declares `DELETE /accounts/:accountId/board-routing/routes/:routeId` 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-decfe6bea8a759f6", "name": "Unused endpoint: POST /accounts/:accountId/board-routing/decompose-goal", "shortDescription": {"text": "Unused endpoint: POST /accounts/:accountId/board-routing/decompose-goal"}, "fullDescription": {"text": "`backend/src/board-routing/board-routing.controller.ts` declares `POST /accounts/:accountId/board-routing/decompose-goal` 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-f41c970c59645ddb", "name": "Unused endpoint: GET /accounts/:accountId/board-routing/dags", "shortDescription": {"text": "Unused endpoint: GET /accounts/:accountId/board-routing/dags"}, "fullDescription": {"text": "`backend/src/board-routing/board-routing.controller.ts` declares `GET /accounts/:accountId/board-routing/dags` 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-e24e82a07b497bb3", "name": "Unused endpoint: GET /accounts/:accountId/board-routing/dags/:dagId", "shortDescription": {"text": "Unused endpoint: GET /accounts/:accountId/board-routing/dags/:dagId"}, "fullDescription": {"text": "`backend/src/board-routing/board-routing.controller.ts` declares `GET /accounts/:accountId/board-routing/dags/:dagId` 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/20857"}, "properties": {"repository": "taskclaw/taskclaw", "repoUrl": "https://github.com/taskclaw/taskclaw", "branch": "main"}, "results": [{"ruleId": "scanner-eda52e9a870185b8", "level": "note", "message": {"text": "Possibly dead Python function: calculate_aso_score"}, "properties": {"repobilityId": "85d6e02c096243ce", "scanner": "scanner-primary", "fingerprint": "eda52e9a870185b8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/scripts/aso_scorer.py:458"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-55cbf2237995c722", "level": "note", "message": {"text": "Possibly dead Python function: identify_gaps"}, "properties": {"repobilityId": "207696744a2f60ae", "scanner": "scanner-primary", "fingerprint": "55cbf2237995c722", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/scripts/competitor_analyzer.py:125"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4684a87130ab21e6", "level": "note", "message": {"text": "Possibly dead Python function: analyze_competitor_set"}, "properties": {"repobilityId": "37e536ccd0c4be14", "scanner": "scanner-primary", "fingerprint": "4684a87130ab21e6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/scripts/competitor_analyzer.py:560"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-46aa0f783d94e9d4", "level": "note", "message": {"text": "Possibly dead Python function: translate_metadata"}, "properties": {"repobilityId": "0c0e09315e247a93", "scanner": "scanner-primary", "fingerprint": "46aa0f783d94e9d4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/scripts/localization_helper.py:118"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e8079cbf54bbc3ad", "level": "note", "message": {"text": "Possibly dead Python function: adapt_keywords"}, "properties": {"repobilityId": "0c828a3147649159", "scanner": "scanner-primary", "fingerprint": "e8079cbf54bbc3ad", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/scripts/localization_helper.py:191"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8bbc80dc298011ef", "level": "note", "message": {"text": "Possibly dead Python function: validate_translations"}, "properties": {"repobilityId": "394a8ec4bddfc2b2", "scanner": "scanner-primary", "fingerprint": "8bbc80dc298011ef", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/scripts/localization_helper.py:242"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4930ad618b468f33", "level": "note", "message": {"text": "Possibly dead Python function: plan_localization_strategy"}, "properties": {"repobilityId": "e50adbb5ff031b7c", "scanner": "scanner-primary", "fingerprint": "4930ad618b468f33", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/scripts/localization_helper.py:550"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cd452367584dcfe8", "level": "note", "message": {"text": "Possibly dead Python function: track_sentiment_trends"}, "properties": {"repobilityId": "3e7ee20d63452953", "scanner": "scanner-primary", "fingerprint": "cd452367584dcfe8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/scripts/review_analyzer.py:293"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-29c43ca8d080aca9", "level": "note", "message": {"text": "Possibly dead Python function: generate_response_templates"}, "properties": {"repobilityId": "ad5793e58b6adaab", "scanner": "scanner-primary", "fingerprint": "29c43ca8d080aca9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/scripts/review_analyzer.py:341"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a9e0cc1f41d7e648", "level": "note", "message": {"text": "Possibly dead Python function: analyze_reviews"}, "properties": {"repobilityId": "a0b6d46ed847aff7", "scanner": "scanner-primary", "fingerprint": "a9e0cc1f41d7e648", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/scripts/review_analyzer.py:693"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-32a6c15706469d3b", "level": "note", "message": {"text": "Possibly dead Python function: validate_app_store_compliance"}, "properties": {"repobilityId": "d1e897c82ddccd46", "scanner": "scanner-primary", "fingerprint": "32a6c15706469d3b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/scripts/launch_checklist.py:65"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0a797e7f89e3c32f", "level": "note", "message": {"text": "Possibly dead Python function: create_update_plan"}, "properties": {"repobilityId": "37068bffdfe83f74", "scanner": "scanner-primary", "fingerprint": "0a797e7f89e3c32f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/scripts/launch_checklist.py:98"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7f0cb2bc2f7847a5", "level": "note", "message": {"text": "Possibly dead Python function: optimize_launch_timing"}, "properties": {"repobilityId": "be4bf4c4f182e884", "scanner": "scanner-primary", "fingerprint": "7f0cb2bc2f7847a5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/scripts/launch_checklist.py:143"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ad7ebd6f9187d42d", "level": "note", "message": {"text": "Possibly dead Python function: plan_seasonal_campaigns"}, "properties": {"repobilityId": "7862b658b03c5631", "scanner": "scanner-primary", "fingerprint": "ad7ebd6f9187d42d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/scripts/launch_checklist.py:187"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ad8c734d3919d708", "level": "note", "message": {"text": "Possibly dead Python function: generate_launch_checklist"}, "properties": {"repobilityId": "7bb7e51676156337", "scanner": "scanner-primary", "fingerprint": "ad8c734d3919d708", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/scripts/launch_checklist.py:722"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c1df182910652d50", "level": "note", "message": {"text": "Possibly dead Python function: validate_character_limits"}, "properties": {"repobilityId": "1e3a9c3374460bad", "scanner": "scanner-primary", "fingerprint": "c1df182910652d50", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/scripts/metadata_optimizer.py:229"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-393573300e8bc506", "level": "note", "message": {"text": "Possibly dead Python function: optimize_app_metadata"}, "properties": {"repobilityId": "d30e511973762e45", "scanner": "scanner-primary", "fingerprint": "393573300e8bc506", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/scripts/metadata_optimizer.py:549"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7a1ad050a907310a", "level": "note", "message": {"text": "Possibly dead Python function: find_long_tail_opportunities"}, "properties": {"repobilityId": "a60f9099047007aa", "scanner": "scanner-primary", "fingerprint": "7a1ad050a907310a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/scripts/keyword_analyzer.py:144"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-660421b61fee8c62", "level": "note", "message": {"text": "Possibly dead Python function: extract_keywords_from_text"}, "properties": {"repobilityId": "1420fcaa3377ade6", "scanner": "scanner-primary", "fingerprint": "660421b61fee8c62", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/scripts/keyword_analyzer.py:194"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-78c578f69a52e4f6", "level": "note", "message": {"text": "Possibly dead Python function: analyze_keyword_set"}, "properties": {"repobilityId": "448fbb1970ad2ba7", "scanner": "scanner-primary", "fingerprint": "78c578f69a52e4f6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/scripts/keyword_analyzer.py:395"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8d22b0aec0d12dba", "level": "note", "message": {"text": "Possibly dead Python function: analyze_all"}, "properties": {"repobilityId": "2a44b4f2db8f6a8d", "scanner": "scanner-primary", "fingerprint": "8d22b0aec0d12dba", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/social-media-analyzer/scripts/calculate_metrics.py:141"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8ca7e522b169df07", "level": "note", "message": {"text": "Possibly dead Python function: generate_insights"}, "properties": {"repobilityId": "153af8ff8b1d4fa8", "scanner": "scanner-primary", "fingerprint": "8ca7e522b169df07", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/social-media-analyzer/scripts/analyze_performance.py:122"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5db95286a3f421ce", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/test-supabase.js:34"}, "properties": {"repobilityId": "4122b8624b360c8e", "scanner": "scanner-primary", "fingerprint": "5db95286a3f421ce", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-103a5db3e408c95e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/nav-projects.tsx:91"}, "properties": {"repobilityId": "761970b6322a1769", "scanner": "scanner-primary", "fingerprint": "103a5db3e408c95e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-009016965278e1f7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/team-switcher.tsx:75"}, "properties": {"repobilityId": "719c0aad1fd4824c", "scanner": "scanner-primary", "fingerprint": "009016965278e1f7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4a045637df48a24c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/nav-boards.tsx:215"}, "properties": {"repobilityId": "c5e168d4150006ba", "scanner": "scanner-primary", "fingerprint": "4a045637df48a24c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-56e91940fcfb8447", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/admin-sidebar.tsx:88"}, "properties": {"repobilityId": "77860aaa3ebc893a", "scanner": "scanner-primary", "fingerprint": "56e91940fcfb8447", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b34d79d010c5fdf8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/brand-logo.tsx:113"}, "properties": {"repobilityId": "1344f730de0f0ea6", "scanner": "scanner-primary", "fingerprint": "b34d79d010c5fdf8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec34de5461504d51", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/nav-user.tsx:76"}, "properties": {"repobilityId": "ca6fc07344c8c90a", "scanner": "scanner-primary", "fingerprint": "ec34de5461504d51", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3b0345a77326a2a6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/integrations/integration-catalog.tsx:198"}, "properties": {"repobilityId": "6e896ab18170978d", "scanner": "scanner-primary", "fingerprint": "3b0345a77326a2a6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-08d6375432ae27de", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/integrations/integration-test-chat.tsx:262"}, "properties": {"repobilityId": "35c951b382d112a8", "scanner": "scanner-primary", "fingerprint": "08d6375432ae27de", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-21fe97f3ad544bef", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/integrations/integration-connection-card.tsx:98"}, "properties": {"repobilityId": "5806c9868beb9122", "scanner": "scanner-primary", "fingerprint": "21fe97f3ad544bef", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cf37409c5f7c4ebc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/orchestration/pod-context-sidebar.tsx:71"}, "properties": {"repobilityId": "e7e6b66de64b0470", "scanner": "scanner-primary", "fingerprint": "cf37409c5f7c4ebc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f12e2e5e056a6406", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/pods/pod-card.tsx:58"}, "properties": {"repobilityId": "7fb94a3a45d5eb46", "scanner": "scanner-primary", "fingerprint": "f12e2e5e056a6406", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5cbb0285a3306dfe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/pods/execution-history-panel.tsx:43"}, "properties": {"repobilityId": "e877b30c0616832f", "scanner": "scanner-primary", "fingerprint": "5cbb0285a3306dfe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1f57a142888f30b4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/pods/assign-boards-dialog.tsx:146"}, "properties": {"repobilityId": "b1c6ec20b6c07a35", "scanner": "scanner-primary", "fingerprint": "1f57a142888f30b4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9e4fe4a8fcdf7c02", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/pods/route-editor-sheet.tsx:103"}, "properties": {"repobilityId": "b009026fcae01360", "scanner": "scanner-primary", "fingerprint": "9e4fe4a8fcdf7c02", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-65d3e5ec02b9c355", "level": "note", "message": {"text": "React Flow <MiniMap> without dark background \u2014 frontend/src/components/pods/pod-board-canvas.tsx:388"}, "properties": {"repobilityId": "58213bb6d61ead0f", "scanner": "scanner-primary", "fingerprint": "65d3e5ec02b9c355", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.minimap.no-bg"]}}, {"ruleId": "scanner-9f647760b6598a42", "level": "note", "message": {"text": "React Flow <Controls> without dark theming \u2014 frontend/src/components/pods/pod-board-canvas.tsx:387"}, "properties": {"repobilityId": "64322be0e45895d7", "scanner": "scanner-primary", "fingerprint": "9f647760b6598a42", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.controls.no-bg"]}}, {"ruleId": "scanner-d7e4ac1ab29675f1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/pods/pod-board-canvas.tsx:74"}, "properties": {"repobilityId": "bfe3e0a3990bfecc", "scanner": "scanner-primary", "fingerprint": "d7e4ac1ab29675f1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-096cacc2c695fa8d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/chat/entity-cards.tsx:67"}, "properties": {"repobilityId": "0f937066aa4011d6", "scanner": "scanner-primary", "fingerprint": "096cacc2c695fa8d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a77d7360bf42a821", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/chat/slash-palette.tsx:380"}, "properties": {"repobilityId": "37e02b1898e908e2", "scanner": "scanner-primary", "fingerprint": "a77d7360bf42a821", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bf78f9414ccafb01", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/theme/GlobalThemeInjector.tsx:43"}, "properties": {"repobilityId": "c5e6c7cff9d116ce", "scanner": "scanner-primary", "fingerprint": "bf78f9414ccafb01", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6994dcdd9c61f6e1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/tasks/category-list.tsx:80"}, "properties": {"repobilityId": "40f032b86010da6e", "scanner": "scanner-primary", "fingerprint": "6994dcdd9c61f6e1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-991cec216c645629", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/components/tasks/task-ai-chat.tsx:123"}, "properties": {"repobilityId": "2978ceba5dccb211", "scanner": "scanner-primary", "fingerprint": "991cec216c645629", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-16014b6d3d0e9079", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/tasks/task-ai-chat.tsx:382"}, "properties": {"repobilityId": "07b60cf241341f11", "scanner": "scanner-primary", "fingerprint": "16014b6d3d0e9079", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6ffa34d31250a85c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/components/marketing/CustomerValidatorModal.tsx:269"}, "properties": {"repobilityId": "548a40f0cbca30dc", "scanner": "scanner-primary", "fingerprint": "6ffa34d31250a85c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a5b6d1d65ade256c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/backbones/backbone-connection-card.tsx:64"}, "properties": {"repobilityId": "bb54f1b2ac837f7e", "scanner": "scanner-primary", "fingerprint": "a5b6d1d65ade256c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7389e3d91b048023", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/boards/board-card.tsx:85"}, "properties": {"repobilityId": "beae3688f4598432", "scanner": "scanner-primary", "fingerprint": "7389e3d91b048023", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8b097703549cb2f9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/boards/board-ai-chat.tsx:516"}, "properties": {"repobilityId": "096c36ca432a523d", "scanner": "scanner-primary", "fingerprint": "8b097703549cb2f9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4118fcb87c343639", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/boards/board-ai-chat.tsx:498"}, "properties": {"repobilityId": "bc87a3b31c0805bf", "scanner": "scanner-primary", "fingerprint": "4118fcb87c343639", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-51188a11f5a7e63f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/boards/step-config-drawer.tsx:169"}, "properties": {"repobilityId": "0d69afb6a06fc75f", "scanner": "scanner-primary", "fingerprint": "51188a11f5a7e63f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1cf3bd5ab223c2a0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/boards/step-editor.tsx:210"}, "properties": {"repobilityId": "d30ed19275dd7960", "scanner": "scanner-primary", "fingerprint": "1cf3bd5ab223c2a0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7c617284f333d85e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/boards/create-board-dialog.tsx:99"}, "properties": {"repobilityId": "0b9e98d8147ab3aa", "scanner": "scanner-primary", "fingerprint": "7c617284f333d85e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-15c02ecb507d511e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/boards/board-kanban-column.tsx:86"}, "properties": {"repobilityId": "737fab6c02c0876e", "scanner": "scanner-primary", "fingerprint": "15c02ecb507d511e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fafa87fa019e495b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/layout.tsx:177"}, "properties": {"repobilityId": "62009cc81f939b61", "scanner": "scanner-primary", "fingerprint": "fafa87fa019e495b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-264b4c3089147833", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/settings/integrations/page.tsx:705"}, "properties": {"repobilityId": "a4230180e0853d02", "scanner": "scanner-primary", "fingerprint": "264b4c3089147833", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e8090e0d2cff35a8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/settings/syncs/page.tsx:472"}, "properties": {"repobilityId": "73f6456a7493a0e1", "scanner": "scanner-primary", "fingerprint": "e8090e0d2cff35a8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1fdceef1497b920f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/settings/usage/page.tsx:236"}, "properties": {"repobilityId": "768e23e7edf7c655", "scanner": "scanner-primary", "fingerprint": "1fdceef1497b920f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a4713ff08feaac8d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/settings/categories/page.tsx:674"}, "properties": {"repobilityId": "d25458afe4fb6ca0", "scanner": "scanner-primary", "fingerprint": "a4713ff08feaac8d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9c993c160b00f49b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/settings/skills/page.tsx:780"}, "properties": {"repobilityId": "cf8e8ca9a930265c", "scanner": "scanner-primary", "fingerprint": "9c993c160b00f49b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e7d47dbd30b79468", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/app/dashboard/settings/skills/page.tsx:543"}, "properties": {"repobilityId": "ecdbfb3bf04fd1a0", "scanner": "scanner-primary", "fingerprint": "e7d47dbd30b79468", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-ea5ec27586914c4d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/settings/webhooks/page.tsx:271"}, "properties": {"repobilityId": "e438eef7ba9fb505", "scanner": "scanner-primary", "fingerprint": "ea5ec27586914c4d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-27c53c09bb74822d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/app/dashboard/chat/actions.ts:22"}, "properties": {"repobilityId": "2f83432a926c30cd", "scanner": "scanner-primary", "fingerprint": "27c53c09bb74822d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-628a31623d30c8cc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/chat/page.tsx:305"}, "properties": {"repobilityId": "3d364b766a2b03a7", "scanner": "scanner-primary", "fingerprint": "628a31623d30c8cc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2630783f3886a517", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/cockpit/page.tsx:535"}, "properties": {"repobilityId": "194b97576938b4c3", "scanner": "scanner-primary", "fingerprint": "2630783f3886a517", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-828e67b96c3743b4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/dashboard/cockpit/page.tsx:1288"}, "properties": {"repobilityId": "2af73ae4ab1336cc", "scanner": "scanner-primary", "fingerprint": "828e67b96c3743b4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-2a0eb0f6d73a5c1e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/agents/page.tsx:47"}, "properties": {"repobilityId": "dc328b53fc7e00de", "scanner": "scanner-primary", "fingerprint": "2a0eb0f6d73a5c1e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a6eb432b77aee15c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/agents/[agentId]/page.tsx:191"}, "properties": {"repobilityId": "f8bca0f1c1bb615d", "scanner": "scanner-primary", "fingerprint": "a6eb432b77aee15c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-626fe9ae437e881c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/inbox/page.tsx:199"}, "properties": {"repobilityId": "e55933f6a842815c", "scanner": "scanner-primary", "fingerprint": "626fe9ae437e881c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-edecda40a2a30344", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/boards/page.tsx:329"}, "properties": {"repobilityId": "0ea2a61e8de51fe8", "scanner": "scanner-primary", "fingerprint": "edecda40a2a30344", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-54c05ae73c8f5da5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/dashboard/knowledge/page.tsx:477"}, "properties": {"repobilityId": "d68f754613ee7745", "scanner": "scanner-primary", "fingerprint": "54c05ae73c8f5da5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ba59fee17bef5764", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/onboarding/components/live-preview.tsx:51"}, "properties": {"repobilityId": "de3843e8092392c7", "scanner": "scanner-primary", "fingerprint": "ba59fee17bef5764", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c080f9d476da8040", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/app/onboarding/components/step-boards.tsx:104"}, "properties": {"repobilityId": "67f59a553edbf56d", "scanner": "scanner-primary", "fingerprint": "c080f9d476da8040", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-18f47ffc2b5a3a25", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/app/(auth)/actions.ts:44"}, "properties": {"repobilityId": "cb3355bc9da08d56", "scanner": "scanner-primary", "fingerprint": "18f47ffc2b5a3a25", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ba0f75f4f7b92a87", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/app/(marketing)/layout.tsx:41"}, "properties": {"repobilityId": "de9f3cb6bec041f8", "scanner": "scanner-primary", "fingerprint": "ba0f75f4f7b92a87", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-2acf8096eefad973", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/lib/i18n/i18n.server.ts:28"}, "properties": {"repobilityId": "b09d9936b983e39a", "scanner": "scanner-primary", "fingerprint": "2acf8096eefad973", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e928c9c50380a122", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/kit/shadcn/data-table.tsx:29"}, "properties": {"repobilityId": "8354fe5e27e3b8a9", "scanner": "scanner-primary", "fingerprint": "e928c9c50380a122", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-9f547a1c7a67a43a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/kit/shadcn/chart.tsx:81"}, "properties": {"repobilityId": "e3c177ec10272c6a", "scanner": "scanner-primary", "fingerprint": "9f547a1c7a67a43a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-064373d11de9a616", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/test-openclaw-ws.ts:59"}, "properties": {"repobilityId": "dbf7cb6e489e9091", "scanner": "scanner-primary", "fingerprint": "064373d11de9a616", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a4429943a2741783", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/auth-e2e-smoke.ts:19"}, "properties": {"repobilityId": "a1669b468ab9c3b3", "scanner": "scanner-primary", "fingerprint": "a4429943a2741783", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4e99bb15d7bc1588", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/db-smoke.ts:17"}, "properties": {"repobilityId": "96f0f059b5b6f2ac", "scanner": "scanner-primary", "fingerprint": "4e99bb15d7bc1588", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8f4e2b98a1125a12", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/setup-supabase.ts:17"}, "properties": {"repobilityId": "113f6ef3f70d3d6f", "scanner": "scanner-primary", "fingerprint": "8f4e2b98a1125a12", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d73681cde1dd2ff9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/categories-pilot-smoke.ts:14"}, "properties": {"repobilityId": "d6b42ff7c64eb22f", "scanner": "scanner-primary", "fingerprint": "d73681cde1dd2ff9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4d22338ffb7ae13d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/sources-pilot-smoke.ts:9"}, "properties": {"repobilityId": "1bda2077ff1a5fbe", "scanner": "scanner-primary", "fingerprint": "4d22338ffb7ae13d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b87f8022cd3cb39a", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 backend/src/adapters/__template__/template.adapter.ts:73"}, "properties": {"repobilityId": "ca2fcd3a19b560a4", "scanner": "scanner-primary", "fingerprint": "b87f8022cd3cb39a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-b81b453abfb8618c", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 backend/src/users/users.service.ts:213"}, "properties": {"repobilityId": "fc61efcc4a1cbee0", "scanner": "scanner-primary", "fingerprint": "b81b453abfb8618c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-74cd62e6dab0225e", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 backend/src/sync/sync.service.ts:388"}, "properties": {"repobilityId": "baddc06b054a7928", "scanner": "scanner-primary", "fingerprint": "74cd62e6dab0225e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-9381ffa729441c00", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/common/utils/encryption.util.ts:33"}, "properties": {"repobilityId": "43ade079d61710b9", "scanner": "scanner-primary", "fingerprint": "9381ffa729441c00", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9b7fc21150332fa4", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 backend/src/teams/teams.service.ts:134"}, "properties": {"repobilityId": "c69937aa25a2bc3a", "scanner": "scanner-primary", "fingerprint": "9b7fc21150332fa4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-693e211828c4d24c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/teams/teams.service.ts:135"}, "properties": {"repobilityId": "67468d8b53946033", "scanner": "scanner-primary", "fingerprint": "693e211828c4d24c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8474b7412127c9a7", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 backend/src/tasks/tasks.service.ts:886"}, "properties": {"repobilityId": "c8c21658bde616ec", "scanner": "scanner-primary", "fingerprint": "8474b7412127c9a7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-2d01ee6ab3ec43ca", "level": "warning", "message": {"text": "Privileged port 10 in use"}, "properties": {"repobilityId": "735372d6b5594915", "scanner": "scanner-primary", "fingerprint": "2d01ee6ab3ec43ca", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docker-compose.quickstart.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-662da348442b75fd", "level": "warning", "message": {"text": "Privileged port 1000 in use"}, "properties": {"repobilityId": "5ac9fc9372cfe169", "scanner": "scanner-primary", "fingerprint": "662da348442b75fd", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docker-compose.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-faa134129e5545ff", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "7260de680956467e", "scanner": "scanner-primary", "fingerprint": "faa134129e5545ff", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-faa134129e5545ff", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "9c18a146f7ad2982", "scanner": "scanner-primary", "fingerprint": "faa134129e5545ff", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/Dockerfile"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-3d2a6283f9ebab24", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "33f7e95457155e2e", "scanner": "scanner-primary", "fingerprint": "3d2a6283f9ebab24", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-3d2a6283f9ebab24", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "986dfe295fe30af6", "scanner": "scanner-primary", "fingerprint": "3d2a6283f9ebab24", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/Dockerfile"}, "region": {"startLine": 13}}}]}, {"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-60405a1b4230f915", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/integrations/integration-test-chat.tsx:262"}, "properties": {"repobilityId": "f78f58e06e57e750", "scanner": "scanner-primary", "fingerprint": "60405a1b4230f915", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/integrations/integration-test-chat.tsx"}, "region": {"startLine": 262}}}]}, {"ruleId": "scanner-140d706621039c61", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/theme/GlobalThemeInjector.tsx:43"}, "properties": {"repobilityId": "20e57e80d0764a8b", "scanner": "scanner-primary", "fingerprint": "140d706621039c61", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/theme/GlobalThemeInjector.tsx"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-0b58214596692a8f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/tasks/task-ai-chat.tsx:382"}, "properties": {"repobilityId": "a6da8ac871d98539", "scanner": "scanner-primary", "fingerprint": "0b58214596692a8f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/tasks/task-ai-chat.tsx"}, "region": {"startLine": 382}}}]}, {"ruleId": "scanner-5fce2f095cb36e9f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/boards/board-ai-chat.tsx:498"}, "properties": {"repobilityId": "6420637e7a52d1e2", "scanner": "scanner-primary", "fingerprint": "5fce2f095cb36e9f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/boards/board-ai-chat.tsx"}, "region": {"startLine": 498}}}]}, {"ruleId": "scanner-a748313f8823275b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/layout.tsx:177"}, "properties": {"repobilityId": "fe5cbdb460d93202", "scanner": "scanner-primary", "fingerprint": "a748313f8823275b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/layout.tsx"}, "region": {"startLine": 177}}}]}, {"ruleId": "scanner-df18bf56d51618d4", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/dashboard/cockpit/page.tsx:1288"}, "properties": {"repobilityId": "0f5c4a5e433cb51f", "scanner": "scanner-primary", "fingerprint": "df18bf56d51618d4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/dashboard/cockpit/page.tsx"}, "region": {"startLine": 1288}}}]}, {"ruleId": "scanner-8b9647c9372b8a94", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/app/(marketing)/layout.tsx:41"}, "properties": {"repobilityId": "b473f350ff900217", "scanner": "scanner-primary", "fingerprint": "8b9647c9372b8a94", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/app/(marketing)/layout.tsx"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-b92df745a4bdcce2", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/kit/shadcn/chart.tsx:81"}, "properties": {"repobilityId": "2ee2f7119d807bb1", "scanner": "scanner-primary", "fingerprint": "b92df745a4bdcce2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/kit/shadcn/chart.tsx"}, "region": {"startLine": 81}}}]}, {"ruleId": "scanner-54affae81111d90e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/architecture-visual.html:659"}, "properties": {"repobilityId": "afdc8d8b89d803ab", "scanner": "scanner-primary", "fingerprint": "54affae81111d90e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/architecture-visual.html"}, "region": {"startLine": 659}}}]}, {"ruleId": "scanner-b85297733f6271a3", "level": "error", "message": {"text": "Possible secret in scripts/install.sh"}, "properties": {"repobilityId": "42571046bbc55875", "scanner": "scanner-primary", "fingerprint": "b85297733f6271a3", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/install.sh"}, "region": {"startLine": 429}}}]}, {"ruleId": "scanner-b85297733f6271a3", "level": "error", "message": {"text": "Possible secret in scripts/install.sh"}, "properties": {"repobilityId": "42571046bbc55875", "scanner": "scanner-primary", "fingerprint": "b85297733f6271a3", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/install.sh"}, "region": {"startLine": 430}}}]}, {"ruleId": "scanner-b85297733f6271a3", "level": "error", "message": {"text": "Possible secret in scripts/install.sh"}, "properties": {"repobilityId": "42571046bbc55875", "scanner": "scanner-primary", "fingerprint": "b85297733f6271a3", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/install.sh"}, "region": {"startLine": 488}}}]}, {"ruleId": "scanner-746a564cf1082f6a", "level": "error", "message": {"text": "Possible secret in backend/scripts/auth-e2e-smoke.ts"}, "properties": {"repobilityId": "655004168f7722ba", "scanner": "scanner-primary", "fingerprint": "746a564cf1082f6a", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/scripts/auth-e2e-smoke.ts"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-746a564cf1082f6a", "level": "error", "message": {"text": "Possible secret in backend/scripts/auth-e2e-smoke.ts"}, "properties": {"repobilityId": "655004168f7722ba", "scanner": "scanner-primary", "fingerprint": "746a564cf1082f6a", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/scripts/auth-e2e-smoke.ts"}, "region": {"startLine": 51}}}]}, {"ruleId": "scanner-746a564cf1082f6a", "level": "error", "message": {"text": "Possible secret in backend/scripts/auth-e2e-smoke.ts"}, "properties": {"repobilityId": "655004168f7722ba", "scanner": "scanner-primary", "fingerprint": "746a564cf1082f6a", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/scripts/auth-e2e-smoke.ts"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-f5d42ecc92bc4f6a", "level": "error", "message": {"text": "Possible secret in backend/src/auth/auth.service.spec.ts"}, "properties": {"repobilityId": "0b88f7b635dc10a1", "scanner": "scanner-primary", "fingerprint": "f5d42ecc92bc4f6a", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/auth/auth.service.spec.ts"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-f5d42ecc92bc4f6a", "level": "error", "message": {"text": "Possible secret in backend/src/auth/auth.service.spec.ts"}, "properties": {"repobilityId": "0b88f7b635dc10a1", "scanner": "scanner-primary", "fingerprint": "f5d42ecc92bc4f6a", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/auth/auth.service.spec.ts"}, "region": {"startLine": 108}}}]}, {"ruleId": "scanner-f5d42ecc92bc4f6a", "level": "error", "message": {"text": "Possible secret in backend/src/auth/auth.service.spec.ts"}, "properties": {"repobilityId": "0b88f7b635dc10a1", "scanner": "scanner-primary", "fingerprint": "f5d42ecc92bc4f6a", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/auth/auth.service.spec.ts"}, "region": {"startLine": 122}}}]}, {"ruleId": "scanner-263e2921993f686e", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in backend/src/backbone/adapters/claude-code.adapter.ts:2"}, "properties": {"repobilityId": "ce83ce1541d992e0", "scanner": "scanner-primary", "fingerprint": "263e2921993f686e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/backbone/adapters/claude-code.adapter.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "83a185deafa37ffa", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "92a252f237fefd54", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f15c8ff6e3d0ad07", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9865da7d2b2ff924", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "81e5f06397892af9", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "83a185deafa37ffa", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "92a252f237fefd54", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 73}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f15c8ff6e3d0ad07", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 76}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9865da7d2b2ff924", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 79}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "81e5f06397892af9", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f374df6786b44274", "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": 17}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae16880318b99912", "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": 37}}}]}, {"ruleId": "scanner-7f1e4527e6fecffa", "level": "error", "message": {"text": "GitHub Action tracks a moving branch"}, "properties": {"repobilityId": "79f530504d33d638", "scanner": "scanner-primary", "fingerprint": "7f1e4527e6fecffa", "layer": "cicd", "severity": "high", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae16880318b99912", "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": 55}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "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": 58}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae16880318b99912", "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": 86}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "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": 89}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2644034c718fb80d", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c71c4053464cd39c", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "15b01c1e36e9f12b", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ded411e384bd630b", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ded411e384bd630b", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f0dc584a111ffc00", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 59}}}]}, {"ruleId": "scanner-1838a141491ce38c", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "b8fd4f5048f96576", "scanner": "scanner-primary", "fingerprint": "1838a141491ce38c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8432a85471867659", "level": "note", "message": {"text": "Very large file: frontend/src/components/tasks/task-detail-panel.tsx (869 lines)"}, "properties": {"repobilityId": "f60e1374dd923185", "scanner": "scanner-primary", "fingerprint": "8432a85471867659", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-93c61688d6f303f3", "level": "note", "message": {"text": "Very large file: frontend/src/app/dashboard/settings/categories/page.tsx (1682 lines)"}, "properties": {"repobilityId": "bd85a955f69bd5f1", "scanner": "scanner-primary", "fingerprint": "93c61688d6f303f3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-512a9cb30e703177", "level": "note", "message": {"text": "Very large file: frontend/src/app/dashboard/cockpit/page.tsx (1861 lines)"}, "properties": {"repobilityId": "2b5bbf0b68580e1a", "scanner": "scanner-primary", "fingerprint": "512a9cb30e703177", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-75ce5d4895ffd6a1", "level": "note", "message": {"text": "Very large file: backend/src/conversations/conversations.service.ts (3182 lines)"}, "properties": {"repobilityId": "c641bf2c6c048e88", "scanner": "scanner-primary", "fingerprint": "75ce5d4895ffd6a1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-04460e357cd7882c", "level": "note", "message": {"text": "Very large file: backend/src/db/schema.ts (2058 lines)"}, "properties": {"repobilityId": "f7c00829f3165887", "scanner": "scanner-primary", "fingerprint": "04460e357cd7882c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-206264ae68b18167", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/openclaw-plugin/package.json"}, "properties": {"repobilityId": "1c11eb8f351f6e56", "scanner": "scanner-primary", "fingerprint": "206264ae68b18167", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/openclaw-plugin/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "690a53ad15a64d53", "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": "0247bbe732020b98", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "7caeae3f2ff179c8", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "f1d070434ed12fb4", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "9070dc00ca85c617", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "30f589fcf5c1beb7", "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": "248cdbec6b38c75c", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-bea357a6497a2d5d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "properties": {"repobilityId": "aae72df3934829ac", "scanner": "scanner-primary", "fingerprint": "bea357a6497a2d5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-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-92da119092a384bf", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/evals/scenarios/S001-cockpit-idle-live-transition.md"}, "properties": {"repobilityId": "b0d831c35c7845fa", "scanner": "scanner-primary", "fingerprint": "92da119092a384bf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/evals/scenarios/S001-cockpit-idle-live-transition.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6bc5564ed6831cc9", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/evals/scenarios/orchestration/S004-autonomy-dial.md"}, "properties": {"repobilityId": "636f3a610169089a", "scanner": "scanner-primary", "fingerprint": "6bc5564ed6831cc9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/evals/scenarios/orchestration/S004-autonomy-dial.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3a3dcab32aecb1f3", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/skills/app-store-optimization/references/keyword-research-guide.md"}, "properties": {"repobilityId": "e3f924688e7f2f21", "scanner": "scanner-primary", "fingerprint": "3a3dcab32aecb1f3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/app-store-optimization/references/keyword-research-guide.md"}, "region": {"startLine": 330}}}]}, {"ruleId": "scanner-2e6c349fe742d947", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/taskclaw-builder/references/workflow.md"}, "properties": {"repobilityId": "faabe25202509643", "scanner": "scanner-primary", "fingerprint": "2e6c349fe742d947", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/taskclaw-builder/references/workflow.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b4a5eb1908a916fe", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/content-creator/examples/seo_optimization_example.md"}, "properties": {"repobilityId": "69668d0cb02acd43", "scanner": "scanner-primary", "fingerprint": "b4a5eb1908a916fe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/content-creator/examples/seo_optimization_example.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b7a322502f5314c2", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/content-creator/examples/brand_voice_analysis_example.md"}, "properties": {"repobilityId": "c8682682af8f7521", "scanner": "scanner-primary", "fingerprint": "b7a322502f5314c2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/content-creator/examples/brand_voice_analysis_example.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1e6d76d710fb509a", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/taskclaw-shared/bundle_format.md"}, "properties": {"repobilityId": "c02f265b7761820b", "scanner": "scanner-primary", "fingerprint": "1e6d76d710fb509a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/taskclaw-shared/bundle_format.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-42e635e16f31d986", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/board-architect/references/step_types.md"}, "properties": {"repobilityId": "55ec14b5295211cd", "scanner": "scanner-primary", "fingerprint": "42e635e16f31d986", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/board-architect/references/step_types.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1f096fef4940daab", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/board-architect/references/manifest_schema.md"}, "properties": {"repobilityId": "cc1ef3c6270c61f1", "scanner": "scanner-primary", "fingerprint": "1f096fef4940daab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/board-architect/references/manifest_schema.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d396487d556f7db1", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/skills/dev-setup/SKILL.md"}, "properties": {"repobilityId": "031ad1bd99d7a696", "scanner": "scanner-primary", "fingerprint": "d396487d556f7db1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/dev-setup/SKILL.md"}, "region": {"startLine": 522}}}]}, {"ruleId": "scanner-977d52a9dda532c3", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/dev-setup/references/env-vars.md"}, "properties": {"repobilityId": "be717c0af07419e1", "scanner": "scanner-primary", "fingerprint": "977d52a9dda532c3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/dev-setup/references/env-vars.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-330dfc934e31f64c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/eslint.config.mjs:31"}, "properties": {"repobilityId": "b402429fee5b3b71", "scanner": "scanner-primary", "fingerprint": "330dfc934e31f64c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0e37ab8308611219", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/next.config.ts:5"}, "properties": {"repobilityId": "13e5ff1a4c83653a", "scanner": "scanner-primary", "fingerprint": "0e37ab8308611219", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e5418793da212ac6", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/integrations/setup-guide-renderer.tsx:7"}, "properties": {"repobilityId": "e597aea43b66a243", "scanner": "scanner-primary", "fingerprint": "e5418793da212ac6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a7ef19bf0f9ceb1d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/events/route.ts:22"}, "properties": {"repobilityId": "1f5b3a65d7a6491d", "scanner": "scanner-primary", "fingerprint": "a7ef19bf0f9ceb1d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-32921fdd9f4c086b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/api/[...path]/route.ts:34"}, "properties": {"repobilityId": "859551111f6810e2", "scanner": "scanner-primary", "fingerprint": "32921fdd9f4c086b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aaa7697b5b42076d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/skills-actions.ts:67"}, "properties": {"repobilityId": "665bf10d7ee4a4b8", "scanner": "scanner-primary", "fingerprint": "aaa7697b5b42076d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-92cdc44cb603da28", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/settings/memory/actions.ts:190"}, "properties": {"repobilityId": "bb9000d3e3f5c75f", "scanner": "scanner-primary", "fingerprint": "92cdc44cb603da28", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7ac3aca940a8d1a5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/settings/skills/actions.ts:43"}, "properties": {"repobilityId": "a7cd30930b6e9955", "scanner": "scanner-primary", "fingerprint": "7ac3aca940a8d1a5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c553e0caf4e13d04", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/settings/agent-sync/actions.ts:118"}, "properties": {"repobilityId": "26353b40492fdf11", "scanner": "scanner-primary", "fingerprint": "c553e0caf4e13d04", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cce992d99cf1f4ff", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/pods/bundle-actions.ts:33"}, "properties": {"repobilityId": "72fe66388a119294", "scanner": "scanner-primary", "fingerprint": "cce992d99cf1f4ff", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cc71f5c4b637cbc8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/pods/actions.ts:272"}, "properties": {"repobilityId": "cb43aab836a76c5c", "scanner": "scanner-primary", "fingerprint": "cc71f5c4b637cbc8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8cb1248e5b025266", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/chat/actions.ts:97"}, "properties": {"repobilityId": "0a1c8792fe924da4", "scanner": "scanner-primary", "fingerprint": "8cb1248e5b025266", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-83fb4907e0edf3a5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/tasks/actions.ts:49"}, "properties": {"repobilityId": "be444e8e3c604b6e", "scanner": "scanner-primary", "fingerprint": "83fb4907e0edf3a5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-401c1fd3ab442fb5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/agents/actions.ts:56"}, "properties": {"repobilityId": "e03d9d603f801716", "scanner": "scanner-primary", "fingerprint": "401c1fd3ab442fb5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e2eacdb76c9beb69", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/factory/actions.ts:35"}, "properties": {"repobilityId": "a587656f7a3e5a00", "scanner": "scanner-primary", "fingerprint": "e2eacdb76c9beb69", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-df46f2cf102d6a60", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/inbox/actions.ts:67"}, "properties": {"repobilityId": "fbdfc3cbc85f5725", "scanner": "scanner-primary", "fingerprint": "df46f2cf102d6a60", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c84f669f972be066", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/dashboard/knowledge/actions.ts:34"}, "properties": {"repobilityId": "e237a529b284914e", "scanner": "scanner-primary", "fingerprint": "c84f669f972be066", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ec03509554ae1ed7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/admin/settings/actions.ts:10"}, "properties": {"repobilityId": "73487a7a14e4a81f", "scanner": "scanner-primary", "fingerprint": "ec03509554ae1ed7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-84d045df386ceb84", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/app/onboarding/page.tsx:20"}, "properties": {"repobilityId": "60cd53fcc7ce078f", "scanner": "scanner-primary", "fingerprint": "84d045df386ceb84", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3fc50067a82d1fbd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/app/(auth)/actions.ts:23"}, "properties": {"repobilityId": "df291f701dd5b308", "scanner": "scanner-primary", "fingerprint": "3fc50067a82d1fbd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e1489f8b189a80b7", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/lib/auth.ts:30"}, "properties": {"repobilityId": "1866a72d1fad0ff8", "scanner": "scanner-primary", "fingerprint": "e1489f8b189a80b7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aaae3337ce6d77ec", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/lib/auth.ts:85"}, "properties": {"repobilityId": "985ddeb4fdabe2ed", "scanner": "scanner-primary", "fingerprint": "aaae3337ce6d77ec", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-feb6b127894a5e70", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/src/lib/public-config.ts:1"}, "properties": {"repobilityId": "aafafdac3a596964", "scanner": "scanner-primary", "fingerprint": "feb6b127894a5e70", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e924582f0c349025", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/lib/api-base.ts:3"}, "properties": {"repobilityId": "c08ffdb7c1bb3e82", "scanner": "scanner-primary", "fingerprint": "e924582f0c349025", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c71bd8032c9d2514", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/hooks/use-orchestration-events.ts:64"}, "properties": {"repobilityId": "a86433fc4c645166", "scanner": "scanner-primary", "fingerprint": "c71bd8032c9d2514", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5e5bbe1331e20428", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/kit/makerkit/version-updater.tsx:103"}, "properties": {"repobilityId": "79ab52a8cf1dc5b4", "scanner": "scanner-primary", "fingerprint": "5e5bbe1331e20428", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-65853a1d9c5f9a9f", "level": "note", "message": {"text": "Legacy-named symbol `post_copy` in .claude/skills/social-media-analyzer/scripts/calculate_metrics.py:125"}, "properties": {"repobilityId": "c02fe36a6b280c38", "scanner": "scanner-primary", "fingerprint": "65853a1d9c5f9a9f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-59364aed0e3e6f11", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/integrations/oauth/oauth.service.ts:267"}, "properties": {"repobilityId": "08573f2a9d8c0f9f", "scanner": "scanner-primary", "fingerprint": "59364aed0e3e6f11", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ba8a1c914858b372", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/adapters/clickup/clickup.adapter.ts:267"}, "properties": {"repobilityId": "27a1a3e388716b07", "scanner": "scanner-primary", "fingerprint": "ba8a1c914858b372", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ba728fbe7e086e8d", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/syncs/dto/syncs.schema.ts:3"}, "properties": {"repobilityId": "28fd046c11f3114c", "scanner": "scanner-primary", "fingerprint": "ba728fbe7e086e8d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8094c4e78f3c2f4a", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/users/users.service.ts:213"}, "properties": {"repobilityId": "380ce3136bdd3ccc", "scanner": "scanner-primary", "fingerprint": "8094c4e78f3c2f4a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a0b36615416e43ad", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/ai-assistant/ai-assistant.service.ts:287"}, "properties": {"repobilityId": "676916b269d960ba", "scanner": "scanner-primary", "fingerprint": "a0b36615416e43ad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b0c8ad70726a768e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/ai-assistant/tools/upload-to-storage.tool.ts:33"}, "properties": {"repobilityId": "a76e33570a4e06fa", "scanner": "scanner-primary", "fingerprint": "b0c8ad70726a768e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-03fc15a74e72cbd6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/ai-assistant/tools/elevenlabs-clone-voice.tool.ts:81"}, "properties": {"repobilityId": "985071e49f0b8100", "scanner": "scanner-primary", "fingerprint": "03fc15a74e72cbd6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3805b48134fc96e5", "level": "note", "message": {"text": "Legacy-named symbol `eleven_multilingual_v2` in backend/src/ai-assistant/tools/elevenlabs-tts.tool.ts:49"}, "properties": {"repobilityId": "e4011486d70829fa", "scanner": "scanner-primary", "fingerprint": "3805b48134fc96e5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d307657f0ee93847", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/pods/pod-bundle.service.ts:115"}, "properties": {"repobilityId": "94168e453e293fa7", "scanner": "scanner-primary", "fingerprint": "d307657f0ee93847", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-92b340fb1e7bdab4", "level": "none", "message": {"text": "Commented-code block (8 lines) in backend/src/pods/dto/pod-bundle.schema.ts:3"}, "properties": {"repobilityId": "ca76d91e9c09108f", "scanner": "scanner-primary", "fingerprint": "92b340fb1e7bdab4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c14ffb8bc7f8f771", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/projects/projects.service.ts:198"}, "properties": {"repobilityId": "ab59a819f49b780d", "scanner": "scanner-primary", "fingerprint": "c14ffb8bc7f8f771", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0cdcf43b239dad02", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/common/utils/retry.util.ts:69"}, "properties": {"repobilityId": "07f079f7375bd305", "scanner": "scanner-primary", "fingerprint": "0cdcf43b239dad02", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9245647852ed5be7", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/common/utils/snake-keys.util.ts:30"}, "properties": {"repobilityId": "1933924d4903fa41", "scanner": "scanner-primary", "fingerprint": "9245647852ed5be7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6e705242e20fec70", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/mcp/api-client.ts:37"}, "properties": {"repobilityId": "b065f48831ba5672", "scanner": "scanner-primary", "fingerprint": "6e705242e20fec70", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-52f4cae416b52d50", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 backend/src/memory/adapters/obsidian-memory.adapter.ts:205"}, "properties": {"repobilityId": "d12d99e1b12e1a6b", "scanner": "scanner-primary", "fingerprint": "52f4cae416b52d50", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-37d53949ff931835", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/memory/adapters/default-memory.adapter.ts:87"}, "properties": {"repobilityId": "074bdda4c015e3c5", "scanner": "scanner-primary", "fingerprint": "37d53949ff931835", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5cd96741b5379ab8", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/src/inbox/inbox.service.ts:115"}, "properties": {"repobilityId": "4450ae34a0d46f3e", "scanner": "scanner-primary", "fingerprint": "5cd96741b5379ab8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4b817cdf9a363cdc", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/ee/langfuse/langfuse.service.ts:334"}, "properties": {"repobilityId": "dc0ecc8c119455a3", "scanner": "scanner-primary", "fingerprint": "4b817cdf9a363cdc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b0b7578dd2a289b6", "level": "note", "message": {"text": "26 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "8099a5c5713d37b9", "scanner": "scanner-primary", "fingerprint": "b0b7578dd2a289b6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "c8d2510c950a0786", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-28dd52556708dac1", "level": "error", "message": {"text": "Dangling fetch: GET https://api.replicate.com/v1/predictions/${prediction_id} (backend/src/ai-assistant/tools/replicate-poll.tool.ts:16)"}, "properties": {"repobilityId": "c125f844940604e6", "scanner": "scanner-primary", "fingerprint": "28dd52556708dac1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b7da16e02127e214", "level": "error", "message": {"text": "Dangling fetch: POST https://api.replicate.com/v1/files (backend/src/ai-assistant/tools/upload-to-storage.tool.ts:33)"}, "properties": {"repobilityId": "2c637bf81fa8adcc", "scanner": "scanner-primary", "fingerprint": "b7da16e02127e214", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-18d1681ab62f98f7", "level": "error", "message": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/voices/add (backend/src/ai-assistant/tools/elevenlabs-clone-voice.tool.ts:81)"}, "properties": {"repobilityId": "39ab79fa8ea2cd8d", "scanner": "scanner-primary", "fingerprint": "18d1681ab62f98f7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1221b0f4e77402f1", "level": "error", "message": {"text": "Dangling fetch: POST https://api.replicate.com/v1/predictions (backend/src/ai-assistant/tools/replicate-predict.tool.ts:31)"}, "properties": {"repobilityId": "d766e47d4d37fabe", "scanner": "scanner-primary", "fingerprint": "1221b0f4e77402f1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-02fee88196bfb38a", "level": "error", "message": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${voice_id} (backend/src/ai-assistant/tools/elevenlabs-tts.tool.ts:38)"}, "properties": {"repobilityId": "b6a09e8753c87627", "scanner": "scanner-primary", "fingerprint": "02fee88196bfb38a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0895658787e671f3", "level": "error", "message": {"text": "Dangling fetch: GET https://api.example.com/data (backend/src/common/utils/retry.util.ts:69)"}, "properties": {"repobilityId": "e6fe433b1eaf31a5", "scanner": "scanner-primary", "fingerprint": "0895658787e671f3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-99addbde9e252c23", "level": "error", "message": {"text": "Dangling fetch: GET https://api.anthropic.com/v1/models (backend/src/backbone/adapters/anthropic.adapter.ts:49)"}, "properties": {"repobilityId": "97cae4ea7a9e9050", "scanner": "scanner-primary", "fingerprint": "99addbde9e252c23", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a977c4f370f77fa7", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (backend/src/backbone/adapters/anthropic.adapter.ts:126)"}, "properties": {"repobilityId": "be277fc94b440b1f", "scanner": "scanner-primary", "fingerprint": "a977c4f370f77fa7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-73614bfd02f5b1e2", "level": "note", "message": {"text": "Unused endpoint: GET /accounts/:accountId/integrations/definitions"}, "properties": {"repobilityId": "f9be02fbae16df6b", "scanner": "scanner-primary", "fingerprint": "73614bfd02f5b1e2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4fa0b00e0bb90208", "level": "note", "message": {"text": "Unused endpoint: GET /accounts/:accountId/integrations/definitions/:defId"}, "properties": {"repobilityId": "24a50653c37aedad", "scanner": "scanner-primary", "fingerprint": "4fa0b00e0bb90208", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-64f96d65c579cc32", "level": "note", "message": {"text": "Unused endpoint: POST /accounts/:accountId/integrations/definitions"}, "properties": {"repobilityId": "9c0cac666f525625", "scanner": "scanner-primary", "fingerprint": "64f96d65c579cc32", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-50fccd8a48446f9f", "level": "note", "message": {"text": "Unused endpoint: PATCH /accounts/:accountId/integrations/definitions/:defId"}, "properties": {"repobilityId": "b3389cb59e26f7d9", "scanner": "scanner-primary", "fingerprint": "50fccd8a48446f9f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3b244a88e4363a67", "level": "note", "message": {"text": "Unused endpoint: DELETE /accounts/:accountId/integrations/definitions/:defId"}, "properties": {"repobilityId": "b925ac251fb5b1ff", "scanner": "scanner-primary", "fingerprint": "3b244a88e4363a67", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f1eb85e10c37b967", "level": "note", "message": {"text": "Unused endpoint: GET /accounts/:accountId/integrations/connections"}, "properties": {"repobilityId": "a7fdeb37bf9f30fe", "scanner": "scanner-primary", "fingerprint": "f1eb85e10c37b967", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6555a5d68cdcd191", "level": "note", "message": {"text": "Unused endpoint: GET /accounts/:accountId/integrations/connections/:connId"}, "properties": {"repobilityId": "3bccc4c3e316bbde", "scanner": "scanner-primary", "fingerprint": "6555a5d68cdcd191", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-75ae8028971753eb", "level": "note", "message": {"text": "Unused endpoint: POST /accounts/:accountId/integrations/connections"}, "properties": {"repobilityId": "b2a4b377c59c9d14", "scanner": "scanner-primary", "fingerprint": "75ae8028971753eb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b7607aabe25cbee8", "level": "note", "message": {"text": "Unused endpoint: PATCH /accounts/:accountId/integrations/connections/:connId"}, "properties": {"repobilityId": "0cc1c93749560cbc", "scanner": "scanner-primary", "fingerprint": "b7607aabe25cbee8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6b164b80baeb819e", "level": "note", "message": {"text": "Unused endpoint: DELETE /accounts/:accountId/integrations/connections/:connId"}, "properties": {"repobilityId": "b0569030f6d5f7aa", "scanner": "scanner-primary", "fingerprint": "6b164b80baeb819e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-78c76a976d3c6ed1", "level": "note", "message": {"text": "Unused endpoint: POST /accounts/:accountId/integrations/connections/:connId/toggle"}, "properties": {"repobilityId": "c74a5eac7b957d35", "scanner": "scanner-primary", "fingerprint": "78c76a976d3c6ed1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9c6760f2c6989274", "level": "note", "message": {"text": "Unused endpoint: POST /accounts/:accountId/integrations/connections/:connId/health-check"}, "properties": {"repobilityId": "f7b604da04fa5112", "scanner": "scanner-primary", "fingerprint": "9c6760f2c6989274", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0846bb79b0957669", "level": "note", "message": {"text": "Unused endpoint: DELETE /accounts/:accountId/integrations/:refId"}, "properties": {"repobilityId": "89f0e64a4726178d", "scanner": "scanner-primary", "fingerprint": "0846bb79b0957669", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-209515dbe22658a4", "level": "note", "message": {"text": "Unused endpoint: GET /accounts/:accountId/integrations/oauth/:defId/authorize"}, "properties": {"repobilityId": "b6e57cb963dfbc30", "scanner": "scanner-primary", "fingerprint": "209515dbe22658a4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a59166e005f5aadf", "level": "note", "message": {"text": "Unused endpoint: GET /integrations/oauth/callback"}, "properties": {"repobilityId": "20eda0c85fabed57", "scanner": "scanner-primary", "fingerprint": "a59166e005f5aadf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-766d75be9e5d4415", "level": "note", "message": {"text": "Unused endpoint: GET /accounts/:accountId/syncs/:id"}, "properties": {"repobilityId": "c7ea0f2b2d305cde", "scanner": "scanner-primary", "fingerprint": "766d75be9e5d4415", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8e60e418cb275fee", "level": "note", "message": {"text": "Unused endpoint: GET /accounts/:accountId/syncs/:id/runs"}, "properties": {"repobilityId": "89794df1f6f551e9", "scanner": "scanner-primary", "fingerprint": "8e60e418cb275fee", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-27c58a6838645efd", "level": "note", "message": {"text": "Unused endpoint: GET /accounts/:accountId/syncs/:id/skills"}, "properties": {"repobilityId": "3598ca52554e0d9b", "scanner": "scanner-primary", "fingerprint": "27c58a6838645efd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-db2b5253386bd34f", "level": "note", "message": {"text": "Unused endpoint: PATCH /accounts/:accountId/syncs/:id"}, "properties": {"repobilityId": "2652dabc4133583f", "scanner": "scanner-primary", "fingerprint": "db2b5253386bd34f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-01718db10e667759", "level": "note", "message": {"text": "Unused endpoint: DELETE /accounts/:accountId/syncs/:id"}, "properties": {"repobilityId": "f9463a8833e93f57", "scanner": "scanner-primary", "fingerprint": "01718db10e667759", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b4b905af82c47b14", "level": "note", "message": {"text": "Unused endpoint: POST /accounts/:accountId/syncs/:id/run"}, "properties": {"repobilityId": "872ba48a4b07d32d", "scanner": "scanner-primary", "fingerprint": "b4b905af82c47b14", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3bb3ff08475b5e3e", "level": "note", "message": {"text": "Unused endpoint: GET /admin/users/:id"}, "properties": {"repobilityId": "c0fe8c50a62a9fef", "scanner": "scanner-primary", "fingerprint": "3bb3ff08475b5e3e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f2d6e145d2d95edc", "level": "note", "message": {"text": "Unused endpoint: PUT /admin/users/:id/role"}, "properties": {"repobilityId": "0529ae4ce9f7e9a5", "scanner": "scanner-primary", "fingerprint": "f2d6e145d2d95edc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-760aab83e3537bb1", "level": "note", "message": {"text": "Unused endpoint: PUT /admin/users/:id/status"}, "properties": {"repobilityId": "4800d565522916d4", "scanner": "scanner-primary", "fingerprint": "760aab83e3537bb1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4f864f796ee568fb", "level": "note", "message": {"text": "Unused endpoint: DELETE /admin/users/:id"}, "properties": {"repobilityId": "8bbcfb766083d32e", "scanner": "scanner-primary", "fingerprint": "4f864f796ee568fb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a8b657222dd85be2", "level": "note", "message": {"text": "Unused endpoint: GET /users/me"}, "properties": {"repobilityId": "ab62b64290badce0", "scanner": "scanner-primary", "fingerprint": "a8b657222dd85be2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd337b48ce3494de", "level": "note", "message": {"text": "Unused endpoint: GET /users/me/preferences"}, "properties": {"repobilityId": "7bc0b6922b80512b", "scanner": "scanner-primary", "fingerprint": "fd337b48ce3494de", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-46d5497ceb6ca0d9", "level": "note", "message": {"text": "Unused endpoint: PATCH /users/me/preferences"}, "properties": {"repobilityId": "57c96b57d533347a", "scanner": "scanner-primary", "fingerprint": "46d5497ceb6ca0d9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-752d3df931cacfb0", "level": "note", "message": {"text": "Unused endpoint: POST /accounts/:accountId/sync/sources/:sourceId"}, "properties": {"repobilityId": "808fdde61b7ab432", "scanner": "scanner-primary", "fingerprint": "752d3df931cacfb0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8945f5b85a9770b9", "level": "note", "message": {"text": "Unused endpoint: GET /accounts/:accountId/sync/status"}, "properties": {"repobilityId": "b17976eb75b0e057", "scanner": "scanner-primary", "fingerprint": "8945f5b85a9770b9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-73e3f7726dc9e315", "level": "note", "message": {"text": "Unused endpoint: GET /accounts/:accountId/orchestrations/:oid"}, "properties": {"repobilityId": "38957529434a4605", "scanner": "scanner-primary", "fingerprint": "73e3f7726dc9e315", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-773b68a1763ba988", "level": "note", "message": {"text": "Unused endpoint: POST /accounts/:accountId/orchestrations/:oid/approve"}, "properties": {"repobilityId": "d0cff4a3d0821bf5", "scanner": "scanner-primary", "fingerprint": "773b68a1763ba988", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fc13e50c3ef8c3ff", "level": "note", "message": {"text": "Unused endpoint: POST /accounts/:accountId/orchestrations/:oid/reject"}, "properties": {"repobilityId": "c90b93216ffad66a", "scanner": "scanner-primary", "fingerprint": "fc13e50c3ef8c3ff", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8fdbacfe9430a6ed", "level": "note", "message": {"text": "Unused endpoint: POST /auth/login"}, "properties": {"repobilityId": "743b1ea2f563f80c", "scanner": "scanner-primary", "fingerprint": "8fdbacfe9430a6ed", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4a12d5ed34c864c6", "level": "note", "message": {"text": "Unused endpoint: POST /auth/signup"}, "properties": {"repobilityId": "8047d8064889100c", "scanner": "scanner-primary", "fingerprint": "4a12d5ed34c864c6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b36892106ecdc9aa", "level": "note", "message": {"text": "Unused endpoint: POST /auth/refresh"}, "properties": {"repobilityId": "a0b243d33b738ce6", "scanner": "scanner-primary", "fingerprint": "b36892106ecdc9aa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c059f57186114027", "level": "note", "message": {"text": "Unused endpoint: POST /auth/logout"}, "properties": {"repobilityId": "b934ec61e8e1c247", "scanner": "scanner-primary", "fingerprint": "c059f57186114027", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ac42422b23e45104", "level": "note", "message": {"text": "Unused endpoint: GET /auth/me"}, "properties": {"repobilityId": "c154dc44924dda67", "scanner": "scanner-primary", "fingerprint": "ac42422b23e45104", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e2fe5b92648ca462", "level": "note", "message": {"text": "Unused endpoint: POST /auth/forgot-password"}, "properties": {"repobilityId": "eef2a63e08ee5f47", "scanner": "scanner-primary", "fingerprint": "e2fe5b92648ca462", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-deb8df763a50c73a", "level": "note", "message": {"text": "Unused endpoint: POST /auth/reset-password"}, "properties": {"repobilityId": "0020c196abb9803f", "scanner": "scanner-primary", "fingerprint": "deb8df763a50c73a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5e6138f2554741cd", "level": "note", "message": {"text": "Unused endpoint: POST /auth/update-password"}, "properties": {"repobilityId": "91897dbd66ee6db6", "scanner": "scanner-primary", "fingerprint": "5e6138f2554741cd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aff09493cb3ba0ea", "level": "note", "message": {"text": "Unused endpoint: DELETE /accounts/:accountId/api-keys/:keyId"}, "properties": {"repobilityId": "52a6f1d08622ba83", "scanner": "scanner-primary", "fingerprint": "aff09493cb3ba0ea", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4c57e1860b4fad98", "level": "note", "message": {"text": "Unused endpoint: GET /accounts/:accountId/board-routing/routes"}, "properties": {"repobilityId": "d2c8d0fd258f2bb6", "scanner": "scanner-primary", "fingerprint": "4c57e1860b4fad98", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0283bb343ed503d8", "level": "note", "message": {"text": "Unused endpoint: POST /accounts/:accountId/board-routing/routes"}, "properties": {"repobilityId": "4b065ce9bfa0a8d8", "scanner": "scanner-primary", "fingerprint": "0283bb343ed503d8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-159c637f234d6a1e", "level": "note", "message": {"text": "Unused endpoint: GET /accounts/:accountId/board-routing/routes/:routeId"}, "properties": {"repobilityId": "9b98be19497b1ea2", "scanner": "scanner-primary", "fingerprint": "159c637f234d6a1e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3572195ff01ef467", "level": "note", "message": {"text": "Unused endpoint: PATCH /accounts/:accountId/board-routing/routes/:routeId"}, "properties": {"repobilityId": "6ddc60e7787917ed", "scanner": "scanner-primary", "fingerprint": "3572195ff01ef467", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b7fd4c97f210c1f5", "level": "note", "message": {"text": "Unused endpoint: DELETE /accounts/:accountId/board-routing/routes/:routeId"}, "properties": {"repobilityId": "3a481d4a4caa7a2e", "scanner": "scanner-primary", "fingerprint": "b7fd4c97f210c1f5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-decfe6bea8a759f6", "level": "note", "message": {"text": "Unused endpoint: POST /accounts/:accountId/board-routing/decompose-goal"}, "properties": {"repobilityId": "f0ec8b406b390229", "scanner": "scanner-primary", "fingerprint": "decfe6bea8a759f6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f41c970c59645ddb", "level": "note", "message": {"text": "Unused endpoint: GET /accounts/:accountId/board-routing/dags"}, "properties": {"repobilityId": "e2d763c73e88f97a", "scanner": "scanner-primary", "fingerprint": "f41c970c59645ddb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e24e82a07b497bb3", "level": "note", "message": {"text": "Unused endpoint: GET /accounts/:accountId/board-routing/dags/:dagId"}, "properties": {"repobilityId": "036ecf8f7203c5fd", "scanner": "scanner-primary", "fingerprint": "e24e82a07b497bb3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}