{"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-c85aec0d66fd539b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/components/site/terminal-window.tsx:25", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/components/site/terminal-window.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-7ce3558a75ba2e3b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/components/site/updates-bell.tsx:151", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/components/site/updates-bell.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-b3842e118edda4a2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/docs/app/layout.tsx:40", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/docs/app/layout.tsx:40"}, "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-a39ef35dc8564b8f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/testimonial-cards.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/testimonial-cards.tsx:65"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-38401a09534a48a4", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/country-input.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/country-input.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-5ee444e82252be1b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/phone-number-input.tsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/phone-number-input.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-bf7b60d4039f8c7e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/account-card.tsx:53", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/account-card.tsx:53"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-55fbf4b1395bf3a9", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/integration-cards.tsx:66", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/integration-cards.tsx:66"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f30eb1557e46a5f3", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/api-key-manager.tsx:176", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/api-key-manager.tsx:176"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5817cbf6f854ed5b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/file-dropzone.tsx:190", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/file-dropzone.tsx:190"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-53c4ff895e7c29c9", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/search-results.tsx:110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/search-results.tsx:110"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fbf2503924569946", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/onboarding-stepper.tsx:83", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/onboarding-stepper.tsx:83"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4e66e88cf9e75a95", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/language-search.tsx:104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/language-search.tsx:104"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-19bdbd6fd61045be", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/demos/onboarding-stepper-demo.tsx:227", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/demos/onboarding-stepper-demo.tsx:227"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-02a5d449082c3825", "name": "Stray `console.log` in TS/JS \u2014 apps/docs/registry/demos/team-members-table-demo.tsx:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/docs/registry/demos/team-members-table-demo.tsx:62"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-652511b96549e59f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/demos/app-shell-demo.tsx:90", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/demos/app-shell-demo.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-37a0eb26157346ac", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-voice-studio.tsx:330", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-voice-studio.tsx:330"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1ddbd1bb9035d9ca", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/reconciliation.tsx:316", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/reconciliation.tsx:316"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4f5ac7a2f400a5e5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-agents-console.tsx:159", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-agents-console.tsx:159"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e3430d6ed47d868a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/fashion-store.tsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/fashion-store.tsx:142"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d125a565681c5bc6", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-research-assistant.tsx:143", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-research-assistant.tsx:143"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c2ba265d2d709ff7", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/social-scheduler.tsx:185", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/social-scheduler.tsx:185"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1d2c91116494ccd1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/tech-blog.tsx:385", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/tech-blog.tsx:385"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7976dba0d601b052", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/contacts-crm.tsx:261", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/contacts-crm.tsx:261"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c907b0b43d61d3f8", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/customer-360.tsx:340", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/customer-360.tsx:340"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-111d2687cfcff7ce", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/analytics-dashboard.tsx:115", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/analytics-dashboard.tsx:115"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2bbba93c8d4909fe", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/partner-crm.tsx:307", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/partner-crm.tsx:307"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-acb9623819ac43e6", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-photo-editor.tsx:295", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-photo-editor.tsx:295"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0c77019abf84cad7", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/support-desk.tsx:357", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/support-desk.tsx:357"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c10f1493aa2a0a7e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/roadmap-app.tsx:430", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/roadmap-app.tsx:430"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fff70fa1efb88325", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-email-assistant.tsx:226", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-email-assistant.tsx:226"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-672daf135eccf9c4", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/about-company.tsx:298", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/about-company.tsx:298"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-571b1b14ac939668", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/workspace-app.tsx:160", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/workspace-app.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-39130936c916d296", "name": "Stray `console.log` in TS/JS \u2014 apps/docs/templates/developers-page.tsx:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/docs/templates/developers-page.tsx:50"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-83fd51ee662b02c2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-chatbot-builder.tsx:320", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-chatbot-builder.tsx:320"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-733c91b78750858c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/help-center.tsx:215", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/help-center.tsx:215"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-beccb1b09dc915c6", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/sales-leaderboard.tsx:307", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/sales-leaderboard.tsx:307"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8757928eabf5c652", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/devtool-landing.tsx:72", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/devtool-landing.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-7fc3012676e07eb9", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-code-assistant.tsx:259", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-code-assistant.tsx:259"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4a6efec63d2b46f8", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/trading-dashboard.tsx:157", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/trading-dashboard.tsx:157"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-99fb86a5450dca1a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/lead-routing.tsx:292", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/lead-routing.tsx:292"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-85f965d49aa05da5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/time-tracking.tsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/time-tracking.tsx:123"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-57eac36e9a806ecb", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/inbox-app.tsx:292", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/inbox-app.tsx:292"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-99f170be1750e83f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/lead-inbox.tsx:337", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/lead-inbox.tsx:337"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-104dbcef6d244437", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/chat-app.tsx:216", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/chat-app.tsx:216"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bc66780e54706e32", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/task-list-app.tsx:186", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/task-list-app.tsx:186"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b176092ed22c9f33", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/booking-app.tsx:136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/booking-app.tsx:136"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4fd2c713dcc64a53", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/calendar-scheduler.tsx:175", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/calendar-scheduler.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-a94566bc32b338df", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/expense-approvals.tsx:245", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/expense-approvals.tsx:245"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-996a01a9d804a151", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/tutoring-service.tsx:288", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/tutoring-service.tsx:288"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a2c35531421e0693", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/tech-summit.tsx:333", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/tech-summit.tsx:333"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e0ce3fb8557c8c78", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/docs/templates/status-page.tsx:277", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/docs/templates/status-page.tsx:277"}, "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-62806143bb9fe6b6", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/deal-detail.tsx:249", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/deal-detail.tsx:249"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-142b8519f63e8273", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/survey-builder.tsx:280", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/survey-builder.tsx:280"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4e11bf48efdce497", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/design-blog.tsx:236", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/design-blog.tsx:236"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1caf90a899557bdd", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/growth-dashboard.tsx:432", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/growth-dashboard.tsx:432"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8a4fb656600f9859", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-translation.tsx:386", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-translation.tsx:386"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-964e18f9b36c7bcc", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/outreach-sequences.tsx:213", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/outreach-sequences.tsx:213"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7b2003a7b883b229", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/lead-scoring.tsx:277", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/lead-scoring.tsx:277"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-76cba7127f82b750", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/sound-designer-portfolio.tsx:245", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/sound-designer-portfolio.tsx:245"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-148f9dbb0ac5739d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/account-settings.tsx:392", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/account-settings.tsx:392"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-21d735a0824f81f6", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/developer-blog.tsx:324", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/developer-blog.tsx:324"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-90f78d0943672d77", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-ops-dashboard.tsx:490", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-ops-dashboard.tsx:490"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b13c9360bb5df971", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/budgeting-app.tsx:394", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/budgeting-app.tsx:394"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5cc34b3c9b4b6564", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/deals-pipeline.tsx:253", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/deals-pipeline.tsx:253"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d6fa13af3d7656f8", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/renewals-tracker.tsx:263", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/renewals-tracker.tsx:263"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6a40108255661563", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/grocery-delivery.tsx:168", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/grocery-delivery.tsx:168"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d055e5067fc92bbf", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/meeting-notes.tsx:235", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/meeting-notes.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-3b72090769234c00", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/admin-console.tsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/admin-console.tsx:196"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7d6834b47ac9b7a1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-avatar-studio.tsx:379", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-avatar-studio.tsx:379"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-93dc99ea75ba8e48", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/file-manager.tsx:308", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/file-manager.tsx:308"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-94d57faf6d560796", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/okr-tracker.tsx:380", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/okr-tracker.tsx:380"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8942c446bb24b209", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/call-center.tsx:242", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/call-center.tsx:242"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4899efb22551154e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/content-calendar.tsx:252", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/content-calendar.tsx:252"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c8e2fc97ea176666", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/crm-dashboard.tsx:143", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/crm-dashboard.tsx:143"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7ffc4946b3bd9a2e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/launch-day.tsx:241", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/launch-day.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-86cb85b03ab18291", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/cart-checkout.tsx:162", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/cart-checkout.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-be7143953d9464c7", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/docs-site.tsx:402", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/docs-site.tsx:402"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b2f9865eb5865bc9", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/realtime-dashboard.tsx:331", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/realtime-dashboard.tsx:331"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c0fabc957be40e74", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/developer-portfolio.tsx:425", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/developer-portfolio.tsx:425"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-39560cccf3315ee5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/project-dashboard.tsx:269", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/project-dashboard.tsx:269"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2cf33bbb347fb7fe", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/executive-dashboard.tsx:193", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/executive-dashboard.tsx:193"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c816b52c8099f49f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/tax-dashboard.tsx:335", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/tax-dashboard.tsx:335"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8223ee8ff74b95cb", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/intake-requests.tsx:360", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/intake-requests.tsx:360"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-47f0d87fe55848d1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/marketplace.tsx:231", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/marketplace.tsx:231"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7152a017cedff493", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ecommerce-store.tsx:231", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ecommerce-store.tsx:231"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e4a8cf9675c756a3", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/gantt-timeline.tsx:289", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/gantt-timeline.tsx:289"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2174f3b352a76c78", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/pos-system.tsx:240", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/pos-system.tsx:240"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9ebbb818ce848432", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-knowledge-base.tsx:212", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-knowledge-base.tsx:212"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7e270b34362aec1b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-search.tsx:253", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-search.tsx:253"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e4f689ea0671b262", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/customer-feedback.tsx:209", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/customer-feedback.tsx:209"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-111ce0021befc6ec", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/team-admin.tsx:179", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/team-admin.tsx:179"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1e6118c4ca5ffad7", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/funnel-analytics.tsx:278", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/funnel-analytics.tsx:278"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9cbdcbf6d0d0cd43", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-document-chat.tsx:157", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-document-chat.tsx:157"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df6787e844ff6281", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/issue-tracker.tsx:218", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/issue-tracker.tsx:218"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-054b4afad945a398", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/real-estate.tsx:354", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/real-estate.tsx:354"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-04ce6230640d45a1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/hr-platform.tsx:158", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/hr-platform.tsx:158"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-27f704b85d0688fa", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/seo-analytics.tsx:395", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/seo-analytics.tsx:395"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-468c16979b92e529", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/asset-manager.tsx:284", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/asset-manager.tsx:284"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-13c8fb20d0cc145b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-writer.tsx:186", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-writer.tsx:186"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2b5d15413f1a51a3", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/store-admin.tsx:387", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/store-admin.tsx:387"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7beb13f9e7821565", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/account-management.tsx:305", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/account-management.tsx:305"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-113a6f3478477ebf", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/social-listening.tsx:227", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/social-listening.tsx:227"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d24f7896d6ac4b3e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/investments-portfolio.tsx:230", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/investments-portfolio.tsx:230"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-573c00965c7019ae", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/food-blog.tsx:355", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/food-blog.tsx:355"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d493287846d86eb0", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/indie-hacker.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/indie-hacker.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-a921f7dac579da0b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/customer-segments.tsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/customer-segments.tsx:142"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c4ad88e254d00aa1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/integration-detail.tsx:451", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/integration-detail.tsx:451"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3311693ee5f02943", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/form-builder.tsx:234", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/form-builder.tsx:234"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fc8911f90bb8b169", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/resource-planner.tsx:206", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/resource-planner.tsx:206"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-71d96d2b179f8a1c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/payments-dashboard.tsx:416", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/payments-dashboard.tsx:416"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7fc89f11e298dde4", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/invoicing-app.tsx:176", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/invoicing-app.tsx:176"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4de24445ee873069", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/email-client.tsx:317", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/email-client.tsx:317"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-57e1ace692816e17", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/interview-series.tsx:316", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/interview-series.tsx:316"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-339e9c41d93cda1b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/sales-analytics.tsx:277", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/sales-analytics.tsx:277"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b9d0a7333646c0af", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/video-call-app.tsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/video-call-app.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-ea252687ba46adec", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/customers-page.tsx:349", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/customers-page.tsx:349"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7a11e67bf698dd06", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-data-labeling.tsx:194", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-data-labeling.tsx:194"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bc141eecbb6e86a1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/musician-portfolio.tsx:165", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/musician-portfolio.tsx:165"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3dd7b8ec6ae4c3c5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/cooking-class.tsx:283", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/cooking-class.tsx:283"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1483eda7e6d4571f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/quotes-builder.tsx:183", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/quotes-builder.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-3fe49c6f92e1ccdb", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/podcast-site.tsx:263", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/podcast-site.tsx:263"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-586784da9a978619", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/kanban-app.tsx:340", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/kanban-app.tsx:340"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4a4509693314485a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/waitlist-page.tsx:173", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/waitlist-page.tsx:173"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a18ffd68b42557d3", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/product-hunt-launch.tsx:294", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/product-hunt-launch.tsx:294"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9b8de0f6bafbe965", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/team-wiki.tsx:296", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/team-wiki.tsx:296"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7526a42de95f6eab", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/demo-request.tsx:161", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/demo-request.tsx:161"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-30288d2f759ba17f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-chat.tsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-chat.tsx:196"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-90c166e90d2c8a75", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/bug-triage.tsx:403", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/bug-triage.tsx:403"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fb60a28597ea6aff", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/workflow-automation.tsx:247", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/workflow-automation.tsx:247"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d78c6d18ee571b67", "name": "Stray `console.log` in TS/JS \u2014 packages/cli/src/commands/diff.ts:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/cli/src/commands/diff.ts:60"}, "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-6f821dc393ca849a", "name": "Stray `console.log` in TS/JS \u2014 packages/cli/src/utils/logger.ts:4", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/cli/src/utils/logger.ts:4"}, "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-fd4110311ea0d510", "name": "Insecure pattern 'dangerous_innerhtml' in apps/docs/app/layout.tsx:40", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/docs/app/layout.tsx:40"}, "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-80714f7acebff894", "name": "Insecure pattern 'node_child_process' in packages/cli/src/utils/packages.ts:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in packages/cli/src/utils/packages.ts:3"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3ac82ff909f84703", "name": "Very large file: apps/docs/lib/templates.ts (3601 lines)", "shortDescription": {"text": "Very large file: apps/docs/lib/templates.ts (3601 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": "3 test file(s) for 528 source file(s) (ratio 0.01). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c69f0b4f79af852d", "name": "Node manifest has dependencies but no lockfile: apps/docs/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/docs/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-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 14 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 570 placeholder/mock markers across 260 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: ci, tests, 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": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing ci, tests, 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-43bd202c9c581c92", "name": "Dangling fetch: GET /api/version (apps/docs/components/site/update-notifier.tsx:24)", "shortDescription": {"text": "Dangling fetch: GET /api/version (apps/docs/components/site/update-notifier.tsx:24)"}, "fullDescription": {"text": "`apps/docs/components/site/update-notifier.tsx:24` calls `GET /api/version` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/version`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-41aa9e92da3f14ad", "name": "Unused endpoint: GET /users/:id", "shortDescription": {"text": "Unused endpoint: GET /users/:id"}, "fullDescription": {"text": "`apps/docs/templates/ai-code-assistant.tsx` declares `GET /users/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8606ccc1e9d67e9a", "name": "Unused endpoint: GET /hello", "shortDescription": {"text": "Unused endpoint: GET /hello"}, "fullDescription": {"text": "`apps/docs/templates/docs-site.tsx` declares `GET /hello` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/17780"}, "properties": {"repository": "rakibulism/cano-ui", "repoUrl": "https://github.com/rakibulism/cano-ui", "branch": "main"}, "results": [{"ruleId": "scanner-c85aec0d66fd539b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/components/site/terminal-window.tsx:25"}, "properties": {"repobilityId": "d72def874d980fd8", "scanner": "scanner-primary", "fingerprint": "c85aec0d66fd539b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7ce3558a75ba2e3b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/components/site/updates-bell.tsx:151"}, "properties": {"repobilityId": "6e34568d9e4c732e", "scanner": "scanner-primary", "fingerprint": "7ce3558a75ba2e3b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b3842e118edda4a2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/docs/app/layout.tsx:40"}, "properties": {"repobilityId": "77ec1de516d354b9", "scanner": "scanner-primary", "fingerprint": "b3842e118edda4a2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a39ef35dc8564b8f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/testimonial-cards.tsx:65"}, "properties": {"repobilityId": "99696b43009b6a36", "scanner": "scanner-primary", "fingerprint": "a39ef35dc8564b8f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-38401a09534a48a4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/country-input.tsx:129"}, "properties": {"repobilityId": "6e56b9ac91e8ee49", "scanner": "scanner-primary", "fingerprint": "38401a09534a48a4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5ee444e82252be1b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/phone-number-input.tsx:118"}, "properties": {"repobilityId": "c4a36b85ed28b8da", "scanner": "scanner-primary", "fingerprint": "5ee444e82252be1b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bf7b60d4039f8c7e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/account-card.tsx:53"}, "properties": {"repobilityId": "b4b4384cbf5897f7", "scanner": "scanner-primary", "fingerprint": "bf7b60d4039f8c7e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-55fbf4b1395bf3a9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/integration-cards.tsx:66"}, "properties": {"repobilityId": "76205751de127862", "scanner": "scanner-primary", "fingerprint": "55fbf4b1395bf3a9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f30eb1557e46a5f3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/api-key-manager.tsx:176"}, "properties": {"repobilityId": "5d39291f0efed7c0", "scanner": "scanner-primary", "fingerprint": "f30eb1557e46a5f3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5817cbf6f854ed5b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/file-dropzone.tsx:190"}, "properties": {"repobilityId": "534ee78bc9ff6e35", "scanner": "scanner-primary", "fingerprint": "5817cbf6f854ed5b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-53c4ff895e7c29c9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/search-results.tsx:110"}, "properties": {"repobilityId": "afa2ec8160753559", "scanner": "scanner-primary", "fingerprint": "53c4ff895e7c29c9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fbf2503924569946", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/onboarding-stepper.tsx:83"}, "properties": {"repobilityId": "60365caec272b47d", "scanner": "scanner-primary", "fingerprint": "fbf2503924569946", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4e66e88cf9e75a95", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/ui/language-search.tsx:104"}, "properties": {"repobilityId": "d16df444e12adbae", "scanner": "scanner-primary", "fingerprint": "4e66e88cf9e75a95", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-19bdbd6fd61045be", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/demos/onboarding-stepper-demo.tsx:227"}, "properties": {"repobilityId": "5ee7d8a94afb6e39", "scanner": "scanner-primary", "fingerprint": "19bdbd6fd61045be", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-02a5d449082c3825", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/docs/registry/demos/team-members-table-demo.tsx:62"}, "properties": {"repobilityId": "a25faa6ef1cca8e4", "scanner": "scanner-primary", "fingerprint": "02a5d449082c3825", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-652511b96549e59f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/registry/demos/app-shell-demo.tsx:90"}, "properties": {"repobilityId": "919be11ace688382", "scanner": "scanner-primary", "fingerprint": "652511b96549e59f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-37a0eb26157346ac", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-voice-studio.tsx:330"}, "properties": {"repobilityId": "5277b0d422448e59", "scanner": "scanner-primary", "fingerprint": "37a0eb26157346ac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1ddbd1bb9035d9ca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/reconciliation.tsx:316"}, "properties": {"repobilityId": "f888552de680fe50", "scanner": "scanner-primary", "fingerprint": "1ddbd1bb9035d9ca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4f5ac7a2f400a5e5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-agents-console.tsx:159"}, "properties": {"repobilityId": "7066ef83b7d404cc", "scanner": "scanner-primary", "fingerprint": "4f5ac7a2f400a5e5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e3430d6ed47d868a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/fashion-store.tsx:142"}, "properties": {"repobilityId": "cd79af2313130e1c", "scanner": "scanner-primary", "fingerprint": "e3430d6ed47d868a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d125a565681c5bc6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-research-assistant.tsx:143"}, "properties": {"repobilityId": "b09e909f548bc4e3", "scanner": "scanner-primary", "fingerprint": "d125a565681c5bc6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c2ba265d2d709ff7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/social-scheduler.tsx:185"}, "properties": {"repobilityId": "c57099a7a10b6ac3", "scanner": "scanner-primary", "fingerprint": "c2ba265d2d709ff7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1d2c91116494ccd1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/tech-blog.tsx:385"}, "properties": {"repobilityId": "09cb5c3a02967144", "scanner": "scanner-primary", "fingerprint": "1d2c91116494ccd1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7976dba0d601b052", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/contacts-crm.tsx:261"}, "properties": {"repobilityId": "0da3ee6ba99f326c", "scanner": "scanner-primary", "fingerprint": "7976dba0d601b052", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c907b0b43d61d3f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/customer-360.tsx:340"}, "properties": {"repobilityId": "0a465ca2a32f3d65", "scanner": "scanner-primary", "fingerprint": "c907b0b43d61d3f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-111d2687cfcff7ce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/analytics-dashboard.tsx:115"}, "properties": {"repobilityId": "055768deb7da9c63", "scanner": "scanner-primary", "fingerprint": "111d2687cfcff7ce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2bbba93c8d4909fe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/partner-crm.tsx:307"}, "properties": {"repobilityId": "adaa3e348ffd1911", "scanner": "scanner-primary", "fingerprint": "2bbba93c8d4909fe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-acb9623819ac43e6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-photo-editor.tsx:295"}, "properties": {"repobilityId": "e8fa232490f07eac", "scanner": "scanner-primary", "fingerprint": "acb9623819ac43e6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0c77019abf84cad7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/support-desk.tsx:357"}, "properties": {"repobilityId": "abb5b1f0d45a9b98", "scanner": "scanner-primary", "fingerprint": "0c77019abf84cad7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c10f1493aa2a0a7e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/roadmap-app.tsx:430"}, "properties": {"repobilityId": "3d5a4fdd1ab47994", "scanner": "scanner-primary", "fingerprint": "c10f1493aa2a0a7e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fff70fa1efb88325", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-email-assistant.tsx:226"}, "properties": {"repobilityId": "d07a6a3bbff8da69", "scanner": "scanner-primary", "fingerprint": "fff70fa1efb88325", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-672daf135eccf9c4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/about-company.tsx:298"}, "properties": {"repobilityId": "3162221d49ae6854", "scanner": "scanner-primary", "fingerprint": "672daf135eccf9c4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-571b1b14ac939668", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/workspace-app.tsx:160"}, "properties": {"repobilityId": "2e423c84eee1f901", "scanner": "scanner-primary", "fingerprint": "571b1b14ac939668", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-39130936c916d296", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/docs/templates/developers-page.tsx:50"}, "properties": {"repobilityId": "639f4edd93221591", "scanner": "scanner-primary", "fingerprint": "39130936c916d296", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-83fd51ee662b02c2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-chatbot-builder.tsx:320"}, "properties": {"repobilityId": "8fee98318a1e52cf", "scanner": "scanner-primary", "fingerprint": "83fd51ee662b02c2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-733c91b78750858c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/help-center.tsx:215"}, "properties": {"repobilityId": "4d71379be3653b84", "scanner": "scanner-primary", "fingerprint": "733c91b78750858c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-beccb1b09dc915c6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/sales-leaderboard.tsx:307"}, "properties": {"repobilityId": "6b3d8c064e915a19", "scanner": "scanner-primary", "fingerprint": "beccb1b09dc915c6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8757928eabf5c652", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/devtool-landing.tsx:72"}, "properties": {"repobilityId": "f5c86be0878ef9d8", "scanner": "scanner-primary", "fingerprint": "8757928eabf5c652", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7fc3012676e07eb9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-code-assistant.tsx:259"}, "properties": {"repobilityId": "27d58a367f476a65", "scanner": "scanner-primary", "fingerprint": "7fc3012676e07eb9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4a6efec63d2b46f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/trading-dashboard.tsx:157"}, "properties": {"repobilityId": "c70574c628126af3", "scanner": "scanner-primary", "fingerprint": "4a6efec63d2b46f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-99fb86a5450dca1a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/lead-routing.tsx:292"}, "properties": {"repobilityId": "f4a0c2e77f353128", "scanner": "scanner-primary", "fingerprint": "99fb86a5450dca1a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-85f965d49aa05da5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/time-tracking.tsx:123"}, "properties": {"repobilityId": "2a8daafdee4d6be5", "scanner": "scanner-primary", "fingerprint": "85f965d49aa05da5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-57eac36e9a806ecb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/inbox-app.tsx:292"}, "properties": {"repobilityId": "b6ef0e4204ff364d", "scanner": "scanner-primary", "fingerprint": "57eac36e9a806ecb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-99f170be1750e83f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/lead-inbox.tsx:337"}, "properties": {"repobilityId": "1c0475c83b53e0cf", "scanner": "scanner-primary", "fingerprint": "99f170be1750e83f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-104dbcef6d244437", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/chat-app.tsx:216"}, "properties": {"repobilityId": "2047c1f8e8152800", "scanner": "scanner-primary", "fingerprint": "104dbcef6d244437", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bc66780e54706e32", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/task-list-app.tsx:186"}, "properties": {"repobilityId": "39d1744ac1a6c556", "scanner": "scanner-primary", "fingerprint": "bc66780e54706e32", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b176092ed22c9f33", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/booking-app.tsx:136"}, "properties": {"repobilityId": "ea73725fe2c33836", "scanner": "scanner-primary", "fingerprint": "b176092ed22c9f33", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4fd2c713dcc64a53", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/calendar-scheduler.tsx:175"}, "properties": {"repobilityId": "127373256ef61818", "scanner": "scanner-primary", "fingerprint": "4fd2c713dcc64a53", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a94566bc32b338df", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/expense-approvals.tsx:245"}, "properties": {"repobilityId": "9f0f9bcfe68a472b", "scanner": "scanner-primary", "fingerprint": "a94566bc32b338df", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-996a01a9d804a151", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/tutoring-service.tsx:288"}, "properties": {"repobilityId": "c9d65670a054d142", "scanner": "scanner-primary", "fingerprint": "996a01a9d804a151", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a2c35531421e0693", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/tech-summit.tsx:333"}, "properties": {"repobilityId": "150d9817a6ae27b2", "scanner": "scanner-primary", "fingerprint": "a2c35531421e0693", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e0ce3fb8557c8c78", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/docs/templates/status-page.tsx:277"}, "properties": {"repobilityId": "8a8e05c453165a48", "scanner": "scanner-primary", "fingerprint": "e0ce3fb8557c8c78", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-62806143bb9fe6b6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/deal-detail.tsx:249"}, "properties": {"repobilityId": "c5d549bdd1430864", "scanner": "scanner-primary", "fingerprint": "62806143bb9fe6b6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-142b8519f63e8273", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/survey-builder.tsx:280"}, "properties": {"repobilityId": "f82072f3dc9b4935", "scanner": "scanner-primary", "fingerprint": "142b8519f63e8273", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4e11bf48efdce497", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/design-blog.tsx:236"}, "properties": {"repobilityId": "9712159704bccf03", "scanner": "scanner-primary", "fingerprint": "4e11bf48efdce497", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1caf90a899557bdd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/growth-dashboard.tsx:432"}, "properties": {"repobilityId": "fd77881964225717", "scanner": "scanner-primary", "fingerprint": "1caf90a899557bdd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8a4fb656600f9859", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-translation.tsx:386"}, "properties": {"repobilityId": "827cbd8e278b23fe", "scanner": "scanner-primary", "fingerprint": "8a4fb656600f9859", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-964e18f9b36c7bcc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/outreach-sequences.tsx:213"}, "properties": {"repobilityId": "b9522e5aa04fff25", "scanner": "scanner-primary", "fingerprint": "964e18f9b36c7bcc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7b2003a7b883b229", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/lead-scoring.tsx:277"}, "properties": {"repobilityId": "c0511863acd363e9", "scanner": "scanner-primary", "fingerprint": "7b2003a7b883b229", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-76cba7127f82b750", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/sound-designer-portfolio.tsx:245"}, "properties": {"repobilityId": "9cfefaa1c7acac46", "scanner": "scanner-primary", "fingerprint": "76cba7127f82b750", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-148f9dbb0ac5739d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/account-settings.tsx:392"}, "properties": {"repobilityId": "81694c1cfd2f53f2", "scanner": "scanner-primary", "fingerprint": "148f9dbb0ac5739d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-21d735a0824f81f6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/developer-blog.tsx:324"}, "properties": {"repobilityId": "316ae6f6c20dc07c", "scanner": "scanner-primary", "fingerprint": "21d735a0824f81f6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-90f78d0943672d77", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-ops-dashboard.tsx:490"}, "properties": {"repobilityId": "1b1cea86366a7083", "scanner": "scanner-primary", "fingerprint": "90f78d0943672d77", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b13c9360bb5df971", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/budgeting-app.tsx:394"}, "properties": {"repobilityId": "1a83c26c11da66bf", "scanner": "scanner-primary", "fingerprint": "b13c9360bb5df971", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5cc34b3c9b4b6564", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/deals-pipeline.tsx:253"}, "properties": {"repobilityId": "63ec6459add3f1f7", "scanner": "scanner-primary", "fingerprint": "5cc34b3c9b4b6564", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d6fa13af3d7656f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/renewals-tracker.tsx:263"}, "properties": {"repobilityId": "91b66aa228dd458e", "scanner": "scanner-primary", "fingerprint": "d6fa13af3d7656f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6a40108255661563", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/grocery-delivery.tsx:168"}, "properties": {"repobilityId": "a95fcd44261824ec", "scanner": "scanner-primary", "fingerprint": "6a40108255661563", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d055e5067fc92bbf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/meeting-notes.tsx:235"}, "properties": {"repobilityId": "a02172322f24c0ca", "scanner": "scanner-primary", "fingerprint": "d055e5067fc92bbf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3b72090769234c00", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/admin-console.tsx:196"}, "properties": {"repobilityId": "9b0c2eafc8c833e3", "scanner": "scanner-primary", "fingerprint": "3b72090769234c00", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7d6834b47ac9b7a1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-avatar-studio.tsx:379"}, "properties": {"repobilityId": "8afa62c3c956cb67", "scanner": "scanner-primary", "fingerprint": "7d6834b47ac9b7a1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-93dc99ea75ba8e48", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/file-manager.tsx:308"}, "properties": {"repobilityId": "4cb497e33fe70ee9", "scanner": "scanner-primary", "fingerprint": "93dc99ea75ba8e48", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-94d57faf6d560796", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/okr-tracker.tsx:380"}, "properties": {"repobilityId": "db871b8be1c9a93b", "scanner": "scanner-primary", "fingerprint": "94d57faf6d560796", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8942c446bb24b209", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/call-center.tsx:242"}, "properties": {"repobilityId": "97566f9a45104a6b", "scanner": "scanner-primary", "fingerprint": "8942c446bb24b209", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4899efb22551154e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/content-calendar.tsx:252"}, "properties": {"repobilityId": "a579ed8316bd887f", "scanner": "scanner-primary", "fingerprint": "4899efb22551154e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c8e2fc97ea176666", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/crm-dashboard.tsx:143"}, "properties": {"repobilityId": "96207bd6fb841dc2", "scanner": "scanner-primary", "fingerprint": "c8e2fc97ea176666", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7ffc4946b3bd9a2e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/launch-day.tsx:241"}, "properties": {"repobilityId": "59be8c6d08139acf", "scanner": "scanner-primary", "fingerprint": "7ffc4946b3bd9a2e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-86cb85b03ab18291", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/cart-checkout.tsx:162"}, "properties": {"repobilityId": "5d9b9f73f6fe755c", "scanner": "scanner-primary", "fingerprint": "86cb85b03ab18291", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-be7143953d9464c7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/docs-site.tsx:402"}, "properties": {"repobilityId": "d45bed5861dd0e3f", "scanner": "scanner-primary", "fingerprint": "be7143953d9464c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b2f9865eb5865bc9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/realtime-dashboard.tsx:331"}, "properties": {"repobilityId": "11f5791b93b3c3b4", "scanner": "scanner-primary", "fingerprint": "b2f9865eb5865bc9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c0fabc957be40e74", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/developer-portfolio.tsx:425"}, "properties": {"repobilityId": "ca947c4718d677b9", "scanner": "scanner-primary", "fingerprint": "c0fabc957be40e74", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-39560cccf3315ee5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/project-dashboard.tsx:269"}, "properties": {"repobilityId": "d0cc61d319f82039", "scanner": "scanner-primary", "fingerprint": "39560cccf3315ee5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2cf33bbb347fb7fe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/executive-dashboard.tsx:193"}, "properties": {"repobilityId": "fccabd523d9a077e", "scanner": "scanner-primary", "fingerprint": "2cf33bbb347fb7fe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c816b52c8099f49f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/tax-dashboard.tsx:335"}, "properties": {"repobilityId": "585e449052047ff2", "scanner": "scanner-primary", "fingerprint": "c816b52c8099f49f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8223ee8ff74b95cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/intake-requests.tsx:360"}, "properties": {"repobilityId": "4cf58d4f62dedbc7", "scanner": "scanner-primary", "fingerprint": "8223ee8ff74b95cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-47f0d87fe55848d1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/marketplace.tsx:231"}, "properties": {"repobilityId": "e72d29a2075bcd58", "scanner": "scanner-primary", "fingerprint": "47f0d87fe55848d1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7152a017cedff493", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ecommerce-store.tsx:231"}, "properties": {"repobilityId": "c48c27e065091ef2", "scanner": "scanner-primary", "fingerprint": "7152a017cedff493", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e4a8cf9675c756a3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/gantt-timeline.tsx:289"}, "properties": {"repobilityId": "c87f3febc3ed151d", "scanner": "scanner-primary", "fingerprint": "e4a8cf9675c756a3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2174f3b352a76c78", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/pos-system.tsx:240"}, "properties": {"repobilityId": "894d99c5ba255565", "scanner": "scanner-primary", "fingerprint": "2174f3b352a76c78", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9ebbb818ce848432", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-knowledge-base.tsx:212"}, "properties": {"repobilityId": "db9f19e038aed81b", "scanner": "scanner-primary", "fingerprint": "9ebbb818ce848432", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7e270b34362aec1b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-search.tsx:253"}, "properties": {"repobilityId": "f65300f9acca3875", "scanner": "scanner-primary", "fingerprint": "7e270b34362aec1b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e4f689ea0671b262", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/customer-feedback.tsx:209"}, "properties": {"repobilityId": "f40e547b4c4f3c9a", "scanner": "scanner-primary", "fingerprint": "e4f689ea0671b262", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-111ce0021befc6ec", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/team-admin.tsx:179"}, "properties": {"repobilityId": "b6105efc0c502e41", "scanner": "scanner-primary", "fingerprint": "111ce0021befc6ec", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1e6118c4ca5ffad7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/funnel-analytics.tsx:278"}, "properties": {"repobilityId": "6b12e1909e106fa0", "scanner": "scanner-primary", "fingerprint": "1e6118c4ca5ffad7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9cbdcbf6d0d0cd43", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-document-chat.tsx:157"}, "properties": {"repobilityId": "a0f5c04295153c9e", "scanner": "scanner-primary", "fingerprint": "9cbdcbf6d0d0cd43", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-df6787e844ff6281", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/issue-tracker.tsx:218"}, "properties": {"repobilityId": "f2b6605ab29d39f8", "scanner": "scanner-primary", "fingerprint": "df6787e844ff6281", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-054b4afad945a398", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/real-estate.tsx:354"}, "properties": {"repobilityId": "dc2dce38cb52c0e5", "scanner": "scanner-primary", "fingerprint": "054b4afad945a398", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-04ce6230640d45a1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/hr-platform.tsx:158"}, "properties": {"repobilityId": "0b23eddd54038f74", "scanner": "scanner-primary", "fingerprint": "04ce6230640d45a1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-27f704b85d0688fa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/seo-analytics.tsx:395"}, "properties": {"repobilityId": "f57f531c857f7cfc", "scanner": "scanner-primary", "fingerprint": "27f704b85d0688fa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-468c16979b92e529", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/asset-manager.tsx:284"}, "properties": {"repobilityId": "57e0c3c9dbc66367", "scanner": "scanner-primary", "fingerprint": "468c16979b92e529", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-13c8fb20d0cc145b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-writer.tsx:186"}, "properties": {"repobilityId": "b70910c950af2ba9", "scanner": "scanner-primary", "fingerprint": "13c8fb20d0cc145b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2b5d15413f1a51a3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/store-admin.tsx:387"}, "properties": {"repobilityId": "9e5382bb6c166ab8", "scanner": "scanner-primary", "fingerprint": "2b5d15413f1a51a3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7beb13f9e7821565", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/account-management.tsx:305"}, "properties": {"repobilityId": "394ef3b464afc740", "scanner": "scanner-primary", "fingerprint": "7beb13f9e7821565", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-113a6f3478477ebf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/social-listening.tsx:227"}, "properties": {"repobilityId": "6c377e46592c654c", "scanner": "scanner-primary", "fingerprint": "113a6f3478477ebf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d24f7896d6ac4b3e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/investments-portfolio.tsx:230"}, "properties": {"repobilityId": "bc3b9bf6eb1dd472", "scanner": "scanner-primary", "fingerprint": "d24f7896d6ac4b3e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-573c00965c7019ae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/food-blog.tsx:355"}, "properties": {"repobilityId": "fc1841a61ec99d62", "scanner": "scanner-primary", "fingerprint": "573c00965c7019ae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d493287846d86eb0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/indie-hacker.tsx:171"}, "properties": {"repobilityId": "4c82a452f412c409", "scanner": "scanner-primary", "fingerprint": "d493287846d86eb0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a921f7dac579da0b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/customer-segments.tsx:142"}, "properties": {"repobilityId": "fc221725040e4894", "scanner": "scanner-primary", "fingerprint": "a921f7dac579da0b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c4ad88e254d00aa1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/integration-detail.tsx:451"}, "properties": {"repobilityId": "40a0d525c6b561af", "scanner": "scanner-primary", "fingerprint": "c4ad88e254d00aa1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3311693ee5f02943", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/form-builder.tsx:234"}, "properties": {"repobilityId": "df7d44fe4fbdaece", "scanner": "scanner-primary", "fingerprint": "3311693ee5f02943", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fc8911f90bb8b169", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/resource-planner.tsx:206"}, "properties": {"repobilityId": "63daaf295c0fcf2d", "scanner": "scanner-primary", "fingerprint": "fc8911f90bb8b169", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-71d96d2b179f8a1c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/payments-dashboard.tsx:416"}, "properties": {"repobilityId": "fb05c16b463e8971", "scanner": "scanner-primary", "fingerprint": "71d96d2b179f8a1c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7fc89f11e298dde4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/invoicing-app.tsx:176"}, "properties": {"repobilityId": "06d95a4f6b04136e", "scanner": "scanner-primary", "fingerprint": "7fc89f11e298dde4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4de24445ee873069", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/email-client.tsx:317"}, "properties": {"repobilityId": "e2fbad0a33f1abe3", "scanner": "scanner-primary", "fingerprint": "4de24445ee873069", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-57e1ace692816e17", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/interview-series.tsx:316"}, "properties": {"repobilityId": "c685e0474f7c6fe7", "scanner": "scanner-primary", "fingerprint": "57e1ace692816e17", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-339e9c41d93cda1b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/sales-analytics.tsx:277"}, "properties": {"repobilityId": "cbd8b049de2cc748", "scanner": "scanner-primary", "fingerprint": "339e9c41d93cda1b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b9d0a7333646c0af", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/video-call-app.tsx:78"}, "properties": {"repobilityId": "328f56042bf4feee", "scanner": "scanner-primary", "fingerprint": "b9d0a7333646c0af", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ea252687ba46adec", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/customers-page.tsx:349"}, "properties": {"repobilityId": "aec3f78ac87a15da", "scanner": "scanner-primary", "fingerprint": "ea252687ba46adec", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7a11e67bf698dd06", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-data-labeling.tsx:194"}, "properties": {"repobilityId": "5721c79773e00101", "scanner": "scanner-primary", "fingerprint": "7a11e67bf698dd06", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bc141eecbb6e86a1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/musician-portfolio.tsx:165"}, "properties": {"repobilityId": "00f3873154d129c7", "scanner": "scanner-primary", "fingerprint": "bc141eecbb6e86a1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3dd7b8ec6ae4c3c5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/cooking-class.tsx:283"}, "properties": {"repobilityId": "6773e78bf433c1f6", "scanner": "scanner-primary", "fingerprint": "3dd7b8ec6ae4c3c5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1483eda7e6d4571f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/quotes-builder.tsx:183"}, "properties": {"repobilityId": "aff5eff4887ffab2", "scanner": "scanner-primary", "fingerprint": "1483eda7e6d4571f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3fe49c6f92e1ccdb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/podcast-site.tsx:263"}, "properties": {"repobilityId": "052c256c829c90c5", "scanner": "scanner-primary", "fingerprint": "3fe49c6f92e1ccdb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-586784da9a978619", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/kanban-app.tsx:340"}, "properties": {"repobilityId": "ccc8fa61aea8fe42", "scanner": "scanner-primary", "fingerprint": "586784da9a978619", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4a4509693314485a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/waitlist-page.tsx:173"}, "properties": {"repobilityId": "cc4b1ae8f48e07e3", "scanner": "scanner-primary", "fingerprint": "4a4509693314485a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a18ffd68b42557d3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/product-hunt-launch.tsx:294"}, "properties": {"repobilityId": "aa4da66c20efa70f", "scanner": "scanner-primary", "fingerprint": "a18ffd68b42557d3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9b8de0f6bafbe965", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/team-wiki.tsx:296"}, "properties": {"repobilityId": "fbd72bab29fb0719", "scanner": "scanner-primary", "fingerprint": "9b8de0f6bafbe965", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7526a42de95f6eab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/demo-request.tsx:161"}, "properties": {"repobilityId": "2baccbd78098f6aa", "scanner": "scanner-primary", "fingerprint": "7526a42de95f6eab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-30288d2f759ba17f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/ai-chat.tsx:196"}, "properties": {"repobilityId": "6a4eb35c6ad2d59a", "scanner": "scanner-primary", "fingerprint": "30288d2f759ba17f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-90c166e90d2c8a75", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/bug-triage.tsx:403"}, "properties": {"repobilityId": "c5442b69617255c9", "scanner": "scanner-primary", "fingerprint": "90c166e90d2c8a75", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fb60a28597ea6aff", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/docs/templates/workflow-automation.tsx:247"}, "properties": {"repobilityId": "bb423929d9f0a8ba", "scanner": "scanner-primary", "fingerprint": "fb60a28597ea6aff", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d78c6d18ee571b67", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/cli/src/commands/diff.ts:60"}, "properties": {"repobilityId": "a76e07cc13e4bf53", "scanner": "scanner-primary", "fingerprint": "d78c6d18ee571b67", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6f821dc393ca849a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/cli/src/utils/logger.ts:4"}, "properties": {"repobilityId": "5ef0b50f7b6883cf", "scanner": "scanner-primary", "fingerprint": "6f821dc393ca849a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fd4110311ea0d510", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/docs/app/layout.tsx:40"}, "properties": {"repobilityId": "a1d61b18af68d42c", "scanner": "scanner-primary", "fingerprint": "fd4110311ea0d510", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/docs/app/layout.tsx"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-80714f7acebff894", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in packages/cli/src/utils/packages.ts:3"}, "properties": {"repobilityId": "7868f44a23778335", "scanner": "scanner-primary", "fingerprint": "80714f7acebff894", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/cli/src/utils/packages.ts"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-3ac82ff909f84703", "level": "note", "message": {"text": "Very large file: apps/docs/lib/templates.ts (3601 lines)"}, "properties": {"repobilityId": "0b28ac052cd8daef", "scanner": "scanner-primary", "fingerprint": "3ac82ff909f84703", "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-c69f0b4f79af852d", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/docs/package.json"}, "properties": {"repobilityId": "aef63841a7a897be", "scanner": "scanner-primary", "fingerprint": "c69f0b4f79af852d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/docs/package.json"}, "region": {"startLine": 1}}}]}, {"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": "29d927bceee06508", "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": "82a561b46207c639", "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": "c4472c4231412b7d", "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": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "9a368ddf02c8a7a1", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "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": "7fe34a8dc5d2544c", "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": "befdc73ac24b247c", "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": "153ff2f69a94e7b0", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-43bd202c9c581c92", "level": "error", "message": {"text": "Dangling fetch: GET /api/version (apps/docs/components/site/update-notifier.tsx:24)"}, "properties": {"repobilityId": "b46e999034e41f7e", "scanner": "scanner-primary", "fingerprint": "43bd202c9c581c92", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-41aa9e92da3f14ad", "level": "note", "message": {"text": "Unused endpoint: GET /users/:id"}, "properties": {"repobilityId": "144663cf2e77d05d", "scanner": "scanner-primary", "fingerprint": "41aa9e92da3f14ad", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8606ccc1e9d67e9a", "level": "note", "message": {"text": "Unused endpoint: GET /hello"}, "properties": {"repobilityId": "54cf386feacbf610", "scanner": "scanner-primary", "fingerprint": "8606ccc1e9d67e9a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}