{"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-239ffc01838283f8", "name": "Possibly dead Python function: embedding_source_hash", "shortDescription": {"text": "Possibly dead Python function: embedding_source_hash"}, "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-03c5fc438ac75c0d", "name": "Possibly dead Python function: log_message", "shortDescription": {"text": "Possibly dead Python function: log_message"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e9f0ec2ea6be0c69", "name": "Possibly dead Python function: do_PUT", "shortDescription": {"text": "Possibly dead Python function: do_PUT"}, "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-129d0105e4475bc5", "name": "Possibly dead Python function: do_DELETE", "shortDescription": {"text": "Possibly dead Python function: do_DELETE"}, "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-e401d5488dfb9013", "name": "Possibly dead Python function: list_items", "shortDescription": {"text": "Possibly dead Python function: list_items"}, "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-66428d3588c6f6de", "name": "Possibly dead Python function: list_actions", "shortDescription": {"text": "Possibly dead Python function: list_actions"}, "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-a5025a2f626a83c8", "name": "Possibly dead Python function: list_items", "shortDescription": {"text": "Possibly dead Python function: list_items"}, "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-003d83baddd918c7", "name": "Possibly dead Python function: beat", "shortDescription": {"text": "Possibly dead Python function: beat"}, "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-5409fb9e1f323e2c", "name": "Possibly dead Python function: watch_auth_stdout", "shortDescription": {"text": "Possibly dead Python function: watch_auth_stdout"}, "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-90966cb017279ad7", "name": "Possibly dead Python function: handle_auth_start", "shortDescription": {"text": "Possibly dead Python function: handle_auth_start"}, "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-4853f4e1b2376340", "name": "Possibly dead Python function: handle_auth_paste", "shortDescription": {"text": "Possibly dead Python function: handle_auth_paste"}, "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-c1ce4b20c7cf4bc6", "name": "Possibly dead Python function: handle_auth_list", "shortDescription": {"text": "Possibly dead Python function: handle_auth_list"}, "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-e4a7829e358aa045", "name": "Possibly dead Python function: handle_auth_remove", "shortDescription": {"text": "Possibly dead Python function: handle_auth_remove"}, "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-33a9ea5590818fa4", "name": "Possibly dead Python function: handle_auth_refresh", "shortDescription": {"text": "Possibly dead Python function: handle_auth_refresh"}, "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-671a6e2cba4212ec", "name": "Possibly dead Python function: handle_set_agent_model", "shortDescription": {"text": "Possibly dead Python function: handle_set_agent_model"}, "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-8edd6dc4401633c5", "name": "Possibly dead Python function: handle_list_models", "shortDescription": {"text": "Possibly dead Python function: handle_list_models"}, "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-aa3e5748653bba14", "name": "Possibly dead Python function: handle_source_write", "shortDescription": {"text": "Possibly dead Python function: handle_source_write"}, "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-a1cbeb590f20a70d", "name": "Possibly dead Python function: handle_collection_list", "shortDescription": {"text": "Possibly dead Python function: handle_collection_list"}, "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-fff4204ed567c98a", "name": "Possibly dead Python function: handle_collection_query", "shortDescription": {"text": "Possibly dead Python function: handle_collection_query"}, "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-c5976667e8271caa", "name": "Possibly dead Python function: handle_collection_record_create", "shortDescription": {"text": "Possibly dead Python function: handle_collection_record_create"}, "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-ab3b88322599bed8", "name": "Possibly dead Python function: handle_collection_record_update", "shortDescription": {"text": "Possibly dead Python function: handle_collection_record_update"}, "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-b456de24226174cb", "name": "Possibly dead Python function: loop", "shortDescription": {"text": "Possibly dead Python function: loop"}, "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-bcbf63ea99ec0a23", "name": "Possibly dead Python function: beat", "shortDescription": {"text": "Possibly dead Python function: beat"}, "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-8163272605aecf5b", "name": "Possibly dead Python function: loop", "shortDescription": {"text": "Possibly dead Python function: loop"}, "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-809d0ec84aec0271", "name": "Possibly dead Python function: beat", "shortDescription": {"text": "Possibly dead Python function: beat"}, "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-118426786376d915", "name": "Possibly dead Python function: warm_model_loop", "shortDescription": {"text": "Possibly dead Python function: warm_model_loop"}, "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-68072a31a629860b", "name": "Possibly dead Python function: indexing_loop", "shortDescription": {"text": "Possibly dead Python function: indexing_loop"}, "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-3aed959e196d2faa", "name": "Possibly dead Python function: log_message", "shortDescription": {"text": "Possibly dead Python function: log_message"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-30a01d5b791b8185", "name": "Stray `console.log` in TS/JS \u2014 apps/ui/src/__tests__/lib/markdown-to-tiptap.test.ts:173", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/ui/src/__tests__/lib/markdown-to-tiptap.test.ts:173"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dd76d8bb3bc26227", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/ui/src/components/theme-applier.tsx:53", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/ui/src/components/theme-applier.tsx:53"}, "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-1ad7bc1040ff87b3", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/dashboard-shell.tsx:181", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/dashboard-shell.tsx:181"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7b156f95f73cc4fe", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/notifications/notification-feed.tsx:169", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/notifications/notification-feed.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-56a5dd8bbd65a311", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/networking/networking-settings.tsx:189", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/networking/networking-settings.tsx:189"}, "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-82d42d96d25b9abc", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/workspaces/workspace-switcher.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/workspaces/workspace-switcher.tsx:68"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3fa70703619c3ed7", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/workspaces/database-settings.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/workspaces/database-settings.tsx:109"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7d973a56464eea86", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/header-bar.tsx:246", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/header-bar.tsx:246"}, "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-84c2708712123d0d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/entity-link-picker.tsx:204", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/entity-link-picker.tsx:204"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-77f76cb16d278cab", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/command-palette.tsx:221", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/command-palette.tsx:221"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-50df749448fcc35d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/folder-tree.tsx:436", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/folder-tree.tsx:436"}, "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-15fb7e3e7394eacb", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/pipeline-stage-picker.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/pipeline-stage-picker.tsx:109"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e644539fcc86151c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/detail-header.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/detail-header.tsx:68"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9fc5c141d52f80ba", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/select-field-picker.tsx:70", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/select-field-picker.tsx:70"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df331b00d16d1e18", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/entity-link-list.tsx:61", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/entity-link-list.tsx:61"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bec5a8c120fbf41b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/property-list.tsx:194", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/property-list.tsx:194"}, "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-a4c4441c147dc83a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/page-header.tsx:49", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/page-header.tsx:49"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bd9976fea6082267", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/ui/src/components/ui/chart.tsx:83", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/ui/src/components/ui/chart.tsx:83"}, "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-916c0537daa324cb", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/ui/status-dot.tsx:31", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/ui/status-dot.tsx:31"}, "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-d84446092db7decc", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/import/preview-step.tsx:136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/import/preview-step.tsx:136"}, "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-2932ffb15b55c63e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/import/mapping-step.tsx:189", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/import/mapping-step.tsx:189"}, "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-9d1aadfe68b2c711", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/sources/source-connection-detail.tsx:424", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/sources/source-connection-detail.tsx:424"}, "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-e38934d722471718", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/sources/source-content-picker.tsx:422", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/sources/source-content-picker.tsx:422"}, "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-02106b879a90f9d6", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/routines/routines-table.tsx:85", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/routines/routines-table.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-e3cb6ceb32463ebc", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/routines/routine-form.tsx:847", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/routines/routine-form.tsx:847"}, "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-b3b3d6bf36a29ec7", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/comment-form.tsx:153", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/comment-form.tsx:153"}, "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-f6ceef15b0ee59ad", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-model-override.tsx:161", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-model-override.tsx:161"}, "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-6ed58ecb645d06a5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-timeline.tsx:89", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-timeline.tsx:89"}, "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-bc528cdcf7931bf7", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-card.tsx:66", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-card.tsx:66"}, "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-59d025aa32fd071c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/mention-autocomplete.tsx:102", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/mention-autocomplete.tsx:102"}, "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-c2cac98186e5c34d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/comment-thread.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/comment-thread.tsx:68"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-81e568494e905c2a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-list.tsx:210", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-list.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-364a3c7959c97f21", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/series-list-view.tsx:104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/series-list-view.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-545ef9acedc2e996", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-template-launcher.tsx:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-template-launcher.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-73faf0a5abbfb64d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-relations.tsx:144", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-relations.tsx:144"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1c9e9f6242e185a2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-labels-picker.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-labels-picker.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-324f678e6d7b3980", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-calendar-view.tsx:286", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-calendar-view.tsx:286"}, "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-2b0872cc66f985dd", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/stream-list.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/stream-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-2e0588da9eaaac54", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/series-form.tsx:486", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/series-form.tsx:486"}, "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-8e4d752110201f31", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/agent-status-chip.tsx:24", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/agent-status-chip.tsx:24"}, "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-17f443e0b476825f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-import-dialog.tsx:174", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-import-dialog.tsx:174"}, "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-0248f043f2daed15", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-record-detail.tsx:158", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-record-detail.tsx:158"}, "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-abd225e7aa4b3aa4", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-cell.tsx:99", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-cell.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-688023f15f2802b2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-index.tsx:53", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-index.tsx:53"}, "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-17bce9b8c89606b5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-calendar-view.tsx:175", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-calendar-view.tsx:175"}, "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-a13f74b2b6e26b9f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-table-view.tsx:91", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-table-view.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-6c188dc2fab59c6d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-kanban-view.tsx:168", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-kanban-view.tsx:168"}, "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-46ce7c88b1cec1d6", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-field-editor.tsx:346", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-field-editor.tsx:346"}, "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-5de4fdcbe7497bcd", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-file-tree.tsx:172", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-file-tree.tsx:172"}, "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-f664653323ad3836", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-provisioning.tsx:61", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-provisioning.tsx:61"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-19a422aba9342b57", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-file-browser.tsx:150", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-file-browser.tsx:150"}, "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-1c0a7ee11e041055", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-knowledge-section.tsx:162", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-knowledge-section.tsx:162"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1c02ca09e23a0813", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-create-wizard.tsx:459", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-create-wizard.tsx:459"}, "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-ee98f150d5d9b153", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-browser-tab.tsx:190", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-browser-tab.tsx:190"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3dfa29ce65fe5c6e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-org-slice.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-org-slice.tsx:112"}, "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-eeda347c940ce9aa", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-detail-tabs.tsx:490", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-detail-tabs.tsx:490"}, "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-a8a6bee8116d6c95", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-node.tsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-node.tsx:123"}, "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-e1bbe99818915ecd", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-model-section.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-model-section.tsx:171"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-09e66648d1dd74e1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-card.tsx:134", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-card.tsx:134"}, "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-ae7569cfb02520bc", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/organizations/org-detail.tsx:169", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/organizations/org-detail.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-11ae50c1e5c627ce", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/onboarding/wizard/step-infrastructure.tsx:79", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/onboarding/wizard/step-infrastructure.tsx:795"}, "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-9402f128b79d02a4", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/gateways/gateway-detail.tsx:561", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/gateways/gateway-detail.tsx:561"}, "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-2f1916d493c5d45f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/gateways/open-desktop-modal.tsx:59", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/gateways/open-desktop-modal.tsx:59"}, "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-020db6ca5036f53c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/gateways/gateways-settings.tsx:233", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/gateways/gateways-settings.tsx:233"}, "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-bb7502b4eb95adf4", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/contact-organizations-section.tsx:117", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/contact-organizations-section.tsx:117"}, "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-14a40e1ed5581462", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/draft-sets-section.tsx:402", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/draft-sets-section.tsx:402"}, "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-c95985abc2479782", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/contact-detail-view.tsx:470", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/contact-detail-view.tsx:470"}, "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-58e6ee1c621862cd", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/contact-preview-card.tsx:57", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/contact-preview-card.tsx:57"}, "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-7b2d5a9bb49fdc69", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/templates-tab.tsx:106", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/templates-tab.tsx:106"}, "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-f4ad4b587bf60509", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/campaigns-tab.tsx:113", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/campaigns-tab.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-2a69b88a47f692e6", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/contact-form.tsx:452", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/contact-form.tsx:452"}, "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-3d46c3a80042c409", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/contacts-kanban-view.tsx:235", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/contacts-kanban-view.tsx:235"}, "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-f2decc4e0f7b3501", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/contacts-card-view.tsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/contacts-card-view.tsx:94"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f0e3b110f92924bd", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/secrets/secret-row.tsx:49", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/secrets/secret-row.tsx:49"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-25fba5ce0ddaffe5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/inbox/inbox-section.tsx:48", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/inbox/inbox-section.tsx:48"}, "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-dd3487e7231cc89e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/connections/connections-settings.tsx:378", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/connections/connections-settings.tsx:378"}, "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-93de2a64f325258d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/connections/agent-rail-model-section.tsx:88", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/connections/agent-rail-model-section.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-e9ad317719b44986", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/connections/add-connection-dialog.tsx:298", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/connections/add-connection-dialog.tsx:298"}, "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-6862ce4ba4f402e7", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/connections/oauth-interactive-flow.tsx:202", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/connections/oauth-interactive-flow.tsx:202"}, "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-5922b6b7d45b9c71", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/knowledge/knowledge-detail-editor.tsx:283", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/knowledge/knowledge-detail-editor.tsx:283"}, "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-0dde986917b6d5e1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/knowledge/knowledge-grid.tsx:51", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/knowledge/knowledge-grid.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-3c501d4fafa2c37b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/knowledge/knowledge-list.tsx:54", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/knowledge/knowledge-list.tsx:54"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a016b7b883c7ad32", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/plugins/plugin-row.tsx:64", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/plugins/plugin-row.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-abb8bbdde5c07778", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/plugins/plugin-detail-dialog.tsx:150", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/plugins/plugin-detail-dialog.tsx:150"}, "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-1079f7cbb5364155", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/fields/page.tsx:116", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/fields/page.tsx:116"}, "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-ed7bcc7198a93602", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/sources/client.tsx:106", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/sources/client.tsx:106"}, "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-5d5da2d0c60c5227", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/templates/page.tsx:103", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/templates/page.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-21765d1810982361", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/logs/page.tsx:64", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/logs/page.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-d0ba572866a8cb4a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/pipeline/page.tsx:137", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/pipeline/page.tsx:137"}, "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-c150d0c831165d17", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/account/page.tsx:176", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/account/page.tsx:176"}, "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-2ecc4327ab7e9126", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/labels/page.tsx:157", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/labels/page.tsx:157"}, "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-baf1c706cd0da36a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/appearance/page.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/appearance/page.tsx:109"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c4c3adb03e2eb0b9", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/components/pulse-system-tab.tsx:57", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/components/pulse-system-tab.tsx:57"}, "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-5956e2a58738688b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/components/pulse-usage-tab.tsx:122", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/components/pulse-usage-tab.tsx:122"}, "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-2e5807b7ffc421ca", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/components/triage-item-row.tsx:135", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/components/triage-item-row.tsx:135"}, "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-34ef8b3a7c123f75", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/components/pulse-spend-tab.tsx:163", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/components/pulse-spend-tab.tsx:163"}, "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-e22082d9f382e0b5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/components/agent-grid-card.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/components/agent-grid-card.tsx:65"}, "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-60c4912293c4d178", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/lib/columns/extended-columns.tsx:58", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/lib/columns/extended-columns.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-2c05909fe28b7a2c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/lib/columns/org-columns.tsx:35", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/lib/columns/org-columns.tsx:35"}, "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-edf005e9b598c140", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/lib/columns/contact-columns.tsx:39", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/lib/columns/contact-columns.tsx:39"}, "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-7e10ae8a7aa0c7b3", "name": "TODO/FIXME marker in shipping code \u2014 apps/ui/src/lib/workspaces/parse-url.ts:34", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/ui/src/lib/workspaces/parse-url.ts:34"}, "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-add0ec1201aa4568", "name": "Stray `console.log` in TS/JS \u2014 apps/worker/src/index.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/worker/src/index.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-c81817b8a94c27d9", "name": "Stray `console.log` in TS/JS \u2014 apps/worker/src/providers/e2b.ts:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/worker/src/providers/e2b.ts:62"}, "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-5a24cfaf44901e56", "name": "Stray `console.log` in TS/JS \u2014 apps/worker/src/lib/schema-runner.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/worker/src/lib/schema-runner.ts:15"}, "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-a67bc33155c4ae58", "name": "Stray `console.log` in TS/JS \u2014 apps/worker/src/routes/stripe-webhook.ts:251", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/worker/src/routes/stripe-webhook.ts:251"}, "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-2fef9959427769fb", "name": "Stray `console.log` in TS/JS \u2014 apps/worker/src/loops/cleanup.ts:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/worker/src/loops/cleanup.ts:21"}, "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-d2dcb5335e9bbadf", "name": "Stray `console.log` in TS/JS \u2014 apps/worker/src/loops/sandbox-health.ts:108", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/worker/src/loops/sandbox-health.ts:108"}, "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-76c018360ad4b8b9", "name": "Stray `console.log` in TS/JS \u2014 apps/migrate/src/cli.ts:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/migrate/src/cli.ts:7"}, "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-ddbfb523794b28cb", "name": "Stray `console.log` in TS/JS \u2014 e2e/journeys/solopreneur.spec.ts:124", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/journeys/solopreneur.spec.ts:124"}, "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-21e0443d3daef935", "name": "Stray `console.log` in TS/JS \u2014 e2e/specs/10-channels.spec.ts:59", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/specs/10-channels.spec.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-7e2208be57eb599e", "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-6120820575fae863", "name": "Privileged port 14 in use", "shortDescription": {"text": "Privileged port 14 in use"}, "fullDescription": {"text": "Port 14 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-f223dc992b07d2e9", "name": "Privileged port 13 in use", "shortDescription": {"text": "Privileged port 13 in use"}, "fullDescription": {"text": "Port 13 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-20816f8d1b6155b5", "name": "Dockerfile runs as root: apps/ui/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: apps/ui/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-05f0824d4b3333b9", "name": "Docker base image is tag-pinned but not digest-pinned: node:24-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:24-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f7c91ab88f796a36", "name": "Docker base image is tag-pinned but not digest-pinned: node:24-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:24-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-edeffbac9d8d4492", "name": "Docker base image is tag-pinned but not digest-pinned: ubuntu:24.04", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: ubuntu:24.04"}, "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-04f05d350c5de9ed", "name": "Dockerfile pipes a remote installer into a shell", "shortDescription": {"text": "Dockerfile pipes a remote installer into a shell"}, "fullDescription": {"text": "Executing downloaded code during image build gives the remote endpoint build-time code execution. Prefer pinned packages or verify downloaded installers by checksum/signature."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "high", "confidence": 1.0}}, {"id": "scanner-46db88cd586d1d20", "name": "Docker base image is tag-pinned but not digest-pinned: ubuntu:24.04", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: ubuntu:24.04"}, "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-11e3cf62b289c0bd", "name": "Dockerfile pipes a remote installer into a shell", "shortDescription": {"text": "Dockerfile pipes a remote installer into a shell"}, "fullDescription": {"text": "Executing downloaded code during image build gives the remote endpoint build-time code execution. Prefer pinned packages or verify downloaded installers by checksum/signature."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6c68bd96bd5fd829", "name": "Docker base image is tag-pinned but not digest-pinned: ubuntu:24.04", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: ubuntu:24.04"}, "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-be55e9b63297a8b9", "name": "Dockerfile pipes a remote installer into a shell", "shortDescription": {"text": "Dockerfile pipes a remote installer into a shell"}, "fullDescription": {"text": "Executing downloaded code during image build gives the remote endpoint build-time code execution. Prefer pinned packages or verify downloaded installers by checksum/signature."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "high", "confidence": 1.0}}, {"id": "scanner-017fd5d3971b4103", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f982fe1304ec2faf", "name": "Docker base image uses a mutable or implicit tag: fastembed", "shortDescription": {"text": "Docker base image uses a mutable or implicit tag: fastembed"}, "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": "medium", "confidence": 1.0}}, {"id": "scanner-aa398afba4ecfefc", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bfa10045e9829edd", "name": "Insecure pattern 'dangerous_innerhtml' in apps/ui/src/components/theme-applier.tsx:53", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/ui/src/components/theme-applier.tsx:53"}, "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-4d811d8e02579511", "name": "Insecure pattern 'dangerous_innerhtml' in apps/ui/src/components/ui/chart.tsx:83", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/ui/src/components/ui/chart.tsx:83"}, "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-2b51d86e608850d1", "name": "Insecure pattern 'node_child_process' in apps/ui/src/lib/gateways/local-compose.ts:18", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/ui/src/lib/gateways/local-compose.ts:18"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e02d8b78e8b6053c", "name": "Possible secret in gateway/scripts/verify-528.mjs", "shortDescription": {"text": "Possible secret in gateway/scripts/verify-528.mjs"}, "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-2ab94acb63378e91", "name": "Insecure pattern 'node_child_process' in gateway/scripts/plugins/hq-bootstrap/index.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in gateway/scripts/plugins/hq-bootstrap/index.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-076b03a16e76601d", "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-f351140588d19c0c", "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-74408d04ab4b2510", "name": "Very large file: apps/ui/src/components/workspaces/new-workspace-wizard.tsx (1721 lines)", "shortDescription": {"text": "Very large file: apps/ui/src/components/workspaces/new-workspace-wizard.tsx (1721 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-70432b645a90a8af", "name": "Very large file: gateway/daemons/command_runner.py (2580 lines)", "shortDescription": {"text": "Very large file: gateway/daemons/command_runner.py (2580 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 100 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 365 placeholder/mock markers across 99 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-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-24f2ea4bd14badc1", "name": "Agent instruction contains unpinned remote install: CLAUDE.md", "shortDescription": {"text": "Agent instruction contains unpinned remote install: CLAUDE.md"}, "fullDescription": {"text": "Remote install commands in agent instructions are a supply-chain risk, especially when an agent can execute shell commands."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9fb6746d958003bd", "name": "Commented-code block (5 lines) in apps/ui/src/components/auth/sign-in-modal.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in apps/ui/src/components/auth/sign-in-modal.tsx: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-d40d3d8f348d9cbe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/components/workspaces/workspace-switcher.tsx:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/components/workspaces/workspace-switcher.tsx: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-d910e99571213f15", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/components/workspaces/database-settings.tsx:229", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/components/workspaces/database-settings.tsx:229"}, "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-e28851e38cfa5b6f", "name": "Commented-code block (5 lines) in apps/ui/src/components/agents/agent-channel-card.tsx:72", "shortDescription": {"text": "Commented-code block (5 lines) in apps/ui/src/components/agents/agent-channel-card.tsx:72"}, "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-b6728f5de8811640", "name": "Commented-code block (5 lines) in apps/ui/src/components/onboarding/wizard/actions.ts:288", "shortDescription": {"text": "Commented-code block (5 lines) in apps/ui/src/components/onboarding/wizard/actions.ts:288"}, "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-ed7ea2eb8b1d16c5", "name": "Commented-code block (5 lines) in apps/ui/src/components/gateways/add-gateway-dialog.tsx:5", "shortDescription": {"text": "Commented-code block (5 lines) in apps/ui/src/components/gateways/add-gateway-dialog.tsx: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-ecbd4d5a8dab9ec4", "name": "Commented-code block (8 lines) in apps/ui/src/components/connections/add-connection-dialog.tsx:582", "shortDescription": {"text": "Commented-code block (8 lines) in apps/ui/src/components/connections/add-connection-dialog.tsx:582"}, "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-37cc825edd45ac38", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/components/knowledge/knowledge-detail-editor.tsx:547", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/components/knowledge/knowledge-detail-editor.tsx:547"}, "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-ddd1e0a1833e6954", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/app/api/sources/oauth/[provider]/callback/route.ts:77", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/app/api/sources/oauth/[provider]/callback/route.ts:77"}, "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-adfd75942e3277fe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/app/api/onboarding/validate-provider/route.ts:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/app/api/onboarding/validate-provider/route.ts:48"}, "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-20991aa5f241c3fb", "name": "Commented-code block (10 lines) in apps/ui/src/app/onboarding/actions.ts:211", "shortDescription": {"text": "Commented-code block (10 lines) in apps/ui/src/app/onboarding/actions.ts:211"}, "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-92b1287129924e22", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/lib/agent-repo/gateway-backend.ts:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/lib/agent-repo/gateway-backend.ts:72"}, "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-7a78e5d5fa1f2fa7", "name": "Commented-code block (5 lines) in apps/ui/src/lib/models/catalog.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in apps/ui/src/lib/models/catalog.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-964149292faf99bb", "name": "Commented-code block (7 lines) in apps/ui/src/lib/workspaces/detect-collisions.ts:4", "shortDescription": {"text": "Commented-code block (7 lines) in apps/ui/src/lib/workspaces/detect-collisions.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4d165da859462c57", "name": "Commented-code block (7 lines) in apps/ui/src/lib/workspaces/gateway-auth-token.ts:3", "shortDescription": {"text": "Commented-code block (7 lines) in apps/ui/src/lib/workspaces/gateway-auth-token.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-3c6c6527ee18ee8a", "name": "Commented-code block (5 lines) in apps/ui/src/lib/workspaces/validate.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in apps/ui/src/lib/workspaces/validate.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-79e7dbfcb28dec93", "name": "Commented-code block (5 lines) in apps/ui/src/lib/gateways/one-liner.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in apps/ui/src/lib/gateways/one-liner.ts:6"}, "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-45d16d889734c251", "name": "Commented-code block (5 lines) in apps/ui/src/lib/connections/types.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in apps/ui/src/lib/connections/types.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-ba3c6d184dc6bde6", "name": "Commented-code block (6 lines) in apps/ui/src/hooks/use-agent-commands.ts:68", "shortDescription": {"text": "Commented-code block (6 lines) in apps/ui/src/hooks/use-agent-commands.ts:68"}, "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-613ef7b36bc89498", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/hooks/use-source-browse.ts:69", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/hooks/use-source-browse.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-c617df767a68e222", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/hooks/use-agents-list.ts:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/hooks/use-agents-list.ts:30"}, "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-c7358f9122171f79", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/hooks/use-sidebar-collections.ts:79", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/hooks/use-sidebar-collections.ts:79"}, "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-55708501d91ecb6b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/worker/src/providers/e2b.ts:82", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/worker/src/providers/e2b.ts:82"}, "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-43ca1f608ee1e336", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/worker/src/lib/provisioner.ts:90", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/worker/src/lib/provisioner.ts:90"}, "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-98ef041f85855aae", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/worker/src/lib/supabase-mgmt.ts:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/worker/src/lib/supabase-mgmt.ts:15"}, "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-effe50bbd21ddf04", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/worker/src/lib/schema-runner.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/worker/src/lib/schema-runner.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-9432179c20ac5edb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 infra/cloudflare-install/src/index.js:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/cloudflare-install/src/index.js:9"}, "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-f6b4a541a4bea14b", "name": "Commented-code block (6 lines) in gateway/scripts/verify-528.mjs:7", "shortDescription": {"text": "Commented-code block (6 lines) in gateway/scripts/verify-528.mjs: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-521ac765b8e0723d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 gateway/scripts/plugins/hq-bootstrap/index.ts:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 gateway/scripts/plugins/hq-bootstrap/index.ts:71"}, "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-dc1722b7f079a206", "name": "Legacy-named symbol `gateway_backup` in gateway/daemons/gateway_backup.py:15", "shortDescription": {"text": "Legacy-named symbol `gateway_backup` in gateway/daemons/gateway_backup.py:15"}, "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-1336f608be56e579", "name": "Legacy-named symbol `gateway_backup` in gateway/daemons/command_runner.py:354", "shortDescription": {"text": "Legacy-named symbol `gateway_backup` in gateway/daemons/command_runner.py:354"}, "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-75b9303d9025b8ae", "name": "Commented-code block (5 lines) in gateway/daemons/command_runner.py:93", "shortDescription": {"text": "Commented-code block (5 lines) in gateway/daemons/command_runner.py:93"}, "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-67c70bfbb8f21f9c", "name": "Network/subprocess call without timeout or try/except \u2014 gateway/daemons/command_runner.py:369", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 gateway/daemons/command_runner.py:369"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-006d85b4a3351a35", "name": "Network/subprocess call without timeout or try/except \u2014 gateway/daemons/inbox_dispatcher.py:323", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 gateway/daemons/inbox_dispatcher.py:323"}, "fullDescription": {"text": "`subprocess.Popen(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-14ff62f4974d9c6e", "name": "Stub function `log_message` (body is just `pass`/`return`) \u2014 gateway/embedder/embedder.py:556", "shortDescription": {"text": "Stub function `log_message` (body is just `pass`/`return`) \u2014 gateway/embedder/embedder.py:556"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c344f989ae7179fc", "name": "Stub function `on_shutdown` (body is just `pass`/`return`) \u2014 gateway/plugins/sdk.py:187", "shortDescription": {"text": "Stub function `on_shutdown` (body is just `pass`/`return`) \u2014 gateway/plugins/sdk.py:187"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-40168836368422aa", "name": "53 env vars used in code but missing from .env.example", "shortDescription": {"text": "53 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AGENT_SLUG`, `ALLOWED_ORIGINS`, `CI`, `CODESPACE_NAME`, `DAEMON_DIR`, `DEPLOYMENT_MODE`, `E2B_TEMPLATE_NAME`, `E2E_LIVE` + 45 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\ntemplates/_shared/skills/hq/scripts/hq_base.py:extract_text, gateway/embedder/embedder.py:extract_text\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-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\ngateway/connectors/base.py:browse, gateway/connectors/notion/read.py:browse, gateway/connectors/_template/read.py:browse\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-06065e8f6d9c0330", "name": "Dangling fetch: GET https://api.github.com/repos/${GITHUB_REPO}/releases/latest (infra/cloudflare-install/src/index.js:4", "shortDescription": {"text": "Dangling fetch: GET https://api.github.com/repos/${GITHUB_REPO}/releases/latest (infra/cloudflare-install/src/index.js:42)"}, "fullDescription": {"text": "`infra/cloudflare-install/src/index.js:42` calls `GET https://api.github.com/repos/${GITHUB_REPO}/releases/latest` 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.github.com/repos/<p>/releases/latest`\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-14fb6bf434c5c88a", "name": "Dangling fetch: POST /api/workspaces/switch (apps/ui/src/components/workspaces/workspace-switcher.tsx:31)", "shortDescription": {"text": "Dangling fetch: POST /api/workspaces/switch (apps/ui/src/components/workspaces/workspace-switcher.tsx:31)"}, "fullDescription": {"text": "`apps/ui/src/components/workspaces/workspace-switcher.tsx:31` calls `POST /api/workspaces/switch` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workspaces/switch`\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-cb062e50ec1975d7", "name": "Dangling fetch: PATCH /api/workspaces/${workspace.id} (apps/ui/src/components/workspaces/database-settings.tsx:229)", "shortDescription": {"text": "Dangling fetch: PATCH /api/workspaces/${workspace.id} (apps/ui/src/components/workspaces/database-settings.tsx:229)"}, "fullDescription": {"text": "`apps/ui/src/components/workspaces/database-settings.tsx:229` calls `PATCH /api/workspaces/${workspace.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workspaces/<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-ef8b8f754127ac7b", "name": "Dangling fetch: PATCH /api/workspaces/${workspace.id} (apps/ui/src/components/workspaces/database-settings.tsx:334)", "shortDescription": {"text": "Dangling fetch: PATCH /api/workspaces/${workspace.id} (apps/ui/src/components/workspaces/database-settings.tsx:334)"}, "fullDescription": {"text": "`apps/ui/src/components/workspaces/database-settings.tsx:334` calls `PATCH /api/workspaces/${workspace.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workspaces/<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-828375edbc3015a5", "name": "Dangling fetch: DELETE /api/workspaces/${workspace.id} (apps/ui/src/components/workspaces/database-settings.tsx:415)", "shortDescription": {"text": "Dangling fetch: DELETE /api/workspaces/${workspace.id} (apps/ui/src/components/workspaces/database-settings.tsx:415)"}, "fullDescription": {"text": "`apps/ui/src/components/workspaces/database-settings.tsx:415` calls `DELETE /api/workspaces/${workspace.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workspaces/<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-272ed0b97d0138a1", "name": "Dangling fetch: POST /api/workspaces/validate (apps/ui/src/components/workspaces/add-workspace-dialog.tsx:37)", "shortDescription": {"text": "Dangling fetch: POST /api/workspaces/validate (apps/ui/src/components/workspaces/add-workspace-dialog.tsx:37)"}, "fullDescription": {"text": "`apps/ui/src/components/workspaces/add-workspace-dialog.tsx:37` calls `POST /api/workspaces/validate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workspaces/validate`\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-7bfe1afe5856eaf4", "name": "Dangling fetch: POST /api/workspaces (apps/ui/src/components/workspaces/add-workspace-dialog.tsx:55)", "shortDescription": {"text": "Dangling fetch: POST /api/workspaces (apps/ui/src/components/workspaces/add-workspace-dialog.tsx:55)"}, "fullDescription": {"text": "`apps/ui/src/components/workspaces/add-workspace-dialog.tsx:55` calls `POST /api/workspaces` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/workspaces`\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-d9c1dd3a5866610d", "name": "Dangling fetch: POST /api/sources/validate (apps/ui/src/components/sources/provider-picker-dialog.tsx:138)", "shortDescription": {"text": "Dangling fetch: POST /api/sources/validate (apps/ui/src/components/sources/provider-picker-dialog.tsx:138)"}, "fullDescription": {"text": "`apps/ui/src/components/sources/provider-picker-dialog.tsx:138` calls `POST /api/sources/validate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sources/validate`\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-33fa002f2d7771d3", "name": "Dangling fetch: PUT /api/agents/${slug}/files/${path} (apps/ui/src/components/agents/agent-file-editor.tsx:69)", "shortDescription": {"text": "Dangling fetch: PUT /api/agents/${slug}/files/${path} (apps/ui/src/components/agents/agent-file-editor.tsx:69)"}, "fullDescription": {"text": "`apps/ui/src/components/agents/agent-file-editor.tsx:69` calls `PUT /api/agents/${slug}/files/${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/<p>/files/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0e1bf6b0d2ec0264", "name": "Dangling fetch: GET /api/agents/${slug}/files (apps/ui/src/components/agents/agent-file-browser.tsx:35)", "shortDescription": {"text": "Dangling fetch: GET /api/agents/${slug}/files (apps/ui/src/components/agents/agent-file-browser.tsx:35)"}, "fullDescription": {"text": "`apps/ui/src/components/agents/agent-file-browser.tsx:35` calls `GET /api/agents/${slug}/files` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/<p>/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-95d338b5d9351346", "name": "Dangling fetch: GET /api/agents/${slug}/files/${path} (apps/ui/src/components/agents/agent-file-browser.tsx:92)", "shortDescription": {"text": "Dangling fetch: GET /api/agents/${slug}/files/${path} (apps/ui/src/components/agents/agent-file-browser.tsx:92)"}, "fullDescription": {"text": "`apps/ui/src/components/agents/agent-file-browser.tsx:92` calls `GET /api/agents/${slug}/files/${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/<p>/files/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ec8bcd9cbc823728", "name": "Dangling fetch: POST /api/agents/${slug}/files/${path} (apps/ui/src/components/agents/agent-file-browser.tsx:111)", "shortDescription": {"text": "Dangling fetch: POST /api/agents/${slug}/files/${path} (apps/ui/src/components/agents/agent-file-browser.tsx:111)"}, "fullDescription": {"text": "`apps/ui/src/components/agents/agent-file-browser.tsx:111` calls `POST /api/agents/${slug}/files/${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/<p>/files/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f9d0681e4a161407", "name": "Dangling fetch: GET /api/agents/templates (apps/ui/src/components/agents/agent-create-wizard.tsx:97)", "shortDescription": {"text": "Dangling fetch: GET /api/agents/templates (apps/ui/src/components/agents/agent-create-wizard.tsx:97)"}, "fullDescription": {"text": "`apps/ui/src/components/agents/agent-create-wizard.tsx:97` calls `GET /api/agents/templates` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/templates`\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-6b193ad001f73bc5", "name": "Dangling fetch: GET /api/agents/${slug}/browser/state (apps/ui/src/components/agents/agent-browser-tab.tsx:63)", "shortDescription": {"text": "Dangling fetch: GET /api/agents/${slug}/browser/state (apps/ui/src/components/agents/agent-browser-tab.tsx:63)"}, "fullDescription": {"text": "`apps/ui/src/components/agents/agent-browser-tab.tsx:63` calls `GET /api/agents/${slug}/browser/state` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/<p>/browser/state`\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-7681a70af491427c", "name": "Dangling fetch: GET /api/agents/${slug}/browser/screenshot (apps/ui/src/components/agents/agent-browser-tab.tsx:64)", "shortDescription": {"text": "Dangling fetch: GET /api/agents/${slug}/browser/screenshot (apps/ui/src/components/agents/agent-browser-tab.tsx:64)"}, "fullDescription": {"text": "`apps/ui/src/components/agents/agent-browser-tab.tsx:64` calls `GET /api/agents/${slug}/browser/screenshot` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/<p>/browser/screenshot`\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-b1fa12a044f5be4f", "name": "Dangling fetch: GET /api/agents/${slug}/files/${filename} (apps/ui/src/components/agents/agent-personality-tab.tsx:47)", "shortDescription": {"text": "Dangling fetch: GET /api/agents/${slug}/files/${filename} (apps/ui/src/components/agents/agent-personality-tab.tsx:47)"}, "fullDescription": {"text": "`apps/ui/src/components/agents/agent-personality-tab.tsx:47` calls `GET /api/agents/${slug}/files/${filename}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/<p>/files/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c78c31de65bfc484", "name": "Dangling fetch: PUT /api/agents/${slug}/files/${filename} (apps/ui/src/components/agents/agent-personality-tab.tsx:187)", "shortDescription": {"text": "Dangling fetch: PUT /api/agents/${slug}/files/${filename} (apps/ui/src/components/agents/agent-personality-tab.tsx:187)"}, "fullDescription": {"text": "`apps/ui/src/components/agents/agent-personality-tab.tsx:187` calls `PUT /api/agents/${slug}/files/${filename}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/agents/<p>/files/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3067beae0df8eb1b", "name": "Dangling fetch: GET /api/gateways/${agent.gateway_id}/desktop (apps/ui/src/components/agents/agent-detail-tabs.tsx:112)", "shortDescription": {"text": "Dangling fetch: GET /api/gateways/${agent.gateway_id}/desktop (apps/ui/src/components/agents/agent-detail-tabs.tsx:112)"}, "fullDescription": {"text": "`apps/ui/src/components/agents/agent-detail-tabs.tsx:112` calls `GET /api/gateways/${agent.gateway_id}/desktop` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/gateways/<p>/desktop`\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-c1c39647357c9459", "name": "Dangling fetch: GET https://api.openai.com/v1/models (apps/ui/src/app/api/onboarding/validate-provider/route.ts:30)", "shortDescription": {"text": "Dangling fetch: GET https://api.openai.com/v1/models (apps/ui/src/app/api/onboarding/validate-provider/route.ts:30)"}, "fullDescription": {"text": "`apps/ui/src/app/api/onboarding/validate-provider/route.ts:30` calls `GET https://api.openai.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.openai.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-5c797a2767ab7ca1", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/ui/src/app/api/onboarding/validate-provider/route.ts:48", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/ui/src/app/api/onboarding/validate-provider/route.ts:48)"}, "fullDescription": {"text": "`apps/ui/src/app/api/onboarding/validate-provider/route.ts:48` 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-7e4ebc547cf38b4d", "name": "Dangling fetch: GET http://localhost:11434/api/tags (apps/ui/src/app/api/onboarding/validate-provider/route.ts:71)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:11434/api/tags (apps/ui/src/app/api/onboarding/validate-provider/route.ts:71)"}, "fullDescription": {"text": "`apps/ui/src/app/api/onboarding/validate-provider/route.ts:71` calls `GET http://localhost:11434/api/tags` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:11434/api/tags`\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-33a97a0a8230fb27", "name": "Dangling fetch: POST /api/embed (apps/ui/src/hooks/use-universal-search.ts:268)", "shortDescription": {"text": "Dangling fetch: POST /api/embed (apps/ui/src/hooks/use-universal-search.ts:268)"}, "fullDescription": {"text": "`apps/ui/src/hooks/use-universal-search.ts:268` calls `POST /api/embed` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/embed`\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-d156dd195e7733b7", "name": "Dangling fetch: POST /api/sources/browse (apps/ui/src/hooks/use-source-browse.ts:31)", "shortDescription": {"text": "Dangling fetch: POST /api/sources/browse (apps/ui/src/hooks/use-source-browse.ts:31)"}, "fullDescription": {"text": "`apps/ui/src/hooks/use-source-browse.ts:31` calls `POST /api/sources/browse` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sources/browse`\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-a2aae02404554140", "name": "Dangling fetch: POST /api/sources/validate (apps/ui/src/hooks/use-source-browse.ts:69)", "shortDescription": {"text": "Dangling fetch: POST /api/sources/validate (apps/ui/src/hooks/use-source-browse.ts:69)"}, "fullDescription": {"text": "`apps/ui/src/hooks/use-source-browse.ts:69` calls `POST /api/sources/validate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sources/validate`\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-6e4ec106b55587fb", "name": "Unused endpoint: USE /users/*", "shortDescription": {"text": "Unused endpoint: USE /users/*"}, "fullDescription": {"text": "`apps/worker/src/index.ts` declares `USE /users/*` 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-afcde812d16c784a", "name": "Unused endpoint: USE /workspaces/*", "shortDescription": {"text": "Unused endpoint: USE /workspaces/*"}, "fullDescription": {"text": "`apps/worker/src/index.ts` declares `USE /workspaces/*` 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-4313a1eb4846b0e7", "name": "Unused endpoint: USE /checkout", "shortDescription": {"text": "Unused endpoint: USE /checkout"}, "fullDescription": {"text": "`apps/worker/src/index.ts` declares `USE /checkout` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1dfcc9529630142e", "name": "Unused endpoint: POST /webhooks/stripe", "shortDescription": {"text": "Unused endpoint: POST /webhooks/stripe"}, "fullDescription": {"text": "`apps/worker/src/routes/stripe-webhook.ts` declares `POST /webhooks/stripe` 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-44b5c8cdad0898e6", "name": "Unused endpoint: GET /users/by-email/:email", "shortDescription": {"text": "Unused endpoint: GET /users/by-email/:email"}, "fullDescription": {"text": "`apps/worker/src/routes/workspaces.ts` declares `GET /users/by-email/:email` 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-2c59d85a3ab2bcee", "name": "Unused endpoint: GET /workspaces/:id/connection", "shortDescription": {"text": "Unused endpoint: GET /workspaces/:id/connection"}, "fullDescription": {"text": "`apps/worker/src/routes/workspaces.ts` declares `GET /workspaces/:id/connection` 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-951f960722673486", "name": "Unused endpoint: PATCH /workspaces/:id/onboarding", "shortDescription": {"text": "Unused endpoint: PATCH /workspaces/:id/onboarding"}, "fullDescription": {"text": "`apps/worker/src/routes/workspaces.ts` declares `PATCH /workspaces/:id/onboarding` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-acca718c0d478df7", "name": "Unused endpoint: GET /workspaces/:id/status", "shortDescription": {"text": "Unused endpoint: GET /workspaces/:id/status"}, "fullDescription": {"text": "`apps/worker/src/routes/workspaces.ts` declares `GET /workspaces/: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-756dadb8c26fb50b", "name": "Unused endpoint: GET /users/:userId/workspaces", "shortDescription": {"text": "Unused endpoint: GET /users/:userId/workspaces"}, "fullDescription": {"text": "`apps/worker/src/routes/workspaces.ts` declares `GET /users/:userId/workspaces` 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-f2a2c824be628bfd", "name": "Unused endpoint: GET /workspaces/:id/siblings", "shortDescription": {"text": "Unused endpoint: GET /workspaces/:id/siblings"}, "fullDescription": {"text": "`apps/worker/src/routes/workspaces.ts` declares `GET /workspaces/:id/siblings` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6385cd0e163a390f", "name": "Unused endpoint: POST /checkout", "shortDescription": {"text": "Unused endpoint: POST /checkout"}, "fullDescription": {"text": "`apps/worker/src/routes/workspaces.ts` declares `POST /checkout` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1ef1929048bdce27", "name": "Unused endpoint: POST /workspaces/:id/verify-payment", "shortDescription": {"text": "Unused endpoint: POST /workspaces/:id/verify-payment"}, "fullDescription": {"text": "`apps/worker/src/routes/workspaces.ts` declares `POST /workspaces/:id/verify-payment` 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-6a106659250cbcfe", "name": "Unused endpoint: POST /workspaces/:id/retry-provision", "shortDescription": {"text": "Unused endpoint: POST /workspaces/:id/retry-provision"}, "fullDescription": {"text": "`apps/worker/src/routes/workspaces.ts` declares `POST /workspaces/:id/retry-provision` 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-118695b289db15a1", "name": "Unused endpoint: POST /workspaces/:id/cancel", "shortDescription": {"text": "Unused endpoint: POST /workspaces/:id/cancel"}, "fullDescription": {"text": "`apps/worker/src/routes/workspaces.ts` declares `POST /workspaces/:id/cancel` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9f292f7edb459bd2", "name": "Unused endpoint: POST /workspaces/:id/touch", "shortDescription": {"text": "Unused endpoint: POST /workspaces/:id/touch"}, "fullDescription": {"text": "`apps/worker/src/routes/workspaces.ts` declares `POST /workspaces/:id/touch` 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-e8dbfd8fabe46bea", "name": "Unused endpoint: POST /workspaces/:id/billing-portal", "shortDescription": {"text": "Unused endpoint: POST /workspaces/:id/billing-portal"}, "fullDescription": {"text": "`apps/worker/src/routes/workspaces.ts` declares `POST /workspaces/:id/billing-portal` 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/23343"}, "properties": {"repository": "yourhq/yourhq", "repoUrl": "https://github.com/yourhq/yourhq", "branch": "main"}, "results": [{"ruleId": "scanner-239ffc01838283f8", "level": "note", "message": {"text": "Possibly dead Python function: embedding_source_hash"}, "properties": {"repobilityId": "37e6ded3e19e7e88", "scanner": "scanner-primary", "fingerprint": "239ffc01838283f8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "templates/_shared/skills/hq/scripts/hq_base.py:348"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-03c5fc438ac75c0d", "level": "note", "message": {"text": "Possibly dead Python function: log_message"}, "properties": {"repobilityId": "965f3150b4af5b2e", "scanner": "scanner-primary", "fingerprint": "03c5fc438ac75c0d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/files_api.py:267"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e9f0ec2ea6be0c69", "level": "note", "message": {"text": "Possibly dead Python function: do_PUT"}, "properties": {"repobilityId": "f9a37cbbb16037bf", "scanner": "scanner-primary", "fingerprint": "e9f0ec2ea6be0c69", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/files_api.py:411"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-129d0105e4475bc5", "level": "note", "message": {"text": "Possibly dead Python function: do_DELETE"}, "properties": {"repobilityId": "f3eb582f191adaea", "scanner": "scanner-primary", "fingerprint": "129d0105e4475bc5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/files_api.py:587"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e401d5488dfb9013", "level": "note", "message": {"text": "Possibly dead Python function: list_items"}, "properties": {"repobilityId": "b0229e8ac9b78fc5", "scanner": "scanner-primary", "fingerprint": "e401d5488dfb9013", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/connectors/notion/read.py:138"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-66428d3588c6f6de", "level": "note", "message": {"text": "Possibly dead Python function: list_actions"}, "properties": {"repobilityId": "6ed67bd0b91240b2", "scanner": "scanner-primary", "fingerprint": "66428d3588c6f6de", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/connectors/_template/write.py:7"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a5025a2f626a83c8", "level": "note", "message": {"text": "Possibly dead Python function: list_items"}, "properties": {"repobilityId": "b0229e8ac9b78fc5", "scanner": "scanner-primary", "fingerprint": "a5025a2f626a83c8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/connectors/_template/read.py:33"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-003d83baddd918c7", "level": "note", "message": {"text": "Possibly dead Python function: beat"}, "properties": {"repobilityId": "3106fa1edee16a4a", "scanner": "scanner-primary", "fingerprint": "003d83baddd918c7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/daemons/plugin_runner.py:435"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5409fb9e1f323e2c", "level": "note", "message": {"text": "Possibly dead Python function: watch_auth_stdout"}, "properties": {"repobilityId": "77c81913761da20c", "scanner": "scanner-primary", "fingerprint": "5409fb9e1f323e2c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/daemons/command_runner.py:475"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-90966cb017279ad7", "level": "note", "message": {"text": "Possibly dead Python function: handle_auth_start"}, "properties": {"repobilityId": "9e03fe92da9a8d62", "scanner": "scanner-primary", "fingerprint": "90966cb017279ad7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/daemons/command_runner.py:727"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4853f4e1b2376340", "level": "note", "message": {"text": "Possibly dead Python function: handle_auth_paste"}, "properties": {"repobilityId": "a86f8b39db058669", "scanner": "scanner-primary", "fingerprint": "4853f4e1b2376340", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/daemons/command_runner.py:958"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c1ce4b20c7cf4bc6", "level": "note", "message": {"text": "Possibly dead Python function: handle_auth_list"}, "properties": {"repobilityId": "67438cbc65bb2c6c", "scanner": "scanner-primary", "fingerprint": "c1ce4b20c7cf4bc6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/daemons/command_runner.py:1039"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e4a7829e358aa045", "level": "note", "message": {"text": "Possibly dead Python function: handle_auth_remove"}, "properties": {"repobilityId": "1d764a713373e48f", "scanner": "scanner-primary", "fingerprint": "e4a7829e358aa045", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/daemons/command_runner.py:1101"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-33a9ea5590818fa4", "level": "note", "message": {"text": "Possibly dead Python function: handle_auth_refresh"}, "properties": {"repobilityId": "224d7c737da16005", "scanner": "scanner-primary", "fingerprint": "33a9ea5590818fa4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/daemons/command_runner.py:1194"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-671a6e2cba4212ec", "level": "note", "message": {"text": "Possibly dead Python function: handle_set_agent_model"}, "properties": {"repobilityId": "37e89b09e2f42093", "scanner": "scanner-primary", "fingerprint": "671a6e2cba4212ec", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/daemons/command_runner.py:1513"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8edd6dc4401633c5", "level": "note", "message": {"text": "Possibly dead Python function: handle_list_models"}, "properties": {"repobilityId": "03f95531699e5731", "scanner": "scanner-primary", "fingerprint": "8edd6dc4401633c5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/daemons/command_runner.py:1613"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa3e5748653bba14", "level": "note", "message": {"text": "Possibly dead Python function: handle_source_write"}, "properties": {"repobilityId": "0e2cb2de103d4fc7", "scanner": "scanner-primary", "fingerprint": "aa3e5748653bba14", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/daemons/command_runner.py:1672"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a1cbeb590f20a70d", "level": "note", "message": {"text": "Possibly dead Python function: handle_collection_list"}, "properties": {"repobilityId": "d972fe55f6dd9d29", "scanner": "scanner-primary", "fingerprint": "a1cbeb590f20a70d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/daemons/command_runner.py:1769"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fff4204ed567c98a", "level": "note", "message": {"text": "Possibly dead Python function: handle_collection_query"}, "properties": {"repobilityId": "c00e056e9184c4a0", "scanner": "scanner-primary", "fingerprint": "fff4204ed567c98a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/daemons/command_runner.py:1823"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c5976667e8271caa", "level": "note", "message": {"text": "Possibly dead Python function: handle_collection_record_create"}, "properties": {"repobilityId": "3b1b1c83c8facf48", "scanner": "scanner-primary", "fingerprint": "c5976667e8271caa", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/daemons/command_runner.py:1908"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ab3b88322599bed8", "level": "note", "message": {"text": "Possibly dead Python function: handle_collection_record_update"}, "properties": {"repobilityId": "1326538c2009be13", "scanner": "scanner-primary", "fingerprint": "ab3b88322599bed8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/daemons/command_runner.py:1973"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b456de24226174cb", "level": "note", "message": {"text": "Possibly dead Python function: loop"}, "properties": {"repobilityId": "ef7a4029179da27e", "scanner": "scanner-primary", "fingerprint": "b456de24226174cb", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/daemons/command_runner.py:2469"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bcbf63ea99ec0a23", "level": "note", "message": {"text": "Possibly dead Python function: beat"}, "properties": {"repobilityId": "3106fa1edee16a4a", "scanner": "scanner-primary", "fingerprint": "bcbf63ea99ec0a23", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/daemons/command_runner.py:2300"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8163272605aecf5b", "level": "note", "message": {"text": "Possibly dead Python function: loop"}, "properties": {"repobilityId": "ef7a4029179da27e", "scanner": "scanner-primary", "fingerprint": "8163272605aecf5b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/daemons/inbox_dispatcher.py:446"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-809d0ec84aec0271", "level": "note", "message": {"text": "Possibly dead Python function: beat"}, "properties": {"repobilityId": "3106fa1edee16a4a", "scanner": "scanner-primary", "fingerprint": "809d0ec84aec0271", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/daemons/inbox_dispatcher.py:491"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-118426786376d915", "level": "note", "message": {"text": "Possibly dead Python function: warm_model_loop"}, "properties": {"repobilityId": "68196b16939e4615", "scanner": "scanner-primary", "fingerprint": "118426786376d915", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/embedder/embedder.py:156"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-68072a31a629860b", "level": "note", "message": {"text": "Possibly dead Python function: indexing_loop"}, "properties": {"repobilityId": "6d2fce75b7f44ca0", "scanner": "scanner-primary", "fingerprint": "68072a31a629860b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/embedder/embedder.py:423"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3aed959e196d2faa", "level": "note", "message": {"text": "Possibly dead Python function: log_message"}, "properties": {"repobilityId": "965f3150b4af5b2e", "scanner": "scanner-primary", "fingerprint": "3aed959e196d2faa", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/embedder/embedder.py:556"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-30a01d5b791b8185", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/ui/src/__tests__/lib/markdown-to-tiptap.test.ts:173"}, "properties": {"repobilityId": "700eb4d1b0a3db5f", "scanner": "scanner-primary", "fingerprint": "30a01d5b791b8185", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dd76d8bb3bc26227", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/ui/src/components/theme-applier.tsx:53"}, "properties": {"repobilityId": "0520cf3e35fa69ab", "scanner": "scanner-primary", "fingerprint": "dd76d8bb3bc26227", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1ad7bc1040ff87b3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/dashboard-shell.tsx:181"}, "properties": {"repobilityId": "d9e93f8bfa7b4a3d", "scanner": "scanner-primary", "fingerprint": "1ad7bc1040ff87b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7b156f95f73cc4fe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/notifications/notification-feed.tsx:169"}, "properties": {"repobilityId": "d2ff38c4825debf7", "scanner": "scanner-primary", "fingerprint": "7b156f95f73cc4fe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-56a5dd8bbd65a311", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/networking/networking-settings.tsx:189"}, "properties": {"repobilityId": "e0912bb8683beb52", "scanner": "scanner-primary", "fingerprint": "56a5dd8bbd65a311", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-82d42d96d25b9abc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/workspaces/workspace-switcher.tsx:68"}, "properties": {"repobilityId": "bd4587541d8db5a7", "scanner": "scanner-primary", "fingerprint": "82d42d96d25b9abc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3fa70703619c3ed7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/workspaces/database-settings.tsx:109"}, "properties": {"repobilityId": "82504c21d647c473", "scanner": "scanner-primary", "fingerprint": "3fa70703619c3ed7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7d973a56464eea86", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/header-bar.tsx:246"}, "properties": {"repobilityId": "4a5588b85b53d9a5", "scanner": "scanner-primary", "fingerprint": "7d973a56464eea86", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84c2708712123d0d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/entity-link-picker.tsx:204"}, "properties": {"repobilityId": "62ab9118baed77eb", "scanner": "scanner-primary", "fingerprint": "84c2708712123d0d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-77f76cb16d278cab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/command-palette.tsx:221"}, "properties": {"repobilityId": "efb4d9570c55672e", "scanner": "scanner-primary", "fingerprint": "77f76cb16d278cab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-50df749448fcc35d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/folder-tree.tsx:436"}, "properties": {"repobilityId": "a78a394f1e49f1b8", "scanner": "scanner-primary", "fingerprint": "50df749448fcc35d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-15fb7e3e7394eacb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/pipeline-stage-picker.tsx:109"}, "properties": {"repobilityId": "a2afa484cc7f9efc", "scanner": "scanner-primary", "fingerprint": "15fb7e3e7394eacb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e644539fcc86151c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/detail-header.tsx:68"}, "properties": {"repobilityId": "c8256379ddde6141", "scanner": "scanner-primary", "fingerprint": "e644539fcc86151c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9fc5c141d52f80ba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/select-field-picker.tsx:70"}, "properties": {"repobilityId": "391665e23db4d10e", "scanner": "scanner-primary", "fingerprint": "9fc5c141d52f80ba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-df331b00d16d1e18", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/entity-link-list.tsx:61"}, "properties": {"repobilityId": "d8ace5a0f9eb2ac6", "scanner": "scanner-primary", "fingerprint": "df331b00d16d1e18", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bec5a8c120fbf41b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/property-list.tsx:194"}, "properties": {"repobilityId": "4445b782ff682ab5", "scanner": "scanner-primary", "fingerprint": "bec5a8c120fbf41b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a4c4441c147dc83a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/shared/page-header.tsx:49"}, "properties": {"repobilityId": "3f0c39ea12249cab", "scanner": "scanner-primary", "fingerprint": "a4c4441c147dc83a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bd9976fea6082267", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/ui/src/components/ui/chart.tsx:83"}, "properties": {"repobilityId": "139a5ee26688ab08", "scanner": "scanner-primary", "fingerprint": "bd9976fea6082267", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-916c0537daa324cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/ui/status-dot.tsx:31"}, "properties": {"repobilityId": "adb7915eab0847b4", "scanner": "scanner-primary", "fingerprint": "916c0537daa324cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d84446092db7decc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/import/preview-step.tsx:136"}, "properties": {"repobilityId": "b11cb215983a2758", "scanner": "scanner-primary", "fingerprint": "d84446092db7decc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2932ffb15b55c63e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/import/mapping-step.tsx:189"}, "properties": {"repobilityId": "904eabbd3676a471", "scanner": "scanner-primary", "fingerprint": "2932ffb15b55c63e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9d1aadfe68b2c711", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/sources/source-connection-detail.tsx:424"}, "properties": {"repobilityId": "f88c3fa3e6ef93b7", "scanner": "scanner-primary", "fingerprint": "9d1aadfe68b2c711", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e38934d722471718", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/sources/source-content-picker.tsx:422"}, "properties": {"repobilityId": "d567615e2491be7c", "scanner": "scanner-primary", "fingerprint": "e38934d722471718", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-02106b879a90f9d6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/routines/routines-table.tsx:85"}, "properties": {"repobilityId": "6b29394d942797be", "scanner": "scanner-primary", "fingerprint": "02106b879a90f9d6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e3cb6ceb32463ebc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/routines/routine-form.tsx:847"}, "properties": {"repobilityId": "9ed90fcfc10de245", "scanner": "scanner-primary", "fingerprint": "e3cb6ceb32463ebc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b3b3d6bf36a29ec7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/comment-form.tsx:153"}, "properties": {"repobilityId": "3f8dac1930ac91fb", "scanner": "scanner-primary", "fingerprint": "b3b3d6bf36a29ec7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f6ceef15b0ee59ad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-model-override.tsx:161"}, "properties": {"repobilityId": "7061e36d06aed732", "scanner": "scanner-primary", "fingerprint": "f6ceef15b0ee59ad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6ed58ecb645d06a5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-timeline.tsx:89"}, "properties": {"repobilityId": "47feae8d344de6c4", "scanner": "scanner-primary", "fingerprint": "6ed58ecb645d06a5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bc528cdcf7931bf7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-card.tsx:66"}, "properties": {"repobilityId": "3556df0f562db978", "scanner": "scanner-primary", "fingerprint": "bc528cdcf7931bf7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-59d025aa32fd071c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/mention-autocomplete.tsx:102"}, "properties": {"repobilityId": "a4218fd72383d765", "scanner": "scanner-primary", "fingerprint": "59d025aa32fd071c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c2cac98186e5c34d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/comment-thread.tsx:68"}, "properties": {"repobilityId": "f331f4c8686f0476", "scanner": "scanner-primary", "fingerprint": "c2cac98186e5c34d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-81e568494e905c2a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-list.tsx:210"}, "properties": {"repobilityId": "35e2fc8756caab68", "scanner": "scanner-primary", "fingerprint": "81e568494e905c2a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-364a3c7959c97f21", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/series-list-view.tsx:104"}, "properties": {"repobilityId": "154c7dff2575bc3c", "scanner": "scanner-primary", "fingerprint": "364a3c7959c97f21", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-545ef9acedc2e996", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-template-launcher.tsx:98"}, "properties": {"repobilityId": "9d870cc8b88739c2", "scanner": "scanner-primary", "fingerprint": "545ef9acedc2e996", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-73faf0a5abbfb64d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-relations.tsx:144"}, "properties": {"repobilityId": "b2faed17d4edb9bd", "scanner": "scanner-primary", "fingerprint": "73faf0a5abbfb64d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c9e9f6242e185a2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-labels-picker.tsx:71"}, "properties": {"repobilityId": "6118b6d520c90ce9", "scanner": "scanner-primary", "fingerprint": "1c9e9f6242e185a2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-324f678e6d7b3980", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/task-calendar-view.tsx:286"}, "properties": {"repobilityId": "22b609921c04d402", "scanner": "scanner-primary", "fingerprint": "324f678e6d7b3980", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2b0872cc66f985dd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/stream-list.tsx:80"}, "properties": {"repobilityId": "2d796f9708512ff8", "scanner": "scanner-primary", "fingerprint": "2b0872cc66f985dd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2e0588da9eaaac54", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/series-form.tsx:486"}, "properties": {"repobilityId": "9c0b16e7b828d85c", "scanner": "scanner-primary", "fingerprint": "2e0588da9eaaac54", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8e4d752110201f31", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/tasks/agent-status-chip.tsx:24"}, "properties": {"repobilityId": "13870ccd79fac816", "scanner": "scanner-primary", "fingerprint": "8e4d752110201f31", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-17f443e0b476825f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-import-dialog.tsx:174"}, "properties": {"repobilityId": "df60f587d14701af", "scanner": "scanner-primary", "fingerprint": "17f443e0b476825f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0248f043f2daed15", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-record-detail.tsx:158"}, "properties": {"repobilityId": "979fe1010f69363f", "scanner": "scanner-primary", "fingerprint": "0248f043f2daed15", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-abd225e7aa4b3aa4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-cell.tsx:99"}, "properties": {"repobilityId": "62734bf86a786338", "scanner": "scanner-primary", "fingerprint": "abd225e7aa4b3aa4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-688023f15f2802b2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-index.tsx:53"}, "properties": {"repobilityId": "1cab42731b0b9112", "scanner": "scanner-primary", "fingerprint": "688023f15f2802b2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-17bce9b8c89606b5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-calendar-view.tsx:175"}, "properties": {"repobilityId": "e9bd30c11085bea9", "scanner": "scanner-primary", "fingerprint": "17bce9b8c89606b5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a13f74b2b6e26b9f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-table-view.tsx:91"}, "properties": {"repobilityId": "127d3781de9f76db", "scanner": "scanner-primary", "fingerprint": "a13f74b2b6e26b9f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6c188dc2fab59c6d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-kanban-view.tsx:168"}, "properties": {"repobilityId": "c22936f0e06f690f", "scanner": "scanner-primary", "fingerprint": "6c188dc2fab59c6d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-46ce7c88b1cec1d6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/collections/collection-field-editor.tsx:346"}, "properties": {"repobilityId": "d25ab8a925867f31", "scanner": "scanner-primary", "fingerprint": "46ce7c88b1cec1d6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5de4fdcbe7497bcd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-file-tree.tsx:172"}, "properties": {"repobilityId": "e3c1518f2113db17", "scanner": "scanner-primary", "fingerprint": "5de4fdcbe7497bcd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f664653323ad3836", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-provisioning.tsx:61"}, "properties": {"repobilityId": "8cdb376385ae3d63", "scanner": "scanner-primary", "fingerprint": "f664653323ad3836", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-19a422aba9342b57", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-file-browser.tsx:150"}, "properties": {"repobilityId": "4ef99e6be984cbac", "scanner": "scanner-primary", "fingerprint": "19a422aba9342b57", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c0a7ee11e041055", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-knowledge-section.tsx:162"}, "properties": {"repobilityId": "9401e6c7edf0e958", "scanner": "scanner-primary", "fingerprint": "1c0a7ee11e041055", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c02ca09e23a0813", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-create-wizard.tsx:459"}, "properties": {"repobilityId": "c193fb4c93f4f209", "scanner": "scanner-primary", "fingerprint": "1c02ca09e23a0813", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ee98f150d5d9b153", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-browser-tab.tsx:190"}, "properties": {"repobilityId": "20e54d1864c098b3", "scanner": "scanner-primary", "fingerprint": "ee98f150d5d9b153", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3dfa29ce65fe5c6e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-org-slice.tsx:112"}, "properties": {"repobilityId": "93f500ead43db3ab", "scanner": "scanner-primary", "fingerprint": "3dfa29ce65fe5c6e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eeda347c940ce9aa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-detail-tabs.tsx:490"}, "properties": {"repobilityId": "422ae17097d9e46f", "scanner": "scanner-primary", "fingerprint": "eeda347c940ce9aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a8a6bee8116d6c95", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-node.tsx:123"}, "properties": {"repobilityId": "a4f171c3f1100265", "scanner": "scanner-primary", "fingerprint": "a8a6bee8116d6c95", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e1bbe99818915ecd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-model-section.tsx:171"}, "properties": {"repobilityId": "0e827c16d234074a", "scanner": "scanner-primary", "fingerprint": "e1bbe99818915ecd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-09e66648d1dd74e1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/agents/agent-card.tsx:134"}, "properties": {"repobilityId": "eb8358c3c1f5cc99", "scanner": "scanner-primary", "fingerprint": "09e66648d1dd74e1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ae7569cfb02520bc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/organizations/org-detail.tsx:169"}, "properties": {"repobilityId": "a5621789157177b1", "scanner": "scanner-primary", "fingerprint": "ae7569cfb02520bc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-11ae50c1e5c627ce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/onboarding/wizard/step-infrastructure.tsx:795"}, "properties": {"repobilityId": "710a9d0d3337ede9", "scanner": "scanner-primary", "fingerprint": "11ae50c1e5c627ce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9402f128b79d02a4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/gateways/gateway-detail.tsx:561"}, "properties": {"repobilityId": "cf8a53bdb7643fc5", "scanner": "scanner-primary", "fingerprint": "9402f128b79d02a4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2f1916d493c5d45f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/gateways/open-desktop-modal.tsx:59"}, "properties": {"repobilityId": "28474c95f6e6104e", "scanner": "scanner-primary", "fingerprint": "2f1916d493c5d45f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-020db6ca5036f53c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/gateways/gateways-settings.tsx:233"}, "properties": {"repobilityId": "aff96c8e25e5f5d4", "scanner": "scanner-primary", "fingerprint": "020db6ca5036f53c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bb7502b4eb95adf4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/contact-organizations-section.tsx:117"}, "properties": {"repobilityId": "caee3d81c4ef5861", "scanner": "scanner-primary", "fingerprint": "bb7502b4eb95adf4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-14a40e1ed5581462", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/draft-sets-section.tsx:402"}, "properties": {"repobilityId": "ebd148104729da24", "scanner": "scanner-primary", "fingerprint": "14a40e1ed5581462", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c95985abc2479782", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/contact-detail-view.tsx:470"}, "properties": {"repobilityId": "a46c012ccdd099f1", "scanner": "scanner-primary", "fingerprint": "c95985abc2479782", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-58e6ee1c621862cd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/contact-preview-card.tsx:57"}, "properties": {"repobilityId": "fbae8ff80109d246", "scanner": "scanner-primary", "fingerprint": "58e6ee1c621862cd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7b2d5a9bb49fdc69", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/templates-tab.tsx:106"}, "properties": {"repobilityId": "ab7e51fcc7218e30", "scanner": "scanner-primary", "fingerprint": "7b2d5a9bb49fdc69", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4ad4b587bf60509", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/campaigns-tab.tsx:113"}, "properties": {"repobilityId": "9a4e805dd3d1d5b4", "scanner": "scanner-primary", "fingerprint": "f4ad4b587bf60509", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2a69b88a47f692e6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/contact-form.tsx:452"}, "properties": {"repobilityId": "27ec0b6d77bc08e4", "scanner": "scanner-primary", "fingerprint": "2a69b88a47f692e6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3d46c3a80042c409", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/contacts-kanban-view.tsx:235"}, "properties": {"repobilityId": "2c98bcf562ceafd6", "scanner": "scanner-primary", "fingerprint": "3d46c3a80042c409", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f2decc4e0f7b3501", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/crm/contacts-card-view.tsx:94"}, "properties": {"repobilityId": "4de6e0509cc56bd1", "scanner": "scanner-primary", "fingerprint": "f2decc4e0f7b3501", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f0e3b110f92924bd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/secrets/secret-row.tsx:49"}, "properties": {"repobilityId": "07a7a35c1320770a", "scanner": "scanner-primary", "fingerprint": "f0e3b110f92924bd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-25fba5ce0ddaffe5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/inbox/inbox-section.tsx:48"}, "properties": {"repobilityId": "1011ab8431036390", "scanner": "scanner-primary", "fingerprint": "25fba5ce0ddaffe5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dd3487e7231cc89e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/connections/connections-settings.tsx:378"}, "properties": {"repobilityId": "50b30b4493553616", "scanner": "scanner-primary", "fingerprint": "dd3487e7231cc89e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-93de2a64f325258d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/connections/agent-rail-model-section.tsx:88"}, "properties": {"repobilityId": "4ad32b5d2c42c026", "scanner": "scanner-primary", "fingerprint": "93de2a64f325258d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e9ad317719b44986", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/connections/add-connection-dialog.tsx:298"}, "properties": {"repobilityId": "cd155acaae9420de", "scanner": "scanner-primary", "fingerprint": "e9ad317719b44986", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6862ce4ba4f402e7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/connections/oauth-interactive-flow.tsx:202"}, "properties": {"repobilityId": "35a01b5c78c5fd53", "scanner": "scanner-primary", "fingerprint": "6862ce4ba4f402e7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5922b6b7d45b9c71", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/knowledge/knowledge-detail-editor.tsx:283"}, "properties": {"repobilityId": "3f917b15cd612dc5", "scanner": "scanner-primary", "fingerprint": "5922b6b7d45b9c71", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0dde986917b6d5e1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/knowledge/knowledge-grid.tsx:51"}, "properties": {"repobilityId": "ac9eb8d0f8c71cac", "scanner": "scanner-primary", "fingerprint": "0dde986917b6d5e1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3c501d4fafa2c37b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/knowledge/knowledge-list.tsx:54"}, "properties": {"repobilityId": "2825736466222c9d", "scanner": "scanner-primary", "fingerprint": "3c501d4fafa2c37b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a016b7b883c7ad32", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/plugins/plugin-row.tsx:64"}, "properties": {"repobilityId": "d742eeadc55295b7", "scanner": "scanner-primary", "fingerprint": "a016b7b883c7ad32", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-abb8bbdde5c07778", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/components/plugins/plugin-detail-dialog.tsx:150"}, "properties": {"repobilityId": "1f873bb80f26ec07", "scanner": "scanner-primary", "fingerprint": "abb8bbdde5c07778", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1079f7cbb5364155", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/fields/page.tsx:116"}, "properties": {"repobilityId": "8c85609f722be9b3", "scanner": "scanner-primary", "fingerprint": "1079f7cbb5364155", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ed7bcc7198a93602", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/sources/client.tsx:106"}, "properties": {"repobilityId": "267508ef60ea266d", "scanner": "scanner-primary", "fingerprint": "ed7bcc7198a93602", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5d5da2d0c60c5227", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/templates/page.tsx:103"}, "properties": {"repobilityId": "2372fe1618b04b35", "scanner": "scanner-primary", "fingerprint": "5d5da2d0c60c5227", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-21765d1810982361", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/logs/page.tsx:64"}, "properties": {"repobilityId": "42978bf58af9745d", "scanner": "scanner-primary", "fingerprint": "21765d1810982361", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d0ba572866a8cb4a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/pipeline/page.tsx:137"}, "properties": {"repobilityId": "714d0e96cd3f8628", "scanner": "scanner-primary", "fingerprint": "d0ba572866a8cb4a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c150d0c831165d17", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/account/page.tsx:176"}, "properties": {"repobilityId": "6eecb900d9f5be83", "scanner": "scanner-primary", "fingerprint": "c150d0c831165d17", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2ecc4327ab7e9126", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/labels/page.tsx:157"}, "properties": {"repobilityId": "3764dfb8a3d34246", "scanner": "scanner-primary", "fingerprint": "2ecc4327ab7e9126", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-baf1c706cd0da36a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/settings/appearance/page.tsx:109"}, "properties": {"repobilityId": "5c934a7fb63847e8", "scanner": "scanner-primary", "fingerprint": "baf1c706cd0da36a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c4c3adb03e2eb0b9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/components/pulse-system-tab.tsx:57"}, "properties": {"repobilityId": "2a6bbe8883c9f021", "scanner": "scanner-primary", "fingerprint": "c4c3adb03e2eb0b9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5956e2a58738688b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/components/pulse-usage-tab.tsx:122"}, "properties": {"repobilityId": "0cd42bf4e026378a", "scanner": "scanner-primary", "fingerprint": "5956e2a58738688b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2e5807b7ffc421ca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/components/triage-item-row.tsx:135"}, "properties": {"repobilityId": "2427eae705b7d0e6", "scanner": "scanner-primary", "fingerprint": "2e5807b7ffc421ca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-34ef8b3a7c123f75", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/components/pulse-spend-tab.tsx:163"}, "properties": {"repobilityId": "76c5858aa3d9fe7b", "scanner": "scanner-primary", "fingerprint": "34ef8b3a7c123f75", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e22082d9f382e0b5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/app/dashboard/components/agent-grid-card.tsx:65"}, "properties": {"repobilityId": "463f1e4ec29afe8b", "scanner": "scanner-primary", "fingerprint": "e22082d9f382e0b5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-60c4912293c4d178", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/lib/columns/extended-columns.tsx:58"}, "properties": {"repobilityId": "5d469906cf1cc380", "scanner": "scanner-primary", "fingerprint": "60c4912293c4d178", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2c05909fe28b7a2c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/lib/columns/org-columns.tsx:35"}, "properties": {"repobilityId": "fd3ace02fd820c98", "scanner": "scanner-primary", "fingerprint": "2c05909fe28b7a2c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-edf005e9b598c140", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/ui/src/lib/columns/contact-columns.tsx:39"}, "properties": {"repobilityId": "373ba3b68711153f", "scanner": "scanner-primary", "fingerprint": "edf005e9b598c140", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7e10ae8a7aa0c7b3", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/ui/src/lib/workspaces/parse-url.ts:34"}, "properties": {"repobilityId": "421455c34e55195b", "scanner": "scanner-primary", "fingerprint": "7e10ae8a7aa0c7b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-add0ec1201aa4568", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/worker/src/index.ts:44"}, "properties": {"repobilityId": "6b15428f22f375c6", "scanner": "scanner-primary", "fingerprint": "add0ec1201aa4568", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c81817b8a94c27d9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/worker/src/providers/e2b.ts:62"}, "properties": {"repobilityId": "c68d83f143de0c47", "scanner": "scanner-primary", "fingerprint": "c81817b8a94c27d9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5a24cfaf44901e56", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/worker/src/lib/schema-runner.ts:15"}, "properties": {"repobilityId": "cefe42269aa1be5f", "scanner": "scanner-primary", "fingerprint": "5a24cfaf44901e56", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a67bc33155c4ae58", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/worker/src/routes/stripe-webhook.ts:251"}, "properties": {"repobilityId": "855d729c627bec08", "scanner": "scanner-primary", "fingerprint": "a67bc33155c4ae58", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2fef9959427769fb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/worker/src/loops/cleanup.ts:21"}, "properties": {"repobilityId": "149290246e252d70", "scanner": "scanner-primary", "fingerprint": "2fef9959427769fb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d2dcb5335e9bbadf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/worker/src/loops/sandbox-health.ts:108"}, "properties": {"repobilityId": "77f033b56c9d63cb", "scanner": "scanner-primary", "fingerprint": "d2dcb5335e9bbadf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-76c018360ad4b8b9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/migrate/src/cli.ts:7"}, "properties": {"repobilityId": "8807afa308182897", "scanner": "scanner-primary", "fingerprint": "76c018360ad4b8b9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ddbfb523794b28cb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/journeys/solopreneur.spec.ts:124"}, "properties": {"repobilityId": "256daf38a4ef9b5b", "scanner": "scanner-primary", "fingerprint": "ddbfb523794b28cb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-21e0443d3daef935", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/specs/10-channels.spec.ts:59"}, "properties": {"repobilityId": "b9d0f62c76ed33be", "scanner": "scanner-primary", "fingerprint": "21e0443d3daef935", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7e2208be57eb599e", "level": "warning", "message": {"text": "Privileged port 10 in use"}, "properties": {"repobilityId": "735372d6b5594915", "scanner": "scanner-primary", "fingerprint": "7e2208be57eb599e", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "db/tests/run-db-tests.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6120820575fae863", "level": "warning", "message": {"text": "Privileged port 14 in use"}, "properties": {"repobilityId": "2dbd4b719a1412ff", "scanner": "scanner-primary", "fingerprint": "6120820575fae863", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "db/tests/run-db-tests.sh"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f223dc992b07d2e9", "level": "warning", "message": {"text": "Privileged port 13 in use"}, "properties": {"repobilityId": "79d721e4d6f64798", "scanner": "scanner-primary", "fingerprint": "f223dc992b07d2e9", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/codeql.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-20816f8d1b6155b5", "level": "warning", "message": {"text": "Dockerfile runs as root: apps/ui/Dockerfile"}, "properties": {"repobilityId": "319487bcf1909dbd", "scanner": "scanner-primary", "fingerprint": "20816f8d1b6155b5", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-05f0824d4b3333b9", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:24-slim"}, "properties": {"repobilityId": "2699dceebc0a7103", "scanner": "scanner-primary", "fingerprint": "05f0824d4b3333b9", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/ui/Dockerfile"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-05f0824d4b3333b9", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:24-slim"}, "properties": {"repobilityId": "7d8da25dd0f0eda3", "scanner": "scanner-primary", "fingerprint": "05f0824d4b3333b9", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/ui/Dockerfile"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-05f0824d4b3333b9", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:24-slim"}, "properties": {"repobilityId": "a9147c021906d669", "scanner": "scanner-primary", "fingerprint": "05f0824d4b3333b9", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/ui/Dockerfile"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-f7c91ab88f796a36", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:24-slim"}, "properties": {"repobilityId": "9c35c230ddca0472", "scanner": "scanner-primary", "fingerprint": "f7c91ab88f796a36", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/worker/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f7c91ab88f796a36", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:24-slim"}, "properties": {"repobilityId": "9d1525fd9fa1e08e", "scanner": "scanner-primary", "fingerprint": "f7c91ab88f796a36", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/worker/Dockerfile"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-f7c91ab88f796a36", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:24-slim"}, "properties": {"repobilityId": "8d0e7aa687ecfb87", "scanner": "scanner-primary", "fingerprint": "f7c91ab88f796a36", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/worker/Dockerfile"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-edeffbac9d8d4492", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: ubuntu:24.04"}, "properties": {"repobilityId": "678a4f19f6afe190", "scanner": "scanner-primary", "fingerprint": "edeffbac9d8d4492", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/Dockerfile"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-04f05d350c5de9ed", "level": "error", "message": {"text": "Dockerfile pipes a remote installer into a shell"}, "properties": {"repobilityId": "467991190aa680b9", "scanner": "scanner-primary", "fingerprint": "04f05d350c5de9ed", "layer": "hardware", "severity": "high", "confidence": 1.0, "tags": ["supply-chain", "docker", "remote-installer"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/Dockerfile"}, "region": {"startLine": 54}}}]}, {"ruleId": "scanner-46db88cd586d1d20", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: ubuntu:24.04"}, "properties": {"repobilityId": "b5f4871376aac8a8", "scanner": "scanner-primary", "fingerprint": "46db88cd586d1d20", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/runner/Dockerfile"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-11e3cf62b289c0bd", "level": "error", "message": {"text": "Dockerfile pipes a remote installer into a shell"}, "properties": {"repobilityId": "3df67d40651a9334", "scanner": "scanner-primary", "fingerprint": "11e3cf62b289c0bd", "layer": "hardware", "severity": "high", "confidence": 1.0, "tags": ["supply-chain", "docker", "remote-installer"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/runner/Dockerfile"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-6c68bd96bd5fd829", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: ubuntu:24.04"}, "properties": {"repobilityId": "09c845cb2a1a340b", "scanner": "scanner-primary", "fingerprint": "6c68bd96bd5fd829", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/dispatcher/Dockerfile"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-be55e9b63297a8b9", "level": "error", "message": {"text": "Dockerfile pipes a remote installer into a shell"}, "properties": {"repobilityId": "26b6ff9c33bab1b5", "scanner": "scanner-primary", "fingerprint": "be55e9b63297a8b9", "layer": "hardware", "severity": "high", "confidence": 1.0, "tags": ["supply-chain", "docker", "remote-installer"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/dispatcher/Dockerfile"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-017fd5d3971b4103", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "38649aeb57178c63", "scanner": "scanner-primary", "fingerprint": "017fd5d3971b4103", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/embedder/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f982fe1304ec2faf", "level": "warning", "message": {"text": "Docker base image uses a mutable or implicit tag: fastembed"}, "properties": {"repobilityId": "b306eb24e5529f87", "scanner": "scanner-primary", "fingerprint": "f982fe1304ec2faf", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/embedder/Dockerfile"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-aa398afba4ecfefc", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "0acc55ea663d2cf9", "scanner": "scanner-primary", "fingerprint": "aa398afba4ecfefc", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/file-processor/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-bfa10045e9829edd", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/ui/src/components/theme-applier.tsx:53"}, "properties": {"repobilityId": "3d638ebea2728bd3", "scanner": "scanner-primary", "fingerprint": "bfa10045e9829edd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/ui/src/components/theme-applier.tsx"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-4d811d8e02579511", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/ui/src/components/ui/chart.tsx:83"}, "properties": {"repobilityId": "429dfd7de59553af", "scanner": "scanner-primary", "fingerprint": "4d811d8e02579511", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/ui/src/components/ui/chart.tsx"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-2b51d86e608850d1", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/ui/src/lib/gateways/local-compose.ts:18"}, "properties": {"repobilityId": "bf8f21f1bfe770a8", "scanner": "scanner-primary", "fingerprint": "2b51d86e608850d1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/ui/src/lib/gateways/local-compose.ts"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-e02d8b78e8b6053c", "level": "error", "message": {"text": "Possible secret in gateway/scripts/verify-528.mjs"}, "properties": {"repobilityId": "9edf4316b58f7037", "scanner": "scanner-primary", "fingerprint": "e02d8b78e8b6053c", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/scripts/verify-528.mjs"}, "region": {"startLine": 72}}}]}, {"ruleId": "scanner-2ab94acb63378e91", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in gateway/scripts/plugins/hq-bootstrap/index.ts:2"}, "properties": {"repobilityId": "4182b220e3f30b0f", "scanner": "scanner-primary", "fingerprint": "2ab94acb63378e91", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gateway/scripts/plugins/hq-bootstrap/index.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-076b03a16e76601d", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "a42462ccbe3d06f2", "scanner": "scanner-primary", "fingerprint": "076b03a16e76601d", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f351140588d19c0c", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "562c56b678edfab9", "scanner": "scanner-primary", "fingerprint": "f351140588d19c0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-hosted.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-74408d04ab4b2510", "level": "note", "message": {"text": "Very large file: apps/ui/src/components/workspaces/new-workspace-wizard.tsx (1721 lines)"}, "properties": {"repobilityId": "94ca01212141e165", "scanner": "scanner-primary", "fingerprint": "74408d04ab4b2510", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-70432b645a90a8af", "level": "note", "message": {"text": "Very large file: gateway/daemons/command_runner.py (2580 lines)"}, "properties": {"repobilityId": "20cf1f8c58a42f5e", "scanner": "scanner-primary", "fingerprint": "70432b645a90a8af", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "30fc2f3377bd1cc1", "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": "78529754a3314032", "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": "2744458515cfce6a", "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": "8a9113f24a0a43dd", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "11f7749c6227b690", "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": "115ffd422a13ab6d", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-24f2ea4bd14badc1", "level": "warning", "message": {"text": "Agent instruction contains unpinned remote install: CLAUDE.md"}, "properties": {"repobilityId": "0f6049734704e537", "scanner": "scanner-primary", "fingerprint": "24f2ea4bd14badc1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "supply-chain", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-9fb6746d958003bd", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/ui/src/components/auth/sign-in-modal.tsx:3"}, "properties": {"repobilityId": "d98ffbf9dae62d46", "scanner": "scanner-primary", "fingerprint": "9fb6746d958003bd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d40d3d8f348d9cbe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/components/workspaces/workspace-switcher.tsx:31"}, "properties": {"repobilityId": "cb7c3c70c0fbd90f", "scanner": "scanner-primary", "fingerprint": "d40d3d8f348d9cbe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d910e99571213f15", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/components/workspaces/database-settings.tsx:229"}, "properties": {"repobilityId": "c59db2724f62f8e9", "scanner": "scanner-primary", "fingerprint": "d910e99571213f15", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e28851e38cfa5b6f", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/ui/src/components/agents/agent-channel-card.tsx:72"}, "properties": {"repobilityId": "26e6d09c83bb8105", "scanner": "scanner-primary", "fingerprint": "e28851e38cfa5b6f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b6728f5de8811640", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/ui/src/components/onboarding/wizard/actions.ts:288"}, "properties": {"repobilityId": "ed272eb36338033d", "scanner": "scanner-primary", "fingerprint": "b6728f5de8811640", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ed7ea2eb8b1d16c5", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/ui/src/components/gateways/add-gateway-dialog.tsx:5"}, "properties": {"repobilityId": "b905a3490ab1ed05", "scanner": "scanner-primary", "fingerprint": "ed7ea2eb8b1d16c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ecbd4d5a8dab9ec4", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/ui/src/components/connections/add-connection-dialog.tsx:582"}, "properties": {"repobilityId": "f123fc50e4dce306", "scanner": "scanner-primary", "fingerprint": "ecbd4d5a8dab9ec4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-37cc825edd45ac38", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/components/knowledge/knowledge-detail-editor.tsx:547"}, "properties": {"repobilityId": "5c24ea9b794560ee", "scanner": "scanner-primary", "fingerprint": "37cc825edd45ac38", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ddd1e0a1833e6954", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/app/api/sources/oauth/[provider]/callback/route.ts:77"}, "properties": {"repobilityId": "4c3ef10c948406c0", "scanner": "scanner-primary", "fingerprint": "ddd1e0a1833e6954", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-adfd75942e3277fe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/app/api/onboarding/validate-provider/route.ts:48"}, "properties": {"repobilityId": "abc8dfdbce86cff7", "scanner": "scanner-primary", "fingerprint": "adfd75942e3277fe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-20991aa5f241c3fb", "level": "none", "message": {"text": "Commented-code block (10 lines) in apps/ui/src/app/onboarding/actions.ts:211"}, "properties": {"repobilityId": "8952a269f3ef9c2b", "scanner": "scanner-primary", "fingerprint": "20991aa5f241c3fb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-92b1287129924e22", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/lib/agent-repo/gateway-backend.ts:72"}, "properties": {"repobilityId": "5872dceb228e9819", "scanner": "scanner-primary", "fingerprint": "92b1287129924e22", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7a78e5d5fa1f2fa7", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/ui/src/lib/models/catalog.ts:3"}, "properties": {"repobilityId": "3d6dfc3c2d21ae55", "scanner": "scanner-primary", "fingerprint": "7a78e5d5fa1f2fa7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-964149292faf99bb", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/ui/src/lib/workspaces/detect-collisions.ts:4"}, "properties": {"repobilityId": "3593ea5c6b9c8748", "scanner": "scanner-primary", "fingerprint": "964149292faf99bb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4d165da859462c57", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/ui/src/lib/workspaces/gateway-auth-token.ts:3"}, "properties": {"repobilityId": "9b7aaf1ab9c2278a", "scanner": "scanner-primary", "fingerprint": "4d165da859462c57", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3c6c6527ee18ee8a", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/ui/src/lib/workspaces/validate.ts:4"}, "properties": {"repobilityId": "095b0e5f719ac0b3", "scanner": "scanner-primary", "fingerprint": "3c6c6527ee18ee8a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-79e7dbfcb28dec93", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/ui/src/lib/gateways/one-liner.ts:6"}, "properties": {"repobilityId": "acc088597fc90a7c", "scanner": "scanner-primary", "fingerprint": "79e7dbfcb28dec93", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-45d16d889734c251", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/ui/src/lib/connections/types.ts:3"}, "properties": {"repobilityId": "715b8947a3b5eaee", "scanner": "scanner-primary", "fingerprint": "45d16d889734c251", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ba3c6d184dc6bde6", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/ui/src/hooks/use-agent-commands.ts:68"}, "properties": {"repobilityId": "9a70e2ec4e0c9fba", "scanner": "scanner-primary", "fingerprint": "ba3c6d184dc6bde6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-613ef7b36bc89498", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/hooks/use-source-browse.ts:69"}, "properties": {"repobilityId": "dee4e529ca4a4970", "scanner": "scanner-primary", "fingerprint": "613ef7b36bc89498", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c617df767a68e222", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/hooks/use-agents-list.ts:30"}, "properties": {"repobilityId": "1b13ceac49afe838", "scanner": "scanner-primary", "fingerprint": "c617df767a68e222", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c7358f9122171f79", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/ui/src/hooks/use-sidebar-collections.ts:79"}, "properties": {"repobilityId": "bd63a3be60df53a6", "scanner": "scanner-primary", "fingerprint": "c7358f9122171f79", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-55708501d91ecb6b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/worker/src/providers/e2b.ts:82"}, "properties": {"repobilityId": "5bff7063b10bc5f0", "scanner": "scanner-primary", "fingerprint": "55708501d91ecb6b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-43ca1f608ee1e336", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/worker/src/lib/provisioner.ts:90"}, "properties": {"repobilityId": "5ce4bc7fc3bec3be", "scanner": "scanner-primary", "fingerprint": "43ca1f608ee1e336", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-98ef041f85855aae", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/worker/src/lib/supabase-mgmt.ts:15"}, "properties": {"repobilityId": "48d224091b0fdd3e", "scanner": "scanner-primary", "fingerprint": "98ef041f85855aae", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-effe50bbd21ddf04", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/worker/src/lib/schema-runner.ts:23"}, "properties": {"repobilityId": "1b93c0a8b119894b", "scanner": "scanner-primary", "fingerprint": "effe50bbd21ddf04", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9432179c20ac5edb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/cloudflare-install/src/index.js:9"}, "properties": {"repobilityId": "bcc41954ec73c21c", "scanner": "scanner-primary", "fingerprint": "9432179c20ac5edb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f6b4a541a4bea14b", "level": "none", "message": {"text": "Commented-code block (6 lines) in gateway/scripts/verify-528.mjs:7"}, "properties": {"repobilityId": "182e91f515609dd5", "scanner": "scanner-primary", "fingerprint": "f6b4a541a4bea14b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-521ac765b8e0723d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 gateway/scripts/plugins/hq-bootstrap/index.ts:71"}, "properties": {"repobilityId": "50c2dc0748c754e5", "scanner": "scanner-primary", "fingerprint": "521ac765b8e0723d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dc1722b7f079a206", "level": "note", "message": {"text": "Legacy-named symbol `gateway_backup` in gateway/daemons/gateway_backup.py:15"}, "properties": {"repobilityId": "a18ab61506a0d10a", "scanner": "scanner-primary", "fingerprint": "dc1722b7f079a206", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1336f608be56e579", "level": "note", "message": {"text": "Legacy-named symbol `gateway_backup` in gateway/daemons/command_runner.py:354"}, "properties": {"repobilityId": "8fa560a6419501f9", "scanner": "scanner-primary", "fingerprint": "1336f608be56e579", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-75b9303d9025b8ae", "level": "none", "message": {"text": "Commented-code block (5 lines) in gateway/daemons/command_runner.py:93"}, "properties": {"repobilityId": "2cd6a29fdea4bf65", "scanner": "scanner-primary", "fingerprint": "75b9303d9025b8ae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-67c70bfbb8f21f9c", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 gateway/daemons/command_runner.py:369"}, "properties": {"repobilityId": "9d23265a81e8ed04", "scanner": "scanner-primary", "fingerprint": "67c70bfbb8f21f9c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-006d85b4a3351a35", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 gateway/daemons/inbox_dispatcher.py:323"}, "properties": {"repobilityId": "6667f29be6d16de6", "scanner": "scanner-primary", "fingerprint": "006d85b4a3351a35", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-14ff62f4974d9c6e", "level": "note", "message": {"text": "Stub function `log_message` (body is just `pass`/`return`) \u2014 gateway/embedder/embedder.py:556"}, "properties": {"repobilityId": "b440811ae630c1cd", "scanner": "scanner-primary", "fingerprint": "14ff62f4974d9c6e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-c344f989ae7179fc", "level": "note", "message": {"text": "Stub function `on_shutdown` (body is just `pass`/`return`) \u2014 gateway/plugins/sdk.py:187"}, "properties": {"repobilityId": "15a2da01f873e684", "scanner": "scanner-primary", "fingerprint": "c344f989ae7179fc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-40168836368422aa", "level": "note", "message": {"text": "53 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "edd9a44a59ffc46a", "scanner": "scanner-primary", "fingerprint": "40168836368422aa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "327cde54c4d3b61f", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "21c58f2ec2754142", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "827a0c9f88b41963", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "154dd91b3f0a6baa", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "830c12bcdab0d574", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "464b50d10eae77aa", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "bd7a673ea63e14d2", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "07d0c7232fe3d061", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "d3fcd130dc0ea8f7", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "8573f78cdaa1e2e8", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "3b31184f1f2ea4c8", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "90049096b5535014", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "382055e2d62b50c7", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "0c0d5f2d0fc5ed66", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "c41a1cd93ba1216d", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "d41f94f4bbdffe71", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-06065e8f6d9c0330", "level": "error", "message": {"text": "Dangling fetch: GET https://api.github.com/repos/${GITHUB_REPO}/releases/latest (infra/cloudflare-install/src/index.js:42)"}, "properties": {"repobilityId": "37c5126f69acce80", "scanner": "scanner-primary", "fingerprint": "06065e8f6d9c0330", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-14fb6bf434c5c88a", "level": "error", "message": {"text": "Dangling fetch: POST /api/workspaces/switch (apps/ui/src/components/workspaces/workspace-switcher.tsx:31)"}, "properties": {"repobilityId": "9d31b454a808e188", "scanner": "scanner-primary", "fingerprint": "14fb6bf434c5c88a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cb062e50ec1975d7", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/workspaces/${workspace.id} (apps/ui/src/components/workspaces/database-settings.tsx:229)"}, "properties": {"repobilityId": "7fbb61c09e823743", "scanner": "scanner-primary", "fingerprint": "cb062e50ec1975d7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ef8b8f754127ac7b", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/workspaces/${workspace.id} (apps/ui/src/components/workspaces/database-settings.tsx:334)"}, "properties": {"repobilityId": "998b4e3d04ff0c79", "scanner": "scanner-primary", "fingerprint": "ef8b8f754127ac7b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-828375edbc3015a5", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/workspaces/${workspace.id} (apps/ui/src/components/workspaces/database-settings.tsx:415)"}, "properties": {"repobilityId": "327662e84433b6c3", "scanner": "scanner-primary", "fingerprint": "828375edbc3015a5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-272ed0b97d0138a1", "level": "error", "message": {"text": "Dangling fetch: POST /api/workspaces/validate (apps/ui/src/components/workspaces/add-workspace-dialog.tsx:37)"}, "properties": {"repobilityId": "bb12fc32dcfc1efe", "scanner": "scanner-primary", "fingerprint": "272ed0b97d0138a1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7bfe1afe5856eaf4", "level": "error", "message": {"text": "Dangling fetch: POST /api/workspaces (apps/ui/src/components/workspaces/add-workspace-dialog.tsx:55)"}, "properties": {"repobilityId": "7de9de15961d9685", "scanner": "scanner-primary", "fingerprint": "7bfe1afe5856eaf4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d9c1dd3a5866610d", "level": "error", "message": {"text": "Dangling fetch: POST /api/sources/validate (apps/ui/src/components/sources/provider-picker-dialog.tsx:138)"}, "properties": {"repobilityId": "7dfd7c62e583a63f", "scanner": "scanner-primary", "fingerprint": "d9c1dd3a5866610d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-33fa002f2d7771d3", "level": "error", "message": {"text": "Dangling fetch: PUT /api/agents/${slug}/files/${path} (apps/ui/src/components/agents/agent-file-editor.tsx:69)"}, "properties": {"repobilityId": "717dc9033fcd62c6", "scanner": "scanner-primary", "fingerprint": "33fa002f2d7771d3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0e1bf6b0d2ec0264", "level": "error", "message": {"text": "Dangling fetch: GET /api/agents/${slug}/files (apps/ui/src/components/agents/agent-file-browser.tsx:35)"}, "properties": {"repobilityId": "5bb30287b94898b3", "scanner": "scanner-primary", "fingerprint": "0e1bf6b0d2ec0264", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-95d338b5d9351346", "level": "error", "message": {"text": "Dangling fetch: GET /api/agents/${slug}/files/${path} (apps/ui/src/components/agents/agent-file-browser.tsx:92)"}, "properties": {"repobilityId": "46b7c74bef5c2dce", "scanner": "scanner-primary", "fingerprint": "95d338b5d9351346", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ec8bcd9cbc823728", "level": "error", "message": {"text": "Dangling fetch: POST /api/agents/${slug}/files/${path} (apps/ui/src/components/agents/agent-file-browser.tsx:111)"}, "properties": {"repobilityId": "d26df9b0f26a2914", "scanner": "scanner-primary", "fingerprint": "ec8bcd9cbc823728", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f9d0681e4a161407", "level": "error", "message": {"text": "Dangling fetch: GET /api/agents/templates (apps/ui/src/components/agents/agent-create-wizard.tsx:97)"}, "properties": {"repobilityId": "b630660e0cc2159e", "scanner": "scanner-primary", "fingerprint": "f9d0681e4a161407", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6b193ad001f73bc5", "level": "error", "message": {"text": "Dangling fetch: GET /api/agents/${slug}/browser/state (apps/ui/src/components/agents/agent-browser-tab.tsx:63)"}, "properties": {"repobilityId": "0b75d5418cc8d926", "scanner": "scanner-primary", "fingerprint": "6b193ad001f73bc5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7681a70af491427c", "level": "error", "message": {"text": "Dangling fetch: GET /api/agents/${slug}/browser/screenshot (apps/ui/src/components/agents/agent-browser-tab.tsx:64)"}, "properties": {"repobilityId": "d9a7ff6073e23649", "scanner": "scanner-primary", "fingerprint": "7681a70af491427c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b1fa12a044f5be4f", "level": "error", "message": {"text": "Dangling fetch: GET /api/agents/${slug}/files/${filename} (apps/ui/src/components/agents/agent-personality-tab.tsx:47)"}, "properties": {"repobilityId": "ecc294723b982b5a", "scanner": "scanner-primary", "fingerprint": "b1fa12a044f5be4f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c78c31de65bfc484", "level": "error", "message": {"text": "Dangling fetch: PUT /api/agents/${slug}/files/${filename} (apps/ui/src/components/agents/agent-personality-tab.tsx:187)"}, "properties": {"repobilityId": "8123cd8d2756b9a3", "scanner": "scanner-primary", "fingerprint": "c78c31de65bfc484", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3067beae0df8eb1b", "level": "error", "message": {"text": "Dangling fetch: GET /api/gateways/${agent.gateway_id}/desktop (apps/ui/src/components/agents/agent-detail-tabs.tsx:112)"}, "properties": {"repobilityId": "8ef83873b8c3dde2", "scanner": "scanner-primary", "fingerprint": "3067beae0df8eb1b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c1c39647357c9459", "level": "error", "message": {"text": "Dangling fetch: GET https://api.openai.com/v1/models (apps/ui/src/app/api/onboarding/validate-provider/route.ts:30)"}, "properties": {"repobilityId": "421cd2aaa1cd3e08", "scanner": "scanner-primary", "fingerprint": "c1c39647357c9459", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5c797a2767ab7ca1", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (apps/ui/src/app/api/onboarding/validate-provider/route.ts:48)"}, "properties": {"repobilityId": "d72f50247717fbc1", "scanner": "scanner-primary", "fingerprint": "5c797a2767ab7ca1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7e4ebc547cf38b4d", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:11434/api/tags (apps/ui/src/app/api/onboarding/validate-provider/route.ts:71)"}, "properties": {"repobilityId": "9fa2dc21c12f9af9", "scanner": "scanner-primary", "fingerprint": "7e4ebc547cf38b4d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-33a97a0a8230fb27", "level": "error", "message": {"text": "Dangling fetch: POST /api/embed (apps/ui/src/hooks/use-universal-search.ts:268)"}, "properties": {"repobilityId": "e7d929a8507a781a", "scanner": "scanner-primary", "fingerprint": "33a97a0a8230fb27", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d156dd195e7733b7", "level": "error", "message": {"text": "Dangling fetch: POST /api/sources/browse (apps/ui/src/hooks/use-source-browse.ts:31)"}, "properties": {"repobilityId": "0a26f37718bd99d4", "scanner": "scanner-primary", "fingerprint": "d156dd195e7733b7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a2aae02404554140", "level": "error", "message": {"text": "Dangling fetch: POST /api/sources/validate (apps/ui/src/hooks/use-source-browse.ts:69)"}, "properties": {"repobilityId": "eae485a4914bff29", "scanner": "scanner-primary", "fingerprint": "a2aae02404554140", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6e4ec106b55587fb", "level": "note", "message": {"text": "Unused endpoint: USE /users/*"}, "properties": {"repobilityId": "f42cada73623806f", "scanner": "scanner-primary", "fingerprint": "6e4ec106b55587fb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-afcde812d16c784a", "level": "note", "message": {"text": "Unused endpoint: USE /workspaces/*"}, "properties": {"repobilityId": "da5771ab5868c4bc", "scanner": "scanner-primary", "fingerprint": "afcde812d16c784a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4313a1eb4846b0e7", "level": "note", "message": {"text": "Unused endpoint: USE /checkout"}, "properties": {"repobilityId": "a49d6e9234653b30", "scanner": "scanner-primary", "fingerprint": "4313a1eb4846b0e7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1dfcc9529630142e", "level": "note", "message": {"text": "Unused endpoint: POST /webhooks/stripe"}, "properties": {"repobilityId": "7615ce926709887f", "scanner": "scanner-primary", "fingerprint": "1dfcc9529630142e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-44b5c8cdad0898e6", "level": "note", "message": {"text": "Unused endpoint: GET /users/by-email/:email"}, "properties": {"repobilityId": "163b621992630773", "scanner": "scanner-primary", "fingerprint": "44b5c8cdad0898e6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2c59d85a3ab2bcee", "level": "note", "message": {"text": "Unused endpoint: GET /workspaces/:id/connection"}, "properties": {"repobilityId": "dfc616b83041e437", "scanner": "scanner-primary", "fingerprint": "2c59d85a3ab2bcee", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-951f960722673486", "level": "note", "message": {"text": "Unused endpoint: PATCH /workspaces/:id/onboarding"}, "properties": {"repobilityId": "75351a93af693f77", "scanner": "scanner-primary", "fingerprint": "951f960722673486", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-acca718c0d478df7", "level": "note", "message": {"text": "Unused endpoint: GET /workspaces/:id/status"}, "properties": {"repobilityId": "b15c3f54ff6e397a", "scanner": "scanner-primary", "fingerprint": "acca718c0d478df7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-756dadb8c26fb50b", "level": "note", "message": {"text": "Unused endpoint: GET /users/:userId/workspaces"}, "properties": {"repobilityId": "607b1b5625cff798", "scanner": "scanner-primary", "fingerprint": "756dadb8c26fb50b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f2a2c824be628bfd", "level": "note", "message": {"text": "Unused endpoint: GET /workspaces/:id/siblings"}, "properties": {"repobilityId": "55558f070ce1baf2", "scanner": "scanner-primary", "fingerprint": "f2a2c824be628bfd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6385cd0e163a390f", "level": "note", "message": {"text": "Unused endpoint: POST /checkout"}, "properties": {"repobilityId": "e36f0f8e1c811402", "scanner": "scanner-primary", "fingerprint": "6385cd0e163a390f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1ef1929048bdce27", "level": "note", "message": {"text": "Unused endpoint: POST /workspaces/:id/verify-payment"}, "properties": {"repobilityId": "49eb7ccfb61dc0f7", "scanner": "scanner-primary", "fingerprint": "1ef1929048bdce27", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6a106659250cbcfe", "level": "note", "message": {"text": "Unused endpoint: POST /workspaces/:id/retry-provision"}, "properties": {"repobilityId": "cdcdeeebdeae2407", "scanner": "scanner-primary", "fingerprint": "6a106659250cbcfe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-118695b289db15a1", "level": "note", "message": {"text": "Unused endpoint: POST /workspaces/:id/cancel"}, "properties": {"repobilityId": "049d8a3eac6771a0", "scanner": "scanner-primary", "fingerprint": "118695b289db15a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9f292f7edb459bd2", "level": "note", "message": {"text": "Unused endpoint: POST /workspaces/:id/touch"}, "properties": {"repobilityId": "13e6b2fed1607e33", "scanner": "scanner-primary", "fingerprint": "9f292f7edb459bd2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e8dbfd8fabe46bea", "level": "note", "message": {"text": "Unused endpoint: POST /workspaces/:id/billing-portal"}, "properties": {"repobilityId": "1f4af5b63a41223a", "scanner": "scanner-primary", "fingerprint": "e8dbfd8fabe46bea", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}