{"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-dc6f433480ca2a8b", "name": "Possibly dead Python function: draw_diagonal_gradient_bg", "shortDescription": {"text": "Possibly dead Python function: draw_diagonal_gradient_bg"}, "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-0eb89f562605743b", "name": "Possibly dead Python function: draw_vertical_gradient_bg", "shortDescription": {"text": "Possibly dead Python function: draw_vertical_gradient_bg"}, "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-a1d57679f2a3dd0e", "name": "Possibly dead Python function: render_v6", "shortDescription": {"text": "Possibly dead Python function: render_v6"}, "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-4c23f3a9aac36965", "name": "Possibly dead Python function: render_v7", "shortDescription": {"text": "Possibly dead Python function: render_v7"}, "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-932d485fac813875", "name": "Possibly dead Python function: render_v8", "shortDescription": {"text": "Possibly dead Python function: render_v8"}, "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-94ecaba56304e8f9", "name": "Possibly dead Python function: variant_1", "shortDescription": {"text": "Possibly dead Python function: variant_1"}, "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-2e749d80140cded1", "name": "Possibly dead Python function: variant_2", "shortDescription": {"text": "Possibly dead Python function: variant_2"}, "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-d47415afc2665297", "name": "Possibly dead Python function: variant_3", "shortDescription": {"text": "Possibly dead Python function: variant_3"}, "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-5773d1df76eb360d", "name": "Possibly dead Python function: variant_4", "shortDescription": {"text": "Possibly dead Python function: variant_4"}, "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-340c8a755ce19b2f", "name": "Possibly dead Python function: variant_5", "shortDescription": {"text": "Possibly dead Python function: variant_5"}, "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-1d5cb0482825711e", "name": "Possibly dead Python function: render_v9", "shortDescription": {"text": "Possibly dead Python function: render_v9"}, "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-ee30b9c23068965e", "name": "Possibly dead Python function: render_v10", "shortDescription": {"text": "Possibly dead Python function: render_v10"}, "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-5ed41fc2106f8f60", "name": "Possibly dead Python function: draw_rounded_rect", "shortDescription": {"text": "Possibly dead Python function: draw_rounded_rect"}, "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-2350b9c913e7a3ff", "name": "Possibly dead Python function: draw_line_aa", "shortDescription": {"text": "Possibly dead Python function: draw_line_aa"}, "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-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2a2cea1bc77c1cfa", "name": "Stray `console.log` in TS/JS \u2014 _write_script.js:134", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 _write_script.js:134"}, "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-02a2179ca5793257", "name": "Stray `console.log` in TS/JS \u2014 scripts/export-landing-code.js:55", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/export-landing-code.js:55"}, "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-9370acb47ea6992b", "name": "Stray `console.log` in TS/JS \u2014 scripts/materialize-template.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/materialize-template.ts:25"}, "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-0212670051cdcb74", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-db.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-db.ts:31"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e654e0f87aa850c9", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-webhook.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-webhook.ts:20"}, "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-ce6830bbb8dd86f9", "name": "Stray `console.log` in TS/JS \u2014 scripts/validate-jsonld.ts:99", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/validate-jsonld.ts:99"}, "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-22fe0363b272be50", "name": "Stray `console.log` in TS/JS \u2014 scripts/capture-github-guide.ts:82", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/capture-github-guide.ts:82"}, "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-272dd6beb19119bd", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-email.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-email.ts:13"}, "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-ddac4b0142973a75", "name": "`truncate` class without `title=` for hover reveal \u2014 templates/dev-showcase/src/components/projects-section.tsx:56", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 templates/dev-showcase/src/components/projects-section.tsx:56"}, "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-9418c298812057ac", "name": "`truncate` class without `title=` for hover reveal \u2014 templates/dev-showcase/src/components/blog-section.tsx:44", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 templates/dev-showcase/src/components/blog-section.tsx:44"}, "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-ce5c12551c86af08", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 templates/dev-showcase/src/app/layout.tsx:41", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 templates/dev-showcase/src/app/layout.tsx:41"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fa550504b0256a3f", "name": "`truncate` class without `title=` for hover reveal \u2014 templates/digital-namecard/src/components/contact-info.tsx:69", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 templates/digital-namecard/src/components/contact-info.tsx:69"}, "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-da753ce93ab72c3f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 templates/digital-namecard/src/app/layout.tsx:41", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 templates/digital-namecard/src/app/layout.tsx:41"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fa56382d769e4e94", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 templates/link-in-bio-pro/src/app/layout.tsx:41", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 templates/link-in-bio-pro/src/app/layout.tsx:41"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c53a10e91c104708", "name": "Stray `console.log` in TS/JS \u2014 packages/cli/src/index.ts:103", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/cli/src/index.ts:103"}, "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-c7bce9017bf1e8ae", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/settings-nav.tsx:52", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/settings-nav.tsx:52"}, "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-afaeae56321bb605", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/api-token-manager.tsx:100", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/api-token-manager.tsx:100"}, "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-144421a3d127e286", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/app-sidebar.tsx:163", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/app-sidebar.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-6b61a24e9845b249", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/demo/demo-banner.tsx:11", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/demo/demo-banner.tsx:11"}, "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-3f57b4b334c1310b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ai/recommendation-cards.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ai/recommendation-cards.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-fc771752857827c7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/github/repo-selector.tsx:162", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/github/repo-selector.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-50a5934961e9352f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/showcase/showcase-card.tsx:90", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/showcase/showcase-card.tsx:90"}, "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-882a63e0293d9299", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/showcase/showcase-leaderboard.tsx:91", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/showcase/showcase-leaderboard.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-d4ebde9fe3b25e74", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/showcase/monthly-pick-card.tsx:67", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/showcase/monthly-pick-card.tsx:67"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-110681e565cc6e08", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/share-map-button.tsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/share-map-button.tsx:87"}, "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-91c37d360c268f61", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/connection-type-dialog.tsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/connection-type-dialog.tsx:111"}, "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-4b26da9231597c61", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/zone-edit-toolbar.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/zone-edit-toolbar.tsx:86"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2fbaa0d70de1b93b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/shared-map-client.tsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/shared-map-client.tsx:78"}, "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-62b0a3b3ad5a8186", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/service-detail-sheet.tsx:770", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/service-detail-sheet.tsx:770"}, "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-c2f65493d8eab5ea", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/service-env-vars-section.tsx:304", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/service-env-vars-section.tsx:304"}, "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-3cd70c5aceba4e62", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/project-node.tsx:260", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/project-node.tsx:260"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f19c5c2d46094bd5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/empty-map-state.tsx:102", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/empty-map-state.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-0220f2fe03a12901", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/catalog-sidebar.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/catalog-sidebar.tsx:129"}, "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-084f6bad9fb2c411", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/service-node.tsx:241", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/service-node.tsx:241"}, "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-d0c2ff7a66ee01b7", "name": "React Flow <Controls> without dark theming \u2014 src/components/service-map/views/map-view.tsx:342", "shortDescription": {"text": "React Flow <Controls> without dark theming \u2014 src/components/service-map/views/map-view.tsx:342"}, "fullDescription": {"text": "`<Controls>` ships with white buttons. Override `.react-flow__controls` and `.react-flow__controls-button` in your stylesheet or pass a styled wrapper.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.controls.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ee4ffdc6dd6c396f", "name": "React Flow <MiniMap> without dark background \u2014 src/components/service-map/views/dependency-view.tsx:706", "shortDescription": {"text": "React Flow <MiniMap> without dark background \u2014 src/components/service-map/views/dependency-view.tsx:706"}, "fullDescription": {"text": "A bare <MiniMap> renders with the vendor's white default in dark themes. Wrap the canvas in a class that overrides `.react-flow__minimap` background, or pass an explicit `style`/`maskColor`/`bgColor`.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.minimap.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7fa407d7157e2d5e", "name": "React Flow <Controls> without dark theming \u2014 src/components/service-map/views/dependency-view.tsx:704", "shortDescription": {"text": "React Flow <Controls> without dark theming \u2014 src/components/service-map/views/dependency-view.tsx:704"}, "fullDescription": {"text": "`<Controls>` ships with white buttons. Override `.react-flow__controls` and `.react-flow__controls-button` in your stylesheet or pass a styled wrapper.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.controls.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1aa07221662c92b6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/oneclick-side-panel.tsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/oneclick-side-panel.tsx:118"}, "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-3a8a327e570d6239", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/compact-card.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/compact-card.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-0ad1e0f42aba5ea9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/project-tree-list.tsx:250", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/project-tree-list.tsx:250"}, "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-24c508a81711991f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/health-summary-strip.tsx:103", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/health-summary-strip.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-3ac9ecf89fed459d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/quick-actions.tsx:56", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/quick-actions.tsx:56"}, "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-1bba22e59a3e7036", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/service-item.tsx:47", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/service-item.tsx:47"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-49a52154a9580fea", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/connection-flow-map.tsx:72", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/connection-flow-map.tsx:72"}, "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-202e50bfa02485f7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/project-hero-card.tsx:274", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/project-hero-card.tsx:274"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d04e3ab7e2994d85", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/user-detail-sheet.tsx:140", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/user-detail-sheet.tsx:140"}, "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-ed5b1653d85bc8f2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/user-stats-dashboard.tsx:351", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/user-stats-dashboard.tsx:351"}, "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-89360162e6a17d0c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/ai-feature-mapping-tab.tsx:144", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/ai-feature-mapping-tab.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-41c3625b4e74459c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/deploy-errors-dashboard.tsx:363", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/deploy-errors-dashboard.tsx:363"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a3028a1136f28af1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/connection-dashboard.tsx:100", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/connection-dashboard.tsx:100"}, "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-92101f6e31c262ce", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/projects-preview-section.tsx:49", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/projects-preview-section.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-58b4c1d3b77e497c", "name": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/landing/flow-comparison.tsx:4", "shortDescription": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/landing/flow-comparison.tsx:49"}, "fullDescription": {"text": "React Flow edge labels render with a white rectangle behind the text by default, which scatters bright boxes across a dark canvas. Either drop the label, or override `.react-flow__edge-textbg` and `.react-flow__edge-text` in your stylesheet.\n\nWhy: P-H in CHECKLIST.md \u2014 vendor edge labels bleed white through a dark canvas.\nRule id: fq.edge-label.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-45cbce1dc87f4413", "name": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/landing/flow-architecture-dia", "shortDescription": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/landing/flow-architecture-diagram.tsx:76"}, "fullDescription": {"text": "React Flow edge labels render with a white rectangle behind the text by default, which scatters bright boxes across a dark canvas. Either drop the label, or override `.react-flow__edge-textbg` and `.react-flow__edge-text` in your stylesheet.\n\nWhy: P-H in CHECKLIST.md \u2014 vendor edge labels bleed white through a dark canvas.\nRule id: fq.edge-label.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a9b836bacd9da746", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/service/service-list-item.tsx:46", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service/service-list-item.tsx:46"}, "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-8616de329706452c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/service/env-import-dialog.tsx:175", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service/env-import-dialog.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-71ab9637abb7cfcb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/service/service-detail-client.tsx:329", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service/service-detail-client.tsx:329"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e2f21a8b87513d43", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/service/cost-simulator-client.tsx:160", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service/cost-simulator-client.tsx:160"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-da0e843ec9e90dea", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/service/setup-architecture-preview.tsx:25", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service/setup-architecture-preview.tsx:25"}, "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-a877984ee88fead1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/oneclick/deploy-progress.tsx:132", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/oneclick/deploy-progress.tsx:132"}, "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-b38ad1673dd99e3f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/oneclick/deploy-success.tsx:108", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/oneclick/deploy-success.tsx:108"}, "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-395921322e70f09f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/my-sites/site-editor-client.tsx:1066", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/my-sites/site-editor-client.tsx:1066"}, "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-4d83bd1a1b6fb22f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/my-sites/module-panel.tsx:156", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/my-sites/module-panel.tsx:156"}, "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-76a4ff7f2e50f5a2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/my-sites/deploy-site-card.tsx:195", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/my-sites/deploy-site-card.tsx:195"}, "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-9321fffc73a68518", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/guides/guides-hub.tsx:138", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guides/guides-hub.tsx:138"}, "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-64a92029dfd0e101", "name": "Stray `console.log` in TS/JS \u2014 src/components/guides/security-guide/common-mistakes-section.tsx:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/guides/security-guide/common-mistakes-section.tsx:30"}, "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-e8dd81e1bf00d9e2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/guides/security-guide/checklist-section.tsx:50", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/guides/security-guide/checklist-section.tsx:50"}, "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-3ddb690aa44b83ad", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/guides/security-guide/web-vulnerabilities-content.t", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/guides/security-guide/web-vulnerabilities-content.tsx:24"}, "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-43d7423612c86896", "name": "Stray `console.log` in TS/JS \u2014 src/components/guides/api-basics-guide/fetch-axios-content.tsx:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/guides/api-basics-guide/fetch-axios-content.tsx:53"}, "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-1fc9a9c67b63f0aa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/guides/auth-guide/console-frame.tsx:17", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guides/auth-guide/console-frame.tsx:17"}, "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-958a4c0a57dbac27", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/guides/auth-guide/annotated-screenshot.tsx:50", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guides/auth-guide/annotated-screenshot.tsx:50"}, "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-ec39ee26a1a2c923", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/credentials/credentials-table.tsx:275", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/credentials/credentials-table.tsx:275"}, "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-3bf252f4875fefee", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/feedback/PageTreePicker.tsx:46", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/feedback/PageTreePicker.tsx:46"}, "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-ebab3610aefdc19a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/cost-service-list.tsx:191", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/cost-service-list.tsx:191"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a424d0c67fb16d60", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/services-content.tsx:151", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/services-content.tsx:151"}, "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-3172d7056f7f444c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/health-summary-card.tsx:77", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/health-summary-card.tsx:77"}, "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-2a2e86c8a6e00af5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/connections-content.tsx:462", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/connections-content.tsx:462"}, "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-f579660112ab2774", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/project-card.tsx:205", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/project-card.tsx:205"}, "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-4b8b92c8ff43e0a0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/health-timeline.tsx:60", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/health-timeline.tsx:60"}, "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-2766c53be0fe2374", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/cost-attachments-panel.tsx:313", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/cost-attachments-panel.tsx:313"}, "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-efbe312ddecc24b2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/audit-content.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/audit-content.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-f6aed8023270b13d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/cost-openai-usage-panel.tsx:235", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/cost-openai-usage-panel.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-1f8b26d6feda276c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/json-ld-script.tsx:11", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/json-ld-script.tsx:11"}, "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-53aef384cbd0fce8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/developer/page.tsx:89", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/developer/page.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-f13ccfd598b14bae", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/demo/project/[id]/services/page.tsx:102", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/demo/project/[id]/services/page.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-9f7b16d77d8341de", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/demo/project/[id]/costs/page.tsx:132", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/demo/project/[id]/costs/page.tsx:132"}, "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-9b327b5216ff7612", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/demo/project/[id]/connections/page.tsx:105", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/demo/project/[id]/connections/page.tsx:105"}, "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-01fdb085e0e43a22", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/showcase/[id]/page.tsx:155", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/showcase/[id]/page.tsx:155"}, "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-b30ed91f37ec487a", "name": "TODO/FIXME marker in shipping code \u2014 src/app/api/toss/confirm/route.ts:27", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/toss/confirm/route.ts:27"}, "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-63a3df6edfb9c607", "name": "TODO/FIXME marker in shipping code \u2014 src/app/api/toss/checkout/route.ts:27", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/toss/checkout/route.ts:27"}, "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-37013d3bbfd80d5c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trash/page.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trash/page.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-716f5e3af8617986", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/showcase/page.tsx:131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/showcase/page.tsx:131"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-da0418ded07b2865", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/sites/showcase/page.tsx:183", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/sites/showcase/page.tsx:183"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-95c8b9dee5130daa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/shared/map/[token]/page.tsx:33", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/shared/map/[token]/page.tsx:33"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1c0b4fea3a27e8de", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/services/compare/page.tsx:44", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/services/compare/page.tsx:44"}, "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-acd9266bd7f95158", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/guides/security/web-vulnerabilities/page.tsx:21", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/guides/security/web-vulnerabilities/page.tsx:21"}, "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-c70a808813161679", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/oneclick/generators/base-generator.ts:598", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/oneclick/generators/base-generator.ts:598"}, "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-e28c4bfefe015a08", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/oneclick/generators/freelancer-page.ts:361", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/oneclick/generators/freelancer-page.ts:361"}, "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-25edd9b5799a9851", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/oneclick/generators/personal-brand.ts:291", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/oneclick/generators/personal-brand.ts:291"}, "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-422fab34f4dc036a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/oneclick/generators/invitation.ts:318", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/oneclick/generators/invitation.ts:318"}, "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-92d6068ed186f55f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/oneclick/generators/dev-showcase.ts:382", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/oneclick/generators/dev-showcase.ts:382"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cdf113d230d0affe", "name": "Insecure pattern 'eval_used' in scripts/generate_icon_candidates.py:370", "shortDescription": {"text": "Insecure pattern 'eval_used' in scripts/generate_icon_candidates.py:370"}, "fullDescription": {"text": "Found a known-risky pattern (eval_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9fbd915960084c64", "name": "Insecure pattern 'cors_wildcard' in src/components/guides/security-guide/common-mistakes-section.tsx:43", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/components/guides/security-guide/common-mistakes-section.tsx:43"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dcdb60d9ac84fc0c", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/guides/security-guide/checklist-section.tsx:50", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/guides/security-guide/checklist-section.tsx:50"}, "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-b271e07eb7e61308", "name": "Insecure pattern 'cors_wildcard' in src/components/guides/security-guide/checklist-section.tsx:60", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/components/guides/security-guide/checklist-section.tsx:60"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-913465382dc2c27c", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/guides/security-guide/web-vulnerabilities-content.tsx:24", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/guides/security-guide/web-vulnerabilities-content.tsx:24"}, "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-19facfc31eb3e385", "name": "Possible secret in src/components/guides/api-basics-guide/api-auth-content.tsx", "shortDescription": {"text": "Possible secret in src/components/guides/api-basics-guide/api-auth-content.tsx"}, "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-fdf51b0afca6592e", "name": "Possible secret in src/components/credentials/credentials-table.tsx", "shortDescription": {"text": "Possible secret in src/components/credentials/credentials-table.tsx"}, "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-ae68b1243d3134e0", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/json-ld-script.tsx:11", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/json-ld-script.tsx:11"}, "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-f3976907b1592b71", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/services/compare/page.tsx:44", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/services/compare/page.tsx:44"}, "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-8de8f1647425f17f", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/guides/security/web-vulnerabilities/page.tsx:21", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/guides/security/web-vulnerabilities/page.tsx:21"}, "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-1bbfc4413df18714", "name": "Insecure pattern 'dangerous_innerhtml' in src/lib/oneclick/generators/base-generator.ts:598", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/lib/oneclick/generators/base-generator.ts:598"}, "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-7f55074561e3a749", "name": "Insecure pattern 'dangerous_innerhtml' in src/lib/oneclick/generators/freelancer-page.ts:361", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/lib/oneclick/generators/freelancer-page.ts:361"}, "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-42b18f37683dba8c", "name": "Insecure pattern 'dangerous_innerhtml' in src/lib/oneclick/generators/personal-brand.ts:291", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/lib/oneclick/generators/personal-brand.ts:291"}, "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-4c3984d237bcb39b", "name": "Insecure pattern 'dangerous_innerhtml' in src/lib/oneclick/generators/invitation.ts:318", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/lib/oneclick/generators/invitation.ts:318"}, "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-20a79de08d9e81fe", "name": "Insecure pattern 'dangerous_innerhtml' in src/lib/oneclick/generators/dev-showcase.ts:382", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/lib/oneclick/generators/dev-showcase.ts:382"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "gitleaks/gitleaks-action@v2 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2da8e469d97c6b3b", "name": "Very large file: src/components/my-sites/site-editor-client.tsx (1683 lines)", "shortDescription": {"text": "Very large file: src/components/my-sites/site-editor-client.tsx (1683 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-f4ba1df2c8e06ea9", "name": "Very large file: src/components/project/cost-report-page.tsx (1171 lines)", "shortDescription": {"text": "Very large file: src/components/project/cost-report-page.tsx (1171 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "23 test file(s) for 1080 source file(s) (ratio 0.02). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8c2e3196a4ef0cdd", "name": "Node manifest has dependencies but no lockfile: packages/cli/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/cli/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 226 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 167 placeholder/mock markers across 74 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2c84ed895966bbfb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-blog-diagrams.mjs:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-blog-diagrams.mjs:20"}, "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-ddd0e4369a6e32de", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-blog-diagrams-v3.mjs:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-blog-diagrams-v3.mjs:16"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ae9c6c0c7338357c", "name": "Commented-code block (6 lines) in scripts/capture-guide-screenshots.ts:247", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/capture-guide-screenshots.ts:247"}, "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-0d2141ac894ebf88", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-og-images.mjs:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-og-images.mjs:78"}, "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-75dc00703befa868", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-blog-diagrams-v2.mjs:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-blog-diagrams-v2.mjs:16"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b799cb0802f05a4f", "name": "Commented-code block (5 lines) in scripts/generate_assets.py:47", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/generate_assets.py:47"}, "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-324e6c664ab32cbe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/settings/api-token-manager.tsx:58", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/settings/api-token-manager.tsx:58"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b1ed9e9fd3f7ed98", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/service-map/hooks/useServiceMapData.ts:153", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/service-map/hooks/useServiceMapData.ts:153"}, "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-d76606ac7d59d7be", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/deploy-errors-dashboard.tsx:113", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/deploy-errors-dashboard.tsx:113"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-471843cc951afade", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mfa/mfa-challenge-dialog.tsx:43", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mfa/mfa-challenge-dialog.tsx:43"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-54557e1fbf81ea2c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/my-sites/site-editor-client.tsx:385", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/my-sites/site-editor-client.tsx:385"}, "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-6911b4b5cee7fda9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/openai-guide.tsx:187", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/openai-guide.tsx:187"}, "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-cd7f931f1e4d8593", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/ai-tools-guide/ai-api-content.tsx:64", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/ai-tools-guide/ai-api-content.tsx:64"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ba99c4f11b5e7cb9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/frontend-guide/react-nextjs-content.tsx:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/frontend-guide/react-nextjs-content.tsx:60"}, "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-1273df495c32aec2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/frontend-guide/rendering-modes-content.tsx:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/frontend-guide/rendering-modes-content.tsx:40"}, "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-67e10b6827f85519", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/backend-guide/api-section.tsx:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/backend-guide/api-section.tsx: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-a7e08053ee7a21d8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/automation-guide/sns-api-content.tsx:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/automation-guide/sns-api-content.tsx:74"}, "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-ce5b86636655edc8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/cloudflare-guide/secrets-guide.tsx:142", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/cloudflare-guide/secrets-guide.tsx:142"}, "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-12d5ba5325accedb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/security-guide/common-mistakes-section.tsx:14", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/security-guide/common-mistakes-section.tsx:14"}, "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-6ffe1a2139fa80b6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/security-guide/web-vulnerabilities-content.tsx:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/security-guide/web-vulnerabilities-content.tsx:17"}, "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-9074d5511409b5b2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/api-basics-guide/real-world-section.tsx:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/api-basics-guide/real-world-section.tsx:11"}, "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-24b74e64752e3251", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/api-basics-guide/fetch-axios-content.tsx:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/api-basics-guide/fetch-axios-content.tsx:37"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d32acf3bbd5af691", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/api-basics-guide/api-auth-content.tsx:133", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/api-basics-guide/api-auth-content.tsx:133"}, "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-5282dfca10e2f060", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/payment-guide/toss-content.tsx:119", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/payment-guide/toss-content.tsx:119"}, "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-490eff55edd29bb3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/payment-guide/stripe-content.tsx:83", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/payment-guide/stripe-content.tsx:83"}, "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-50aa0074514545f8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/openai-guide/nextjs-integration-guide.tsx:167", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/openai-guide/nextjs-integration-guide.tsx:167"}, "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-dc5d12b3c6802a19", "name": "Commented-code block (5 lines) in src/app/api/oneclick/deploy/route.ts:188", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/oneclick/deploy/route.ts:188"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-09b0039e34165c62", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/stripe/portal/route.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/stripe/portal/route.ts:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c9371d1a96659bd1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/stripe/checkout/route.ts:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/stripe/checkout/route.ts:35"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a8512c61b238bd6b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/guides/frontend/rendering-modes/page.tsx:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/guides/frontend/rendering-modes/page.tsx:21"}, "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-bf227072c39f18fc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai/openai.ts:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai/openai.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-974dac82d3935471", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/github/pages.ts:67", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/github/pages.ts:67"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-97623030ceef2754", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/github/client.ts:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/github/client.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-7d1adf560a572c65", "name": "Commented-code block (5 lines) in src/lib/openai/usage.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/openai/usage.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-64cfe9249cbdf6a3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/admin-users.ts:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/admin-users.ts:24"}, "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-399e7ac38e299a18", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/env-vars.ts:99", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/env-vars.ts:99"}, "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-58bcf5e107ed9d49", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/dashboard.ts:10", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/dashboard.ts:10"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1795b4cd9b466390", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/credentials.ts:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/credentials.ts:11"}, "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-55429830b8d3fa35", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/share.ts:14", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/share.ts:14"}, "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-529a8ba281dd6b00", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/linked-accounts.ts:46", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/linked-accounts.ts:46"}, "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-819f744933b25f53", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/github.ts:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/github.ts:54"}, "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-bf4cd054e9588e7f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/layer-overrides.ts:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/layer-overrides.ts:24"}, "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-1a893a5e1c947a09", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/services.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/services.ts:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-05cd63e254a05206", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/analyze.ts:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/analyze.ts:59"}, "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-41ffb28f74e18e24", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/github-connections.ts:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/github-connections.ts:11"}, "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-e67edb17a87cce86", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/connections.ts:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/connections.ts:20"}, "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-96a82312fa17e1de", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/costs.ts:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/costs.ts:13"}, "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-3fc7bc3d618153e1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/projects.ts:67", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/projects.ts:67"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-47df35566985e243", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/oneclick.ts:88", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/oneclick.ts:88"}, "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-2b858563db588a27", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/service-accounts.ts:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/service-accounts.ts: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-3d1fb379f39c42ea", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/feedback.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/feedback.ts:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-61d300a2d1c43f94", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/admin-visitors.ts:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/admin-visitors.ts: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-84c1e84478962dbf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/showcase.ts:50", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/showcase.ts:50"}, "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-096711a3d8c5aa05", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/zone-layout.ts:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/zone-layout.ts:22"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3268abff9ba3bdaa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/admin-usage-stats.ts:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/admin-usage-stats.ts: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-5c199c259e5c2737", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/trash.ts:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/trash.ts:11"}, "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-f1c4bab16225e152", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo/indexnow.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo/indexnow.ts:27"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a6726006b109eedd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-deploy-machine.ts:234", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-deploy-machine.ts:234"}, "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-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/generate_icon_v6_v8.py:lerp_color, scripts/generate_icon_v9_v11.py:lerp_color\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}}]}}, "automationDetails": {"id": "repobility/19329"}, "properties": {"repository": "setlog-ntl/linkmap", "repoUrl": "https://github.com/setlog-ntl/linkmap", "branch": "main"}, "results": [{"ruleId": "scanner-dc6f433480ca2a8b", "level": "note", "message": {"text": "Possibly dead Python function: draw_diagonal_gradient_bg"}, "properties": {"repobilityId": "68e25427645ceb3b", "scanner": "scanner-primary", "fingerprint": "dc6f433480ca2a8b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_icon_v6_v8.py:71"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0eb89f562605743b", "level": "note", "message": {"text": "Possibly dead Python function: draw_vertical_gradient_bg"}, "properties": {"repobilityId": "8894061b3f6cbac5", "scanner": "scanner-primary", "fingerprint": "0eb89f562605743b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_icon_v6_v8.py:110"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a1d57679f2a3dd0e", "level": "note", "message": {"text": "Possibly dead Python function: render_v6"}, "properties": {"repobilityId": "6e01f9ea660a9451", "scanner": "scanner-primary", "fingerprint": "a1d57679f2a3dd0e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_icon_v6_v8.py:140"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4c23f3a9aac36965", "level": "note", "message": {"text": "Possibly dead Python function: render_v7"}, "properties": {"repobilityId": "dc82b43c329ed00a", "scanner": "scanner-primary", "fingerprint": "4c23f3a9aac36965", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_icon_v6_v8.py:246"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-932d485fac813875", "level": "note", "message": {"text": "Possibly dead Python function: render_v8"}, "properties": {"repobilityId": "d4f98eb17cfcc643", "scanner": "scanner-primary", "fingerprint": "932d485fac813875", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_icon_v6_v8.py:351"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-94ecaba56304e8f9", "level": "note", "message": {"text": "Possibly dead Python function: variant_1"}, "properties": {"repobilityId": "9ee9c227e33ea5c4", "scanner": "scanner-primary", "fingerprint": "94ecaba56304e8f9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_icon_candidates.py:100"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2e749d80140cded1", "level": "note", "message": {"text": "Possibly dead Python function: variant_2"}, "properties": {"repobilityId": "d0c7a2a7f3a8577e", "scanner": "scanner-primary", "fingerprint": "2e749d80140cded1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_icon_candidates.py:124"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d47415afc2665297", "level": "note", "message": {"text": "Possibly dead Python function: variant_3"}, "properties": {"repobilityId": "35cafa76ee7ee201", "scanner": "scanner-primary", "fingerprint": "d47415afc2665297", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_icon_candidates.py:147"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5773d1df76eb360d", "level": "note", "message": {"text": "Possibly dead Python function: variant_4"}, "properties": {"repobilityId": "91520aba364c4cdf", "scanner": "scanner-primary", "fingerprint": "5773d1df76eb360d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_icon_candidates.py:170"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-340c8a755ce19b2f", "level": "note", "message": {"text": "Possibly dead Python function: variant_5"}, "properties": {"repobilityId": "00ed4aa4e0c4bd93", "scanner": "scanner-primary", "fingerprint": "340c8a755ce19b2f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_icon_candidates.py:193"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1d5cb0482825711e", "level": "note", "message": {"text": "Possibly dead Python function: render_v9"}, "properties": {"repobilityId": "31919d29a19352f9", "scanner": "scanner-primary", "fingerprint": "1d5cb0482825711e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_icon_v9_v11.py:193"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ee30b9c23068965e", "level": "note", "message": {"text": "Possibly dead Python function: render_v10"}, "properties": {"repobilityId": "794e57942baf716b", "scanner": "scanner-primary", "fingerprint": "ee30b9c23068965e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_icon_v9_v11.py:214"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5ed41fc2106f8f60", "level": "note", "message": {"text": "Possibly dead Python function: draw_rounded_rect"}, "properties": {"repobilityId": "5a259d38b8cc6cab", "scanner": "scanner-primary", "fingerprint": "5ed41fc2106f8f60", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_icon.py:27"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2350b9c913e7a3ff", "level": "note", "message": {"text": "Possibly dead Python function: draw_line_aa"}, "properties": {"repobilityId": "4c0c2c7328421465", "scanner": "scanner-primary", "fingerprint": "2350b9c913e7a3ff", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_icon.py:55"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-2a2cea1bc77c1cfa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 _write_script.js:134"}, "properties": {"repobilityId": "fbff237e91a4c2ee", "scanner": "scanner-primary", "fingerprint": "2a2cea1bc77c1cfa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-02a2179ca5793257", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/export-landing-code.js:55"}, "properties": {"repobilityId": "690f83bb79bc1588", "scanner": "scanner-primary", "fingerprint": "02a2179ca5793257", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9370acb47ea6992b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/materialize-template.ts:25"}, "properties": {"repobilityId": "020b0c99cd119730", "scanner": "scanner-primary", "fingerprint": "9370acb47ea6992b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0212670051cdcb74", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-db.ts:31"}, "properties": {"repobilityId": "2b5f100206c8ad15", "scanner": "scanner-primary", "fingerprint": "0212670051cdcb74", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e654e0f87aa850c9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-webhook.ts:20"}, "properties": {"repobilityId": "2efa1353f4d78c5d", "scanner": "scanner-primary", "fingerprint": "e654e0f87aa850c9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ce6830bbb8dd86f9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/validate-jsonld.ts:99"}, "properties": {"repobilityId": "f946509b338c8ba3", "scanner": "scanner-primary", "fingerprint": "ce6830bbb8dd86f9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-22fe0363b272be50", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/capture-github-guide.ts:82"}, "properties": {"repobilityId": "209bf26410385227", "scanner": "scanner-primary", "fingerprint": "22fe0363b272be50", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-272dd6beb19119bd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-email.ts:13"}, "properties": {"repobilityId": "57f60c9edc75d0a6", "scanner": "scanner-primary", "fingerprint": "272dd6beb19119bd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ddac4b0142973a75", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 templates/dev-showcase/src/components/projects-section.tsx:56"}, "properties": {"repobilityId": "3d0b8695669325fe", "scanner": "scanner-primary", "fingerprint": "ddac4b0142973a75", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9418c298812057ac", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 templates/dev-showcase/src/components/blog-section.tsx:44"}, "properties": {"repobilityId": "e902f458da046a44", "scanner": "scanner-primary", "fingerprint": "9418c298812057ac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce5c12551c86af08", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 templates/dev-showcase/src/app/layout.tsx:41"}, "properties": {"repobilityId": "ec69e8606e945519", "scanner": "scanner-primary", "fingerprint": "ce5c12551c86af08", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-fa550504b0256a3f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 templates/digital-namecard/src/components/contact-info.tsx:69"}, "properties": {"repobilityId": "f50bf3be6bbffc3f", "scanner": "scanner-primary", "fingerprint": "fa550504b0256a3f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-da753ce93ab72c3f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 templates/digital-namecard/src/app/layout.tsx:41"}, "properties": {"repobilityId": "c624c107ff1b96a2", "scanner": "scanner-primary", "fingerprint": "da753ce93ab72c3f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-fa56382d769e4e94", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 templates/link-in-bio-pro/src/app/layout.tsx:41"}, "properties": {"repobilityId": "022374a7e8a97d1d", "scanner": "scanner-primary", "fingerprint": "fa56382d769e4e94", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c53a10e91c104708", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/cli/src/index.ts:103"}, "properties": {"repobilityId": "7d672af1a16d6a76", "scanner": "scanner-primary", "fingerprint": "c53a10e91c104708", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c7bce9017bf1e8ae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/settings-nav.tsx:52"}, "properties": {"repobilityId": "7949a3df90719a97", "scanner": "scanner-primary", "fingerprint": "c7bce9017bf1e8ae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-afaeae56321bb605", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/api-token-manager.tsx:100"}, "properties": {"repobilityId": "431cf73f7a3b0f01", "scanner": "scanner-primary", "fingerprint": "afaeae56321bb605", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-144421a3d127e286", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/app-sidebar.tsx:163"}, "properties": {"repobilityId": "0439dbc617b570d4", "scanner": "scanner-primary", "fingerprint": "144421a3d127e286", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6b61a24e9845b249", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/demo/demo-banner.tsx:11"}, "properties": {"repobilityId": "ed5c4621fbf0b131", "scanner": "scanner-primary", "fingerprint": "6b61a24e9845b249", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3f57b4b334c1310b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ai/recommendation-cards.tsx:68"}, "properties": {"repobilityId": "d53844c37af168ac", "scanner": "scanner-primary", "fingerprint": "3f57b4b334c1310b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fc771752857827c7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/github/repo-selector.tsx:162"}, "properties": {"repobilityId": "9f60ecf00562dd6c", "scanner": "scanner-primary", "fingerprint": "fc771752857827c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-50a5934961e9352f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/showcase/showcase-card.tsx:90"}, "properties": {"repobilityId": "23f00c4703098ad1", "scanner": "scanner-primary", "fingerprint": "50a5934961e9352f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-882a63e0293d9299", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/showcase/showcase-leaderboard.tsx:91"}, "properties": {"repobilityId": "76c7150da0086ab0", "scanner": "scanner-primary", "fingerprint": "882a63e0293d9299", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4ebde9fe3b25e74", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/showcase/monthly-pick-card.tsx:67"}, "properties": {"repobilityId": "26dc142276b7d9ff", "scanner": "scanner-primary", "fingerprint": "d4ebde9fe3b25e74", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-110681e565cc6e08", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/share-map-button.tsx:87"}, "properties": {"repobilityId": "c3004d484171157a", "scanner": "scanner-primary", "fingerprint": "110681e565cc6e08", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-91c37d360c268f61", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/connection-type-dialog.tsx:111"}, "properties": {"repobilityId": "7b02944b1bde99e8", "scanner": "scanner-primary", "fingerprint": "91c37d360c268f61", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4b26da9231597c61", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/zone-edit-toolbar.tsx:86"}, "properties": {"repobilityId": "39ecd90a5d59a278", "scanner": "scanner-primary", "fingerprint": "4b26da9231597c61", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2fbaa0d70de1b93b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/shared-map-client.tsx:78"}, "properties": {"repobilityId": "6b7d8b4d38918d9f", "scanner": "scanner-primary", "fingerprint": "2fbaa0d70de1b93b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-62b0a3b3ad5a8186", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/service-detail-sheet.tsx:770"}, "properties": {"repobilityId": "dbdb33d05ff42fc7", "scanner": "scanner-primary", "fingerprint": "62b0a3b3ad5a8186", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c2f65493d8eab5ea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/service-env-vars-section.tsx:304"}, "properties": {"repobilityId": "fb4f1241dce6f7a8", "scanner": "scanner-primary", "fingerprint": "c2f65493d8eab5ea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3cd70c5aceba4e62", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/project-node.tsx:260"}, "properties": {"repobilityId": "e4b08f4d22c47a6e", "scanner": "scanner-primary", "fingerprint": "3cd70c5aceba4e62", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f19c5c2d46094bd5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/empty-map-state.tsx:102"}, "properties": {"repobilityId": "12ac1c9e2e5caddc", "scanner": "scanner-primary", "fingerprint": "f19c5c2d46094bd5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0220f2fe03a12901", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/catalog-sidebar.tsx:129"}, "properties": {"repobilityId": "e45234da557c37e8", "scanner": "scanner-primary", "fingerprint": "0220f2fe03a12901", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-084f6bad9fb2c411", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service-map/service-node.tsx:241"}, "properties": {"repobilityId": "093ee599643a4ef7", "scanner": "scanner-primary", "fingerprint": "084f6bad9fb2c411", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d0c2ff7a66ee01b7", "level": "note", "message": {"text": "React Flow <Controls> without dark theming \u2014 src/components/service-map/views/map-view.tsx:342"}, "properties": {"repobilityId": "a84266cd27fc302a", "scanner": "scanner-primary", "fingerprint": "d0c2ff7a66ee01b7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.controls.no-bg"]}}, {"ruleId": "scanner-ee4ffdc6dd6c396f", "level": "note", "message": {"text": "React Flow <MiniMap> without dark background \u2014 src/components/service-map/views/dependency-view.tsx:706"}, "properties": {"repobilityId": "558fc3196b75846c", "scanner": "scanner-primary", "fingerprint": "ee4ffdc6dd6c396f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.minimap.no-bg"]}}, {"ruleId": "scanner-7fa407d7157e2d5e", "level": "note", "message": {"text": "React Flow <Controls> without dark theming \u2014 src/components/service-map/views/dependency-view.tsx:704"}, "properties": {"repobilityId": "a185f25eca9c2e99", "scanner": "scanner-primary", "fingerprint": "7fa407d7157e2d5e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.controls.no-bg"]}}, {"ruleId": "scanner-1aa07221662c92b6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/oneclick-side-panel.tsx:118"}, "properties": {"repobilityId": "bc465fd588d25d55", "scanner": "scanner-primary", "fingerprint": "1aa07221662c92b6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3a8a327e570d6239", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/compact-card.tsx:80"}, "properties": {"repobilityId": "c4baadedf19516d2", "scanner": "scanner-primary", "fingerprint": "3a8a327e570d6239", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0ad1e0f42aba5ea9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/project-tree-list.tsx:250"}, "properties": {"repobilityId": "c46ca4dd178b62b3", "scanner": "scanner-primary", "fingerprint": "0ad1e0f42aba5ea9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-24c508a81711991f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/health-summary-strip.tsx:103"}, "properties": {"repobilityId": "697a622fd9e334d0", "scanner": "scanner-primary", "fingerprint": "24c508a81711991f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3ac9ecf89fed459d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/quick-actions.tsx:56"}, "properties": {"repobilityId": "f381087da0fbab7b", "scanner": "scanner-primary", "fingerprint": "3ac9ecf89fed459d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1bba22e59a3e7036", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/service-item.tsx:47"}, "properties": {"repobilityId": "0d6b9cbce4061430", "scanner": "scanner-primary", "fingerprint": "1bba22e59a3e7036", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-49a52154a9580fea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/connection-flow-map.tsx:72"}, "properties": {"repobilityId": "03d5b1b3e7da263d", "scanner": "scanner-primary", "fingerprint": "49a52154a9580fea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-202e50bfa02485f7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/project-hero-card.tsx:274"}, "properties": {"repobilityId": "080f14e3a26e195b", "scanner": "scanner-primary", "fingerprint": "202e50bfa02485f7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d04e3ab7e2994d85", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/user-detail-sheet.tsx:140"}, "properties": {"repobilityId": "bf21c2ea8c89a17e", "scanner": "scanner-primary", "fingerprint": "d04e3ab7e2994d85", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ed5b1653d85bc8f2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/user-stats-dashboard.tsx:351"}, "properties": {"repobilityId": "b2887a3b0f7a0793", "scanner": "scanner-primary", "fingerprint": "ed5b1653d85bc8f2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-89360162e6a17d0c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/ai-feature-mapping-tab.tsx:144"}, "properties": {"repobilityId": "8321f9e6e78cae6a", "scanner": "scanner-primary", "fingerprint": "89360162e6a17d0c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-41c3625b4e74459c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/deploy-errors-dashboard.tsx:363"}, "properties": {"repobilityId": "8b1c1879a698c8bc", "scanner": "scanner-primary", "fingerprint": "41c3625b4e74459c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a3028a1136f28af1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/connection-dashboard.tsx:100"}, "properties": {"repobilityId": "d1abe36eec72f7a8", "scanner": "scanner-primary", "fingerprint": "a3028a1136f28af1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-92101f6e31c262ce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/projects-preview-section.tsx:49"}, "properties": {"repobilityId": "e772ccf7fadc5e85", "scanner": "scanner-primary", "fingerprint": "92101f6e31c262ce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-58b4c1d3b77e497c", "level": "note", "message": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/landing/flow-comparison.tsx:49"}, "properties": {"repobilityId": "dad0a75f8f3c6aea", "scanner": "scanner-primary", "fingerprint": "58b4c1d3b77e497c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.edge-label.no-bg"]}}, {"ruleId": "scanner-45cbce1dc87f4413", "level": "note", "message": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/landing/flow-architecture-diagram.tsx:76"}, "properties": {"repobilityId": "9d153f84f482c726", "scanner": "scanner-primary", "fingerprint": "45cbce1dc87f4413", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.edge-label.no-bg"]}}, {"ruleId": "scanner-a9b836bacd9da746", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service/service-list-item.tsx:46"}, "properties": {"repobilityId": "309986246b6208fd", "scanner": "scanner-primary", "fingerprint": "a9b836bacd9da746", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8616de329706452c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service/env-import-dialog.tsx:175"}, "properties": {"repobilityId": "6bc1bf9e41ea6a94", "scanner": "scanner-primary", "fingerprint": "8616de329706452c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-71ab9637abb7cfcb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service/service-detail-client.tsx:329"}, "properties": {"repobilityId": "a4a536f00431da35", "scanner": "scanner-primary", "fingerprint": "71ab9637abb7cfcb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e2f21a8b87513d43", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service/cost-simulator-client.tsx:160"}, "properties": {"repobilityId": "9787caef3c3eb79c", "scanner": "scanner-primary", "fingerprint": "e2f21a8b87513d43", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-da0e843ec9e90dea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/service/setup-architecture-preview.tsx:25"}, "properties": {"repobilityId": "caadf20aa64e8fae", "scanner": "scanner-primary", "fingerprint": "da0e843ec9e90dea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a877984ee88fead1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/oneclick/deploy-progress.tsx:132"}, "properties": {"repobilityId": "2b58d6556d720457", "scanner": "scanner-primary", "fingerprint": "a877984ee88fead1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b38ad1673dd99e3f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/oneclick/deploy-success.tsx:108"}, "properties": {"repobilityId": "80cf6073952ef6b8", "scanner": "scanner-primary", "fingerprint": "b38ad1673dd99e3f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-395921322e70f09f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/my-sites/site-editor-client.tsx:1066"}, "properties": {"repobilityId": "bf01a5b872a88d62", "scanner": "scanner-primary", "fingerprint": "395921322e70f09f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4d83bd1a1b6fb22f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/my-sites/module-panel.tsx:156"}, "properties": {"repobilityId": "c0bc0e0ea45a841e", "scanner": "scanner-primary", "fingerprint": "4d83bd1a1b6fb22f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-76a4ff7f2e50f5a2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/my-sites/deploy-site-card.tsx:195"}, "properties": {"repobilityId": "4856da3c10cbad05", "scanner": "scanner-primary", "fingerprint": "76a4ff7f2e50f5a2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9321fffc73a68518", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guides/guides-hub.tsx:138"}, "properties": {"repobilityId": "69281157b060cf72", "scanner": "scanner-primary", "fingerprint": "9321fffc73a68518", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-64a92029dfd0e101", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/guides/security-guide/common-mistakes-section.tsx:30"}, "properties": {"repobilityId": "f0e5a74800adf128", "scanner": "scanner-primary", "fingerprint": "64a92029dfd0e101", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e8dd81e1bf00d9e2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/guides/security-guide/checklist-section.tsx:50"}, "properties": {"repobilityId": "3670246760d24b5b", "scanner": "scanner-primary", "fingerprint": "e8dd81e1bf00d9e2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-3ddb690aa44b83ad", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/guides/security-guide/web-vulnerabilities-content.tsx:24"}, "properties": {"repobilityId": "d22b13a33edffa61", "scanner": "scanner-primary", "fingerprint": "3ddb690aa44b83ad", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-43d7423612c86896", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/guides/api-basics-guide/fetch-axios-content.tsx:53"}, "properties": {"repobilityId": "a47cb5a3d7a92c08", "scanner": "scanner-primary", "fingerprint": "43d7423612c86896", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1fc9a9c67b63f0aa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guides/auth-guide/console-frame.tsx:17"}, "properties": {"repobilityId": "5689803265bafa2e", "scanner": "scanner-primary", "fingerprint": "1fc9a9c67b63f0aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-958a4c0a57dbac27", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guides/auth-guide/annotated-screenshot.tsx:50"}, "properties": {"repobilityId": "46c8d13b01b66b83", "scanner": "scanner-primary", "fingerprint": "958a4c0a57dbac27", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec39ee26a1a2c923", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/credentials/credentials-table.tsx:275"}, "properties": {"repobilityId": "2eb7b39c103bd7c9", "scanner": "scanner-primary", "fingerprint": "ec39ee26a1a2c923", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3bf252f4875fefee", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/feedback/PageTreePicker.tsx:46"}, "properties": {"repobilityId": "999539fd3435c0b2", "scanner": "scanner-primary", "fingerprint": "3bf252f4875fefee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ebab3610aefdc19a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/cost-service-list.tsx:191"}, "properties": {"repobilityId": "278ab1497b14ec5f", "scanner": "scanner-primary", "fingerprint": "ebab3610aefdc19a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a424d0c67fb16d60", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/services-content.tsx:151"}, "properties": {"repobilityId": "79dabd0601901595", "scanner": "scanner-primary", "fingerprint": "a424d0c67fb16d60", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3172d7056f7f444c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/health-summary-card.tsx:77"}, "properties": {"repobilityId": "3d50c0b41a226ce2", "scanner": "scanner-primary", "fingerprint": "3172d7056f7f444c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2a2e86c8a6e00af5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/connections-content.tsx:462"}, "properties": {"repobilityId": "e2821428790e5389", "scanner": "scanner-primary", "fingerprint": "2a2e86c8a6e00af5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f579660112ab2774", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/project-card.tsx:205"}, "properties": {"repobilityId": "d29f19db3572049e", "scanner": "scanner-primary", "fingerprint": "f579660112ab2774", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4b8b92c8ff43e0a0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/health-timeline.tsx:60"}, "properties": {"repobilityId": "1dc61faf60d98666", "scanner": "scanner-primary", "fingerprint": "4b8b92c8ff43e0a0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2766c53be0fe2374", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/cost-attachments-panel.tsx:313"}, "properties": {"repobilityId": "e86e3dae9f81fe15", "scanner": "scanner-primary", "fingerprint": "2766c53be0fe2374", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-efbe312ddecc24b2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/audit-content.tsx:171"}, "properties": {"repobilityId": "bb3c1498b84db5bc", "scanner": "scanner-primary", "fingerprint": "efbe312ddecc24b2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f6aed8023270b13d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/project/cost-openai-usage-panel.tsx:235"}, "properties": {"repobilityId": "bf0dcd77ad251315", "scanner": "scanner-primary", "fingerprint": "f6aed8023270b13d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1f8b26d6feda276c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/json-ld-script.tsx:11"}, "properties": {"repobilityId": "02fb991dd25b31eb", "scanner": "scanner-primary", "fingerprint": "1f8b26d6feda276c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-53aef384cbd0fce8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/developer/page.tsx:89"}, "properties": {"repobilityId": "a2301c6ff18e14d6", "scanner": "scanner-primary", "fingerprint": "53aef384cbd0fce8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f13ccfd598b14bae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/demo/project/[id]/services/page.tsx:102"}, "properties": {"repobilityId": "16716a238e8cd93e", "scanner": "scanner-primary", "fingerprint": "f13ccfd598b14bae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9f7b16d77d8341de", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/demo/project/[id]/costs/page.tsx:132"}, "properties": {"repobilityId": "fd64e903aca1a56d", "scanner": "scanner-primary", "fingerprint": "9f7b16d77d8341de", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9b327b5216ff7612", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/demo/project/[id]/connections/page.tsx:105"}, "properties": {"repobilityId": "faf96c27109ad39c", "scanner": "scanner-primary", "fingerprint": "9b327b5216ff7612", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-01fdb085e0e43a22", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/showcase/[id]/page.tsx:155"}, "properties": {"repobilityId": "179361e8929390bf", "scanner": "scanner-primary", "fingerprint": "01fdb085e0e43a22", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b30ed91f37ec487a", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/toss/confirm/route.ts:27"}, "properties": {"repobilityId": "c8a3e8ed44320bd2", "scanner": "scanner-primary", "fingerprint": "b30ed91f37ec487a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-63a3df6edfb9c607", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/toss/checkout/route.ts:27"}, "properties": {"repobilityId": "221c74eae6b6b59a", "scanner": "scanner-primary", "fingerprint": "63a3df6edfb9c607", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-37013d3bbfd80d5c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/trash/page.tsx:80"}, "properties": {"repobilityId": "8a4e68bd42910c5d", "scanner": "scanner-primary", "fingerprint": "37013d3bbfd80d5c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-716f5e3af8617986", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/admin/showcase/page.tsx:131"}, "properties": {"repobilityId": "1f4bd4e3702d0c0c", "scanner": "scanner-primary", "fingerprint": "716f5e3af8617986", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-da0418ded07b2865", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(dashboard)/sites/showcase/page.tsx:183"}, "properties": {"repobilityId": "3a1f881e535fa6bf", "scanner": "scanner-primary", "fingerprint": "da0418ded07b2865", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-95c8b9dee5130daa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/shared/map/[token]/page.tsx:33"}, "properties": {"repobilityId": "a6fdf66286a9a600", "scanner": "scanner-primary", "fingerprint": "95c8b9dee5130daa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c0b4fea3a27e8de", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/services/compare/page.tsx:44"}, "properties": {"repobilityId": "e1c8c28c38328b82", "scanner": "scanner-primary", "fingerprint": "1c0b4fea3a27e8de", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-acd9266bd7f95158", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/guides/security/web-vulnerabilities/page.tsx:21"}, "properties": {"repobilityId": "b11c9e4db036554b", "scanner": "scanner-primary", "fingerprint": "acd9266bd7f95158", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c70a808813161679", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/oneclick/generators/base-generator.ts:598"}, "properties": {"repobilityId": "3f88940d056ce55b", "scanner": "scanner-primary", "fingerprint": "c70a808813161679", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e28c4bfefe015a08", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/oneclick/generators/freelancer-page.ts:361"}, "properties": {"repobilityId": "4b4d4a0e6db50bbc", "scanner": "scanner-primary", "fingerprint": "e28c4bfefe015a08", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-25edd9b5799a9851", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/oneclick/generators/personal-brand.ts:291"}, "properties": {"repobilityId": "645f89cee3c1d35c", "scanner": "scanner-primary", "fingerprint": "25edd9b5799a9851", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-422fab34f4dc036a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/oneclick/generators/invitation.ts:318"}, "properties": {"repobilityId": "2538c675ab4aae71", "scanner": "scanner-primary", "fingerprint": "422fab34f4dc036a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-92d6068ed186f55f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/oneclick/generators/dev-showcase.ts:382"}, "properties": {"repobilityId": "0420c40bbf0ecb8a", "scanner": "scanner-primary", "fingerprint": "92d6068ed186f55f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-cdf113d230d0affe", "level": "error", "message": {"text": "Insecure pattern 'eval_used' in scripts/generate_icon_candidates.py:370"}, "properties": {"repobilityId": "7d68bc7e7e76a63a", "scanner": "scanner-primary", "fingerprint": "cdf113d230d0affe", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "eval_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_icon_candidates.py"}, "region": {"startLine": 370}}}]}, {"ruleId": "scanner-9fbd915960084c64", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/components/guides/security-guide/common-mistakes-section.tsx:43"}, "properties": {"repobilityId": "d24aaf106f127c58", "scanner": "scanner-primary", "fingerprint": "9fbd915960084c64", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/guides/security-guide/common-mistakes-section.tsx"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-dcdb60d9ac84fc0c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/guides/security-guide/checklist-section.tsx:50"}, "properties": {"repobilityId": "b45bc6b6291b5427", "scanner": "scanner-primary", "fingerprint": "dcdb60d9ac84fc0c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/guides/security-guide/checklist-section.tsx"}, "region": {"startLine": 50}}}]}, {"ruleId": "scanner-b271e07eb7e61308", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/components/guides/security-guide/checklist-section.tsx:60"}, "properties": {"repobilityId": "6df60f8751d7ee55", "scanner": "scanner-primary", "fingerprint": "b271e07eb7e61308", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/guides/security-guide/checklist-section.tsx"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-913465382dc2c27c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/guides/security-guide/web-vulnerabilities-content.tsx:24"}, "properties": {"repobilityId": "5d88ebf4f88173cc", "scanner": "scanner-primary", "fingerprint": "913465382dc2c27c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/guides/security-guide/web-vulnerabilities-content.tsx"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-19facfc31eb3e385", "level": "error", "message": {"text": "Possible secret in src/components/guides/api-basics-guide/api-auth-content.tsx"}, "properties": {"repobilityId": "13710b7a491d26f0", "scanner": "scanner-primary", "fingerprint": "19facfc31eb3e385", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/guides/api-basics-guide/api-auth-content.tsx"}, "region": {"startLine": 177}}}]}, {"ruleId": "scanner-fdf51b0afca6592e", "level": "error", "message": {"text": "Possible secret in src/components/credentials/credentials-table.tsx"}, "properties": {"repobilityId": "3d3fa8424115a957", "scanner": "scanner-primary", "fingerprint": "fdf51b0afca6592e", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/credentials/credentials-table.tsx"}, "region": {"startLine": 324}}}]}, {"ruleId": "scanner-ae68b1243d3134e0", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/json-ld-script.tsx:11"}, "properties": {"repobilityId": "818dfc77610b07b8", "scanner": "scanner-primary", "fingerprint": "ae68b1243d3134e0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/seo/json-ld-script.tsx"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-f3976907b1592b71", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/services/compare/page.tsx:44"}, "properties": {"repobilityId": "0df4a83b6433d29e", "scanner": "scanner-primary", "fingerprint": "f3976907b1592b71", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/services/compare/page.tsx"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-8de8f1647425f17f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/guides/security/web-vulnerabilities/page.tsx:21"}, "properties": {"repobilityId": "0f8b951130ffb610", "scanner": "scanner-primary", "fingerprint": "8de8f1647425f17f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/guides/security/web-vulnerabilities/page.tsx"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-1bbfc4413df18714", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/lib/oneclick/generators/base-generator.ts:598"}, "properties": {"repobilityId": "b607bbffe5ae3a03", "scanner": "scanner-primary", "fingerprint": "1bbfc4413df18714", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/oneclick/generators/base-generator.ts"}, "region": {"startLine": 598}}}]}, {"ruleId": "scanner-7f55074561e3a749", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/lib/oneclick/generators/freelancer-page.ts:361"}, "properties": {"repobilityId": "aa62ef145622fcc7", "scanner": "scanner-primary", "fingerprint": "7f55074561e3a749", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/oneclick/generators/freelancer-page.ts"}, "region": {"startLine": 361}}}]}, {"ruleId": "scanner-42b18f37683dba8c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/lib/oneclick/generators/personal-brand.ts:291"}, "properties": {"repobilityId": "dec2b108575c8cad", "scanner": "scanner-primary", "fingerprint": "42b18f37683dba8c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/oneclick/generators/personal-brand.ts"}, "region": {"startLine": 291}}}]}, {"ruleId": "scanner-4c3984d237bcb39b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/lib/oneclick/generators/invitation.ts:318"}, "properties": {"repobilityId": "c363dd96863f2dec", "scanner": "scanner-primary", "fingerprint": "4c3984d237bcb39b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/oneclick/generators/invitation.ts"}, "region": {"startLine": 318}}}]}, {"ruleId": "scanner-20a79de08d9e81fe", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/lib/oneclick/generators/dev-showcase.ts:382"}, "properties": {"repobilityId": "79939713d1afa908", "scanner": "scanner-primary", "fingerprint": "20a79de08d9e81fe", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/oneclick/generators/dev-showcase.ts"}, "region": {"startLine": 382}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "d8772e445ad1bf7d", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bd7f3c1c34d83159", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 99}}}]}, {"ruleId": "scanner-2da8e469d97c6b3b", "level": "note", "message": {"text": "Very large file: src/components/my-sites/site-editor-client.tsx (1683 lines)"}, "properties": {"repobilityId": "c266a4a0e6b5bab7", "scanner": "scanner-primary", "fingerprint": "2da8e469d97c6b3b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f4ba1df2c8e06ea9", "level": "note", "message": {"text": "Very large file: src/components/project/cost-report-page.tsx (1171 lines)"}, "properties": {"repobilityId": "f94474bde10d9e84", "scanner": "scanner-primary", "fingerprint": "f4ba1df2c8e06ea9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "6741ff446e07df08", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-8c2e3196a4ef0cdd", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/cli/package.json"}, "properties": {"repobilityId": "2faf23490612d7a6", "scanner": "scanner-primary", "fingerprint": "8c2e3196a4ef0cdd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/cli/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "d204f943ea83fe8e", "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": "31424bdee967a31c", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "73bf0325d84bcfc6", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "3226d2158003f35e", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "9b6bc19e3b4fd176", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "e64c5f918e66dac7", "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": "13f3080061e38aa8", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-2c84ed895966bbfb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-blog-diagrams.mjs:20"}, "properties": {"repobilityId": "f1124a0cd19403d7", "scanner": "scanner-primary", "fingerprint": "2c84ed895966bbfb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ddd0e4369a6e32de", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-blog-diagrams-v3.mjs:16"}, "properties": {"repobilityId": "0be0fb284752cdc0", "scanner": "scanner-primary", "fingerprint": "ddd0e4369a6e32de", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ae9c6c0c7338357c", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/capture-guide-screenshots.ts:247"}, "properties": {"repobilityId": "f94fd2aa2fc627db", "scanner": "scanner-primary", "fingerprint": "ae9c6c0c7338357c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0d2141ac894ebf88", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-og-images.mjs:78"}, "properties": {"repobilityId": "35dccf12c1264d43", "scanner": "scanner-primary", "fingerprint": "0d2141ac894ebf88", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-75dc00703befa868", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-blog-diagrams-v2.mjs:16"}, "properties": {"repobilityId": "620d121a6e2e966e", "scanner": "scanner-primary", "fingerprint": "75dc00703befa868", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b799cb0802f05a4f", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/generate_assets.py:47"}, "properties": {"repobilityId": "a35a0101549d24e6", "scanner": "scanner-primary", "fingerprint": "b799cb0802f05a4f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-324e6c664ab32cbe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/settings/api-token-manager.tsx:58"}, "properties": {"repobilityId": "9328dd6458e58113", "scanner": "scanner-primary", "fingerprint": "324e6c664ab32cbe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b1ed9e9fd3f7ed98", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/service-map/hooks/useServiceMapData.ts:153"}, "properties": {"repobilityId": "82a9265e36903896", "scanner": "scanner-primary", "fingerprint": "b1ed9e9fd3f7ed98", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d76606ac7d59d7be", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/deploy-errors-dashboard.tsx:113"}, "properties": {"repobilityId": "319fec7504beb5ca", "scanner": "scanner-primary", "fingerprint": "d76606ac7d59d7be", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-471843cc951afade", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mfa/mfa-challenge-dialog.tsx:43"}, "properties": {"repobilityId": "04fa02e3553fa7e6", "scanner": "scanner-primary", "fingerprint": "471843cc951afade", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-54557e1fbf81ea2c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/my-sites/site-editor-client.tsx:385"}, "properties": {"repobilityId": "b1ed14c06f8d8d38", "scanner": "scanner-primary", "fingerprint": "54557e1fbf81ea2c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6911b4b5cee7fda9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/openai-guide.tsx:187"}, "properties": {"repobilityId": "c277cf021cb63b65", "scanner": "scanner-primary", "fingerprint": "6911b4b5cee7fda9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cd7f931f1e4d8593", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/ai-tools-guide/ai-api-content.tsx:64"}, "properties": {"repobilityId": "3bda46d830f78435", "scanner": "scanner-primary", "fingerprint": "cd7f931f1e4d8593", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ba99c4f11b5e7cb9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/frontend-guide/react-nextjs-content.tsx:60"}, "properties": {"repobilityId": "df3ca70c5c12ebf6", "scanner": "scanner-primary", "fingerprint": "ba99c4f11b5e7cb9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1273df495c32aec2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/frontend-guide/rendering-modes-content.tsx:40"}, "properties": {"repobilityId": "bf93c490fd84c580", "scanner": "scanner-primary", "fingerprint": "1273df495c32aec2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-67e10b6827f85519", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/backend-guide/api-section.tsx:9"}, "properties": {"repobilityId": "6f8e9d4f6dd60f17", "scanner": "scanner-primary", "fingerprint": "67e10b6827f85519", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a7e08053ee7a21d8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/automation-guide/sns-api-content.tsx:74"}, "properties": {"repobilityId": "3c6a5061ed619105", "scanner": "scanner-primary", "fingerprint": "a7e08053ee7a21d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ce5b86636655edc8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/cloudflare-guide/secrets-guide.tsx:142"}, "properties": {"repobilityId": "27ac93f95fed02f7", "scanner": "scanner-primary", "fingerprint": "ce5b86636655edc8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-12d5ba5325accedb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/security-guide/common-mistakes-section.tsx:14"}, "properties": {"repobilityId": "049cc7009bb20c10", "scanner": "scanner-primary", "fingerprint": "12d5ba5325accedb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6ffe1a2139fa80b6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/security-guide/web-vulnerabilities-content.tsx:17"}, "properties": {"repobilityId": "01e06c1db0448f6b", "scanner": "scanner-primary", "fingerprint": "6ffe1a2139fa80b6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9074d5511409b5b2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/api-basics-guide/real-world-section.tsx:11"}, "properties": {"repobilityId": "78308ac25f153b79", "scanner": "scanner-primary", "fingerprint": "9074d5511409b5b2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-24b74e64752e3251", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/api-basics-guide/fetch-axios-content.tsx:37"}, "properties": {"repobilityId": "bf2cec79975c5071", "scanner": "scanner-primary", "fingerprint": "24b74e64752e3251", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d32acf3bbd5af691", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/api-basics-guide/api-auth-content.tsx:133"}, "properties": {"repobilityId": "8a1f53f51078ab1b", "scanner": "scanner-primary", "fingerprint": "d32acf3bbd5af691", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5282dfca10e2f060", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/payment-guide/toss-content.tsx:119"}, "properties": {"repobilityId": "5f283cc243a814ae", "scanner": "scanner-primary", "fingerprint": "5282dfca10e2f060", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-490eff55edd29bb3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/payment-guide/stripe-content.tsx:83"}, "properties": {"repobilityId": "7e4f3b68fd4772f2", "scanner": "scanner-primary", "fingerprint": "490eff55edd29bb3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-50aa0074514545f8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guides/openai-guide/nextjs-integration-guide.tsx:167"}, "properties": {"repobilityId": "982f35b64a40c8e7", "scanner": "scanner-primary", "fingerprint": "50aa0074514545f8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dc5d12b3c6802a19", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/oneclick/deploy/route.ts:188"}, "properties": {"repobilityId": "2cdcee24fe0839e2", "scanner": "scanner-primary", "fingerprint": "dc5d12b3c6802a19", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-09b0039e34165c62", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/stripe/portal/route.ts:29"}, "properties": {"repobilityId": "e29644635fe1c3c1", "scanner": "scanner-primary", "fingerprint": "09b0039e34165c62", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c9371d1a96659bd1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/stripe/checkout/route.ts:35"}, "properties": {"repobilityId": "4ef9f7a26717f664", "scanner": "scanner-primary", "fingerprint": "c9371d1a96659bd1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a8512c61b238bd6b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/guides/frontend/rendering-modes/page.tsx:21"}, "properties": {"repobilityId": "3824fc839c72606e", "scanner": "scanner-primary", "fingerprint": "a8512c61b238bd6b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bf227072c39f18fc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai/openai.ts:72"}, "properties": {"repobilityId": "fd47dd2b7a3516b6", "scanner": "scanner-primary", "fingerprint": "bf227072c39f18fc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-974dac82d3935471", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/github/pages.ts:67"}, "properties": {"repobilityId": "355a0dba3c869372", "scanner": "scanner-primary", "fingerprint": "974dac82d3935471", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-97623030ceef2754", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/github/client.ts:15"}, "properties": {"repobilityId": "c2f08dc732ea2cd1", "scanner": "scanner-primary", "fingerprint": "97623030ceef2754", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7d1adf560a572c65", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/openai/usage.ts:4"}, "properties": {"repobilityId": "13317fdf448b62c4", "scanner": "scanner-primary", "fingerprint": "7d1adf560a572c65", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-64cfe9249cbdf6a3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/admin-users.ts:24"}, "properties": {"repobilityId": "50575e61775eb0d9", "scanner": "scanner-primary", "fingerprint": "64cfe9249cbdf6a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-399e7ac38e299a18", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/env-vars.ts:99"}, "properties": {"repobilityId": "3855abfd7a36730c", "scanner": "scanner-primary", "fingerprint": "399e7ac38e299a18", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-58bcf5e107ed9d49", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/dashboard.ts:10"}, "properties": {"repobilityId": "cc10f5151232ecdb", "scanner": "scanner-primary", "fingerprint": "58bcf5e107ed9d49", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1795b4cd9b466390", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/credentials.ts:11"}, "properties": {"repobilityId": "7290104289969553", "scanner": "scanner-primary", "fingerprint": "1795b4cd9b466390", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-55429830b8d3fa35", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/share.ts:14"}, "properties": {"repobilityId": "93bf6395a9bfc6ab", "scanner": "scanner-primary", "fingerprint": "55429830b8d3fa35", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-529a8ba281dd6b00", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/linked-accounts.ts:46"}, "properties": {"repobilityId": "3b478a3ddce2b27f", "scanner": "scanner-primary", "fingerprint": "529a8ba281dd6b00", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-819f744933b25f53", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/github.ts:54"}, "properties": {"repobilityId": "4d17c176880368c2", "scanner": "scanner-primary", "fingerprint": "819f744933b25f53", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bf4cd054e9588e7f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/layer-overrides.ts:24"}, "properties": {"repobilityId": "922acb602ff1b44e", "scanner": "scanner-primary", "fingerprint": "bf4cd054e9588e7f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1a893a5e1c947a09", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/services.ts:29"}, "properties": {"repobilityId": "43da68a507c41f6e", "scanner": "scanner-primary", "fingerprint": "1a893a5e1c947a09", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-05cd63e254a05206", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/analyze.ts:59"}, "properties": {"repobilityId": "f0e72b8442216312", "scanner": "scanner-primary", "fingerprint": "05cd63e254a05206", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-41ffb28f74e18e24", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/github-connections.ts:11"}, "properties": {"repobilityId": "82d4d9cc4c0211eb", "scanner": "scanner-primary", "fingerprint": "41ffb28f74e18e24", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e67edb17a87cce86", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/connections.ts:20"}, "properties": {"repobilityId": "8f7ff664539da70c", "scanner": "scanner-primary", "fingerprint": "e67edb17a87cce86", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-96a82312fa17e1de", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/costs.ts:13"}, "properties": {"repobilityId": "0c7913cf8b8c0c75", "scanner": "scanner-primary", "fingerprint": "96a82312fa17e1de", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3fc7bc3d618153e1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/projects.ts:67"}, "properties": {"repobilityId": "03c317a04a1ed199", "scanner": "scanner-primary", "fingerprint": "3fc7bc3d618153e1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-47df35566985e243", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/oneclick.ts:88"}, "properties": {"repobilityId": "1ac829699e3ae410", "scanner": "scanner-primary", "fingerprint": "47df35566985e243", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2b858563db588a27", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/service-accounts.ts:9"}, "properties": {"repobilityId": "2f89846992d3234f", "scanner": "scanner-primary", "fingerprint": "2b858563db588a27", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3d1fb379f39c42ea", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/feedback.ts:29"}, "properties": {"repobilityId": "605218d331c32946", "scanner": "scanner-primary", "fingerprint": "3d1fb379f39c42ea", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-61d300a2d1c43f94", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/admin-visitors.ts:9"}, "properties": {"repobilityId": "d1e8c4e6d57c10ce", "scanner": "scanner-primary", "fingerprint": "61d300a2d1c43f94", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-84c1e84478962dbf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/showcase.ts:50"}, "properties": {"repobilityId": "d930842b4019f355", "scanner": "scanner-primary", "fingerprint": "84c1e84478962dbf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-096711a3d8c5aa05", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/zone-layout.ts:22"}, "properties": {"repobilityId": "a9401e5938349ead", "scanner": "scanner-primary", "fingerprint": "096711a3d8c5aa05", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3268abff9ba3bdaa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/admin-usage-stats.ts:9"}, "properties": {"repobilityId": "9bd7e6af53ca6a4a", "scanner": "scanner-primary", "fingerprint": "3268abff9ba3bdaa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5c199c259e5c2737", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/queries/trash.ts:11"}, "properties": {"repobilityId": "8d12b759293867ff", "scanner": "scanner-primary", "fingerprint": "5c199c259e5c2737", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f1c4bab16225e152", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo/indexnow.ts:27"}, "properties": {"repobilityId": "730a492316500c68", "scanner": "scanner-primary", "fingerprint": "f1c4bab16225e152", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a6726006b109eedd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/use-deploy-machine.ts:234"}, "properties": {"repobilityId": "f8c8064424a89dff", "scanner": "scanner-primary", "fingerprint": "a6726006b109eedd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "e0eebd571467351b", "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": "b6b4adb400caf59c", "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": "cacef6f3e5508243", "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": "726c37830618b2fc", "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": "f186f6b44663cb2b", "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": "9b83cfe79d436d74", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}