{"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-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7eaf54602aa3e45b", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/backfill-walkin-stub-users.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/backfill-walkin-stub-users.ts:40"}, "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-cfcb72bde5ce8690", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-program.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-program.ts:28"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7d1342cc7ade8776", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/seed-brand-settings.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/seed-brand-settings.ts:40"}, "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-bafa3ae6597acece", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-passport.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-passport.ts:24"}, "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-7c2d0be588e115f5", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/phase3-preflight-assert.ts:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/phase3-preflight-assert.ts:42"}, "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-a1add9a7e8c6f409", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/fix-merch-stripe-display-names.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/fix-merch-stripe-display-names.ts:48"}, "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-162456ed8580e5d5", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-school-ops-extended.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-school-ops-extended.ts:37"}, "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-cede9b5b21a1d369", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/phase3b-user-carry-data.ts:329", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/phase3b-user-carry-data.ts:329"}, "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-04b9aff7548e390d", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-attendance.ts:43", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-attendance.ts:43"}, "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-55a45a5c87197e27", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/send-resend-production-test.tsx:81", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/send-resend-production-test.tsx:81"}, "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-a0ed428cedda5407", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/setup-stripe-products.ts:305", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/setup-stripe-products.ts:305"}, "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-c51225b788bb29fc", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/backfill-slugs.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/backfill-slugs.ts:28"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-def5fa609c635734", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/setup-merch-stripe-products.ts:94", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/setup-merch-stripe-products.ts:94"}, "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-9b6eabbb0d376e6a", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-schedule.ts:59", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-schedule.ts:59"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aad44c2d54d39b70", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/audit-payment-entitlements.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/audit-payment-entitlements.ts:10"}, "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-ce0873767d3b3da9", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-org.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-org.ts:27"}, "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-135d1e9b3ea47af7", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-entitlements.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-entitlements.ts:12"}, "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-14264a3a60fa60a9", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/setup-ronin-stripe-products.ts:741", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/setup-ronin-stripe-products.ts:741"}, "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-558bb2a222d78f60", "name": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-lead-lifecycle.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-lead-lifecycle.ts:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-001679e7309322db", "name": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-baseline-lineage.ts:600", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-baseline-lineage.ts:600"}, "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-518f52d370178218", "name": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-baseline-listings.ts:555", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-baseline-listings.ts:555"}, "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-ade8be745b3c776c", "name": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-tuffbuffs-merch.ts:494", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-tuffbuffs-merch.ts:494"}, "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-a6e982fa4b11e6c6", "name": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-baseline-launch.ts:103", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-baseline-launch.ts:103"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-33efa7889ae831f0", "name": "TODO/FIXME marker in shipping code \u2014 apps/web/prisma/seed.ts:1158", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/prisma/seed.ts:1158"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f446a91479852e99", "name": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed.ts:25"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-89dc3dea16391afe", "name": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-baseline-programs.ts:540", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-baseline-programs.ts:540"}, "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-391d79dd08133393", "name": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-content-atom-proof.ts:220", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-content-atom-proof.ts:220"}, "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-a5cf23a82cd43242", "name": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-bbl-org.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-bbl-org.ts:38"}, "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-f84e0dd763c2e807", "name": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-baseline-platform.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-baseline-platform.ts:41"}, "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-14ffd7dd5a99843a", "name": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-gear-recommendations.ts:213", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-gear-recommendations.ts:213"}, "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-46be328718d26103", "name": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-tuffbuffs-affiliate.ts:428", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-tuffbuffs-affiliate.ts:428"}, "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-510c286c14f9afc2", "name": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-gear-recommendations-remaining.ts:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-gear-recommendations-remaining.ts:89"}, "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-25b69ae1179c2c53", "name": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-pricing-plans.ts:384", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-pricing-plans.ts:384"}, "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-04c5aa26232cc306", "name": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-age-groups-skill-levels.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-age-groups-skill-levels.ts:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-33d0e00dd3f20807", "name": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-baseline-owner.ts:71", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-baseline-owner.ts:71"}, "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-6ff75693fba2f43c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/common/search.tsx:220", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/common/search.tsx:220"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-97635689f12809b5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/admin/tournaments/registrations-table-columns.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/admin/tournaments/registrations-table-columns.tsx:97"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-38d060f91e851d35", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/inline-menu.tsx:50", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/inline-menu.tsx:50"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-92b2989a35e3f6fb", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/user-menu.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/user-menu.tsx:80"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f73c998efda0780a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/bottom.tsx:43", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/bottom.tsx:43"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-61ef024de937e9c9", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/components/web/structured-data.tsx:5", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/components/web/structured-data.tsx:5"}, "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-9969a4667a312c7b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/schools/school-card.tsx:36", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/schools/school-card.tsx:36"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-05e0a03b45ee5ded", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/directory/facet-result-card.tsx:32", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/directory/facet-result-card.tsx:32"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1365d83aa921d716", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/ui/logo.tsx:35", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/ui/logo.tsx:35"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-135de63c34d03c58", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/ui/tile.tsx:33", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/ui/tile.tsx:33"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-335e24cd00e1306b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/ui/author.tsx:28", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/ui/author.tsx:28"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5e4386945ba6d680", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/ads/ad-card.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/ads/ad-card.tsx:65"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9a73cb92bbd19daa", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/nav/nav-sheet.tsx:101", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/nav/nav-sheet.tsx:101"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c8077d5c7f10afe5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/lineage-profile-drawer.tsx:363", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/lineage-profile-drawer.tsx:363"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0ad42afe5abaccc3", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/lineage-compact-child-list.tsx:245", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/lineage-compact-child-list.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-e7a4267bbf32591f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/lineage-rank-progression-panel.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/lineage-rank-progression-panel.tsx:97"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df0cd7a2f24f5904", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/lineage-node-card.tsx:140", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/lineage-node-card.tsx:140"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9f1023cc48df7fe8", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/lineage-mobile-list.tsx:132", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/lineage-mobile-list.tsx:132"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3f962e24fa5f8bc4", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/students-carousel.tsx:77", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/students-carousel.tsx:77"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-894e38806a2a10dd", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/lineage-honor-strip.tsx:126", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/lineage-honor-strip.tsx:126"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a1dc14d57981da25", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/techniques/technique-card.tsx:41", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/techniques/technique-card.tsx:41"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-248a738dcae5529d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/tools/tool-entry.tsx:43", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/tools/tool-entry.tsx:43"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-50aecb0e10721e43", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/tools/tool-card.tsx:28", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/tools/tool-card.tsx:28"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c658a0e9e955fcb3", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/profile/profile-hero.tsx:53", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/profile/profile-hero.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-220baf19d39110b1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/courses/course-card.tsx:39", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/courses/course-card.tsx:39"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-99255411be3f24f5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/products/product.tsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/products/product.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-b74c324ce4d7ed12", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/data-table/data-table-view-options.tsx:61", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/data-table/data-table-view-options.tsx:61"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c70e83aa401516dc", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/layout.tsx:69", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/layout.tsx:69"}, "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-df1a969043e42b18", "name": "Stray `console.log` in TS/JS \u2014 apps/web/app/api/stripe/webhooks/route.ts:461", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/app/api/stripe/webhooks/route.ts:461"}, "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-aa5c5eeb44f17ed9", "name": "Stray `console.log` in TS/JS \u2014 apps/web/app/api/printful/webhooks/route.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/app/api/printful/webhooks/route.ts:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a37d972464034d6e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/posts/_components/post-form.tsx:103", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/posts/_components/post-form.tsx:103"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d484bd22da692d42", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/skill-levels/_components/skill-levels-table-column", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/skill-levels/_components/skill-levels-table-columns.tsx:60"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3689e2466bab83e4", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/skill-levels/_components/skill-level-form.tsx:67", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/skill-levels/_components/skill-level-form.tsx:67"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-138dd85b214494df", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/email/_components/bbl-email-catalog-panel.tsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/email/_components/bbl-email-catalog-panel.tsx:87"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2d5484611ddacfa7", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/entitlements/_components/entitlements-table-column", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/entitlements/_components/entitlements-table-columns.tsx:67"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bddf4da3a2c3c180", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/entitlements/_components/entitlement-form.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/entitlements/_components/entitlement-form.tsx:80"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1382c9248933b9f3", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/leads/_components/leads-table-columns.tsx:70", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/leads/_components/leads-table-columns.tsx:70"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a4565d668cd5f597", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/leads/_components/lead-form.tsx:77", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/leads/_components/lead-form.tsx:77"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e8a9b5a428183312", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/media/page.tsx:70", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/media/page.tsx:70"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8a2caa1708359cde", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/claims/page.tsx:32", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/claims/page.tsx:32"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-965ff0da56a927e0", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/subscription-tiers/_components/subscription-tiers-", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/subscription-tiers/_components/subscription-tiers-table-columns.tsx:82"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e992e6eab18cd24a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/subscription-tiers/_components/subscription-tier-f", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/subscription-tiers/_components/subscription-tier-form.tsx:87"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fa4316d971578858", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/pricing-plans/_components/pricing-plan-form.tsx:13", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/pricing-plans/_components/pricing-plan-form.tsx:133"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e2e97a16b2516a99", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/pricing-plans/_components/pricing-plans-table-colu", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/pricing-plans/_components/pricing-plans-table-columns.tsx:77"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-675c6d778dea9219", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/lineage/page.tsx:83", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/lineage/page.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-261e42efdd6fec5f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/lineage/[treeId]/page.tsx:157", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/lineage/[treeId]/page.tsx:157"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2a3b4b43041c3049", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/lineage/claims/page.tsx:35", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/lineage/claims/page.tsx:35"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1f448a1a1c550bd3", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/billing/monitoring/page.tsx:49", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/billing/monitoring/page.tsx:49"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a6c90a7d07901db8", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/roles/_components/role-form.tsx:61", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/roles/_components/role-form.tsx:61"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-02e5c337178d51b2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/categories/_components/categories-table-columns.ts", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/categories/_components/categories-table-columns.tsx:55"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-212a42ac0295e660", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/categories/_components/category-form.tsx:97", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/categories/_components/category-form.tsx:97"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fa809680654564a8", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/content/_components/content-atom-form.tsx:115", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/content/_components/content-atom-form.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-b0129b3e6e18ab9d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/content/_components/content-media-panel.tsx:88", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/content/_components/content-media-panel.tsx:88"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c93a74162ce2978e", "name": "TODO/FIXME marker in shipping code \u2014 apps/web/app/app/tools/_components/tool-actions.tsx:44", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/app/app/tools/_components/tool-actions.tsx:44"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-37e54c430ff227a2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/tools/_components/tool-form.tsx:200", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/tools/_components/tool-form.tsx:200"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-220f780d9006ed82", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/tools/_components/tools-table-columns.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/tools/_components/tools-table-columns.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-c1fd4ed7770ed9a4", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/reports/_components/report-form.tsx:66", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/reports/_components/report-form.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-b84115060d48e05e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/reports/_components/reports-table-columns.tsx:61", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/reports/_components/reports-table-columns.tsx:61"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e3d8e6b028da111c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/merch/orders/_components/orders-table-columns.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/merch/orders/_components/orders-table-columns.tsx:69"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0c9e6953aba95170", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/age-groups/_components/age-group-form.tsx:67", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/age-groups/_components/age-group-form.tsx:67"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b1314e5ec22ce425", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/privacy/requests/page.tsx:55", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/privacy/requests/page.tsx:55"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c550c72a9e29dc03", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/subscriptions/_components/subscription-form.tsx:82", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/subscriptions/_components/subscription-form.tsx:82"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-50438d1fdc459d13", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/tags/_components/tag-form.tsx:75", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/tags/_components/tag-form.tsx:75"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3593fdfa00da95c8", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/invites/_components/invite-form.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/invites/_components/invite-form.tsx:80"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bdf4ad5aacb3e6e5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/blog/[slug]/page.tsx:126", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/blog/[slug]/page.tsx:126"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1b9e98a286d7d5cf", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/schools/[slug]/page.tsx:376", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/schools/[slug]/page.tsx:376"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-579331401461f7f9", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/posts/[slug]/page.tsx:152", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/posts/[slug]/page.tsx:152"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-42cdbd8331c0f967", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/lineage/join/lineage-membership-checkout.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/lineage/join/lineage-membership-checkout.tsx:71"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-96f198c0bc82eb93", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/disciplines/_components/member-carousel-by-rank.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/disciplines/_components/member-carousel-by-rank.tsx:35"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-003b39cef6d07d19", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/disciplines/_components/video-carousel.tsx:42", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/disciplines/_components/video-carousel.tsx:42"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cab9a730f4978dac", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/disciplines/_components/discipline-card.tsx:52", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/disciplines/_components/discipline-card.tsx:52"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bf951e25f59dc143", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/disciplines/[slug]/page.tsx:284", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/disciplines/[slug]/page.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-7f44380fd0d99577", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/programs/page.tsx:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/programs/page.tsx:107"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e09927e1054fe8f9", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/programs/[id]/page.tsx:225", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/programs/[id]/page.tsx:225"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fa074a6e8659c540", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/programs/[id]/schedules/page.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/programs/[id]/schedules/page.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-820a6b979b32dce8", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/(home)/bbl/bbl-landing.tsx:265", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/(home)/bbl/bbl-landing.tsx:265"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8632bf4781bc86e5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/organizations/page.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/organizations/page.tsx:112"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-898224b3c553293c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/organizations/[slug]/page.tsx:366", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/organizations/[slug]/page.tsx:366"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f219278501dcfe96", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/(web)/organizations/[slug]/layout.tsx:37", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/(web)/organizations/[slug]/layout.tsx:37"}, "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-40280c429bbb0d43", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/me/passport-editor.tsx:470", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/me/passport-editor.tsx:470"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ee45cb14122c2438", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/[slug]/page.tsx:102", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/[slug]/page.tsx:102"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6d8a14b61d98925b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/users/_components/user-form.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/users/_components/user-form.tsx:68"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ac2c53b237964b45", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/users/_components/person-form.tsx:115", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/users/_components/person-form.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-953f37d4b2cb77a2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/claims/page.tsx:33", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/claims/page.tsx:33"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7fee89621dc017be", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/subscription-tiers/_components/subscription-tier", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/subscription-tiers/_components/subscription-tiers-table-columns.tsx:82"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d5d59429a652a68e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/subscription-tiers/_components/subscription-tier", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/subscription-tiers/_components/subscription-tier-form.tsx:87"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6cd8c4bb1e079834", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/pricing-plans/_components/pricing-plan-form.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/pricing-plans/_components/pricing-plan-form.tsx:133"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-45075c180dc63489", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/pricing-plans/_components/pricing-plans-table-co", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/pricing-plans/_components/pricing-plans-table-columns.tsx:77"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3ad905cf31834d22", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/lineage/page.tsx:83", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/lineage/page.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-42617a2976b2769e", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/lineage/[treeId]/page.tsx:155", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/lineage/[treeId]/page.tsx:155"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8e65e0c2b6550971", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/lineage/claims/page.tsx:35", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/lineage/claims/page.tsx:35"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a8531431cfed8551", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/lineage/_components/lineage-selected-rank-select", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/lineage/_components/lineage-selected-rank-select.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-1f616a1e1784cd35", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tournaments/roles/_components/tournament-role-fo", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tournaments/roles/_components/tournament-role-form.tsx:87"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f0bf6a79d8963bc5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tournaments/rule-sets/_components/rule-set-form.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tournaments/rule-sets/_components/rule-set-form.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-d29ca79845d80164", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tournaments/_components/score-forms.tsx:133", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tournaments/_components/score-forms.tsx:133"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5fde3d129216e1a2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tournaments/_components/staff-panel.tsx:132", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tournaments/_components/staff-panel.tsx:132"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9c003f0b61a9d999", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tournaments/_components/bracket-viewer.tsx:341", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tournaments/_components/bracket-viewer.tsx:341"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-177103673c5444b6", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/billing/monitoring/page.tsx:50", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/billing/monitoring/page.tsx:50"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3d13f30d6610aad4", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/categories/_components/categories-table-columns.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/categories/_components/categories-table-columns.tsx:55"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c91f1078550565b2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/categories/_components/category-form.tsx:97", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/categories/_components/category-form.tsx:97"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-89818b387dbbca02", "name": "TODO/FIXME marker in shipping code \u2014 apps/web/app/admin/tools/_components/tool-actions.tsx:44", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/app/admin/tools/_components/tool-actions.tsx:44"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-86d9d47bd8f02f25", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tools/_components/tool-form.tsx:200", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tools/_components/tool-form.tsx:200"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0ec190586a8d1840", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tools/_components/tools-table-columns.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tools/_components/tools-table-columns.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-eedc218c43830d72", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/memberships/_components/memberships-table-column", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/memberships/_components/memberships-table-columns.tsx:91"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-21a7d8e680ec1345", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/merch/orders/_components/orders-table-columns.ts", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/merch/orders/_components/orders-table-columns.tsx:69"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4fd068bb95369f98", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/subscriptions/_components/subscription-form.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/subscriptions/_components/subscription-form.tsx:82"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e3e8c6d3918535d3", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tags/_components/tag-form.tsx:75", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tags/_components/tag-form.tsx:75"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8acbdc5e0b76f2a8", "name": "Stray `console.log` in TS/JS \u2014 apps/web/lib/email.ts:126", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/lib/email.ts:126"}, "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-e3354c95bb5f2e12", "name": "TODO/FIXME marker in shipping code \u2014 apps/web/lib/i18n.ts:28", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/lib/i18n.ts:28"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0fc9f56c180dcd99", "name": "TODO/FIXME marker in shipping code \u2014 apps/web/lib/lineage/family-chart/types/form.ts:11", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/lib/lineage/family-chart/types/form.ts:11"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fa4197cab458f946", "name": "TODO/FIXME marker in shipping code \u2014 apps/web/lib/lineage/family-chart/renderers/card-svg/card-svg.ts:10", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/lib/lineage/family-chart/renderers/card-svg/card-svg.ts:10"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bbd87abc9e00573a", "name": "TODO/FIXME marker in shipping code \u2014 apps/web/lib/lineage/family-chart/core/edit.ts:267", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/lib/lineage/family-chart/core/edit.ts:267"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3de917128aa21ee6", "name": "Stray `console.log` in TS/JS \u2014 apps/web/lib/lineage/family-chart/core/edit.ts:220", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/lib/lineage/family-chart/core/edit.ts:220"}, "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-9913c8c051862205", "name": "TODO/FIXME marker in shipping code \u2014 apps/web/lib/lineage/family-chart/handlers/general.ts:15", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/lib/lineage/family-chart/handlers/general.ts:15"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c242ab13b8d44f6e", "name": "Stray `console.log` in TS/JS \u2014 apps/web/lib/lineage/family-chart/handlers/view-handlers.ts:106", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/lib/lineage/family-chart/handlers/view-handlers.ts:106"}, "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-2383bde325f26079", "name": "Stray `console.log` in TS/JS \u2014 apps/web/hooks/use-track-event.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/hooks/use-track-event.ts:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ad1f435d6f8bddd3", "name": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/directory/search-organizations.ts:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/directory/search-organizations.ts:62"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-62561bbee712d9db", "name": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/directory/search-profiles.ts:71", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/directory/search-profiles.ts:71"}, "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-3310ec025e721f32", "name": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/techniques/queries.ts:58", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/techniques/queries.ts:58"}, "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-914cc32dd4f25432", "name": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/tools/queries.ts:68", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/tools/queries.ts:68"}, "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-1faa945c6f99dc90", "name": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/actions/search.ts:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/actions/search.ts:42"}, "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-c739de34d20b1e8f", "name": "TODO/FIXME marker in shipping code \u2014 apps/web/server/web/merch/printful-actions.ts:12", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/server/web/merch/printful-actions.ts:12"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-542478cf42ef9aad", "name": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/merch/printful-actions.ts:292", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/merch/printful-actions.ts:292"}, "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-52934fa0f516a1ab", "name": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/tags/queries.ts:56", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/tags/queries.ts:56"}, "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-3f8c5e34aacbfdf6", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-vercel-env-parity.ts:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-vercel-env-parity.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-d436dfaeba0b3ada", "name": "Stray `console.log` in TS/JS \u2014 scripts/capture-balkan-orgchart.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/capture-balkan-orgchart.ts:40"}, "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-8ed47bdb5ce1f772", "name": "Stray `console.log` in TS/JS \u2014 scripts/fix-architecture-markdownlint.ts:271", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-architecture-markdownlint.ts:271"}, "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-974b3e590dd18fb7", "name": "Stray `console.log` in TS/JS \u2014 scripts/wiki-lint.ts:537", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/wiki-lint.ts:537"}, "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-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b09b64466ddbe3df", "name": "Insecure pattern 'dangerous_innerhtml' in apps/web/components/web/structured-data.tsx:5", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/components/web/structured-data.tsx:5"}, "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-8129207e4832cf68", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/components/web/lineage/lineage-view-a-island.tsx:347", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/components/web/lineage/lineage-view-a-island.tsx:347"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bbbccfdde202f7e9", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/components/web/lineage/lineage-family-chart-smoke.tsx:47", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/components/web/lineage/lineage-family-chart-smoke.tsx:47"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-85bdebaae873109c", "name": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/layout.tsx:69", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/layout.tsx:69"}, "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-559d38675701c8e9", "name": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/(web)/organizations/[slug]/layout.tsx:37", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/(web)/organizations/[slug]/layout.tsx:37"}, "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-bc5f2f13f4c620bd", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/renderers/svg.ts:26", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/renderers/svg.ts:26"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fa53616ef3f17719", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/renderers/card-html.ts:39", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/renderers/card-html.ts:39"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-910e08cc7361e2a5", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/renderers/create-form.ts:23", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/renderers/create-form.ts:23"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27f18acc85f8c634", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/renderers/card-svg/card-svg.ts:44", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/renderers/card-svg/card-svg.ts:44"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-422e95a0e2c35a98", "name": "Insecure pattern 'insert_adjacent_html' in apps/web/lib/lineage/family-chart/renderers/card-svg/defs.ts:5", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in apps/web/lib/lineage/family-chart/renderers/card-svg/defs.ts:5"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ec46eb6568cf52d4", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/core/edit.ts:246", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/core/edit.ts:246"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-52affc2538e1c431", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/core/chart.ts:267", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/core/chart.ts:267"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dbfaed9ecd4b1166", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/features/modal.ts:59", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/features/modal.ts:59"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9758c9053c3b7157", "name": "Insecure pattern 'node_child_process' in apps/web/e2e/global-teardown.ts:5", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/web/e2e/global-teardown.ts:5"}, "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-9044a18096863fb3", "name": "Insecure pattern 'node_child_process' in apps/web/e2e/global-setup.ts:6", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/web/e2e/global-setup.ts:6"}, "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-10906bd833331383", "name": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/auth.ts:10", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/auth.ts:10"}, "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-7c9e0c169d392d60", "name": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/seed-lineage-comp-fixture.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/seed-lineage-comp-fixture.ts:1"}, "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-b947672633a5b02f", "name": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/seed-lineage-lifecycle.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/seed-lineage-lifecycle.ts:1"}, "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-8e922218391c9a7e", "name": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/stripe-checkout.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/stripe-checkout.ts:1"}, "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-683fa5adc0b48d6e", "name": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/dsr.ts:7", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/dsr.ts:7"}, "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-65c0b8953636e181", "name": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/seed-lineage-rank-redaction.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/seed-lineage-rank-redaction.ts:1"}, "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-352b86bfd315ef3b", "name": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/seed-lineage.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/seed-lineage.ts:1"}, "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-f38b1cbbe9f2fb60", "name": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/seed-membership.ts:8", "shortDescription": {"text": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/seed-membership.ts:8"}, "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-afe5d4ae6b3185ee", "name": "Insecure pattern 'node_child_process' in scripts/check-vercel-env-parity.ts:14", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/check-vercel-env-parity.ts:14"}, "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-ddee78234647b509", "name": "Insecure pattern 'node_child_process' in scripts/wiki-lint.ts:17", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/wiki-lint.ts:17"}, "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-f8cdfffd70600cb1", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-878357cdc8b567d8", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-81daf9ff25f1a6ec", "name": "Very large file: apps/web/prisma/seed-baseline-lineage.ts (1841 lines)", "shortDescription": {"text": "Very large file: apps/web/prisma/seed-baseline-lineage.ts (1841 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-d1366563d2214170", "name": "Very large file: apps/web/prisma/seed.ts (2053 lines)", "shortDescription": {"text": "Very large file: apps/web/prisma/seed.ts (2053 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-910d36d9bd0aa305", "name": "Very large file: apps/web/components/web/lineage/lineage-tree-canvas.tsx (1502 lines)", "shortDescription": {"text": "Very large file: apps/web/components/web/lineage/lineage-tree-canvas.tsx (1502 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": "107 test file(s) for 1346 source file(s) (ratio 0.08). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4a9eb7dc7c6e3880", "name": "Node manifest has dependencies but no lockfile: apps/web/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/web/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-892d4f964c9036e2", "name": "Node manifest has dependencies but no lockfile: packages/api-client/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/api-client/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 427 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 556 placeholder/mock markers across 183 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-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-40f058715e993ae0", "name": "Agent authority lacks a verifier contract: .claude/skills/bow-out/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/bow-out/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b64845e4a6d25bd7", "name": "Commented-code block (5 lines) in apps/web/playwright.config.ts:22", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/playwright.config.ts:22"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-48f01fae7da4a477", "name": "Commented-code block (6 lines) in apps/web/next.config.ts:49", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/next.config.ts:49"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3386525727932444", "name": "Commented-code block (5 lines) in apps/web/scripts/smoke-schedule.ts:333", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/scripts/smoke-schedule.ts:333"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3e7e34ebe404324f", "name": "Commented-code block (6 lines) in apps/web/prisma/seed-baseline-lineage.ts:396", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/prisma/seed-baseline-lineage.ts:396"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-11efb7a22f7331d6", "name": "Commented-code block (8 lines) in apps/web/prisma/seed-baseline-launch.ts:137", "shortDescription": {"text": "Commented-code block (8 lines) in apps/web/prisma/seed-baseline-launch.ts:137"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7780b76f312e5b7c", "name": "Commented-code block (7 lines) in apps/web/prisma/seed.ts:527", "shortDescription": {"text": "Commented-code block (7 lines) in apps/web/prisma/seed.ts:527"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-afb5c61adfdaea0c", "name": "Commented-code block (5 lines) in apps/web/prisma/seed-baseline-owner.ts:246", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/prisma/seed-baseline-owner.ts:246"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-31562c011f6f1afd", "name": "Commented-code block (5 lines) in apps/web/components/common/drawer.tsx:137", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/components/common/drawer.tsx:137"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4578c23417730c07", "name": "Commented-code block (5 lines) in apps/web/components/app/sidebar.tsx:122", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/components/app/sidebar.tsx:122"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a3529e154cf49d74", "name": "Commented-code block (6 lines) in apps/web/components/web/user-menu.tsx:29", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/components/web/user-menu.tsx:29"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a02c4f4bf11a463f", "name": "Commented-code block (5 lines) in apps/web/components/web/lineage/lineage-tree-canvas.tsx:170", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/components/web/lineage/lineage-tree-canvas.tsx:170"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6f256ca6254317cc", "name": "Commented-code block (5 lines) in apps/web/components/web/tools/tool-filters.tsx:12", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/components/web/tools/tool-filters.tsx:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bf2da0de2f3989d6", "name": "Legacy-named symbol `cs_test_unused` in apps/web/app/api/stripe/webhooks/route.test.ts:75", "shortDescription": {"text": "Legacy-named symbol `cs_test_unused` in apps/web/app/api/stripe/webhooks/route.test.ts:75"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f8edbaa0c1826d79", "name": "Commented-code block (5 lines) in apps/web/app/api/stripe/webhooks/route.test.ts:46", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/app/api/stripe/webhooks/route.test.ts:46"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-092d236a8c26fda9", "name": "Commented-code block (10 lines) in apps/web/app/api/printful/webhooks/route.ts:44", "shortDescription": {"text": "Commented-code block (10 lines) in apps/web/app/api/printful/webhooks/route.ts:44"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e98a83313b25043e", "name": "Commented-code block (6 lines) in apps/web/app/(web)/lineage/[treeSlug]/page.tsx:84", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/app/(web)/lineage/[treeSlug]/page.tsx:84"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d440fd3e076d144c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/app/(web)/courses/page.tsx:65", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/app/(web)/courses/page.tsx:65"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-12455317a8def9a5", "name": "Legacy-named symbol `EmailAdminBblJoinLegacy` in apps/web/lib/notifications.ts:10", "shortDescription": {"text": "Legacy-named symbol `EmailAdminBblJoinLegacy` in apps/web/lib/notifications.ts:10"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-70e0be53f7b417fb", "name": "Commented-code block (6 lines) in apps/web/lib/notifications.ts:352", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/lib/notifications.ts:352"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-59b908d4df535950", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/lib/fonts.ts:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/lib/fonts.ts:13"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-96efe0b0bc4b0638", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/lib/orpc-client.ts:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/lib/orpc-client.ts:15"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2eed4571f4b37f3a", "name": "Commented-code block (5 lines) in apps/web/lib/directory/facet-result.ts:50", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/lib/directory/facet-result.ts:50"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-69b3b39d269d685c", "name": "Legacy-named symbol `htmlHandlersWithDeprecated` in apps/web/lib/lineage/family-chart/exports.ts:40", "shortDescription": {"text": "Legacy-named symbol `htmlHandlersWithDeprecated` in apps/web/lib/lineage/family-chart/exports.ts:40"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a968c396f05a48c8", "name": "Legacy-named symbol `EmailAdminBblJoinLegacy` in apps/web/emails/admin-bbl-join-legacy.tsx:19", "shortDescription": {"text": "Legacy-named symbol `EmailAdminBblJoinLegacy` in apps/web/emails/admin-bbl-join-legacy.tsx:19"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-33035d00209c6d0e", "name": "Legacy-named symbol `EmailAdminBblJoinLegacy` in apps/web/server/admin/email/catalog.tsx:4", "shortDescription": {"text": "Legacy-named symbol `EmailAdminBblJoinLegacy` in apps/web/server/admin/email/catalog.tsx:4"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f9043600fe13135", "name": "Commented-code block (6 lines) in apps/web/server/admin/lineage/claim-review-actions.ts:135", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/server/admin/lineage/claim-review-actions.ts:135"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a11f1735e7c90b1d", "name": "Commented-code block (6 lines) in apps/web/server/admin/tournaments/schema.ts:181", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/server/admin/tournaments/schema.ts:181"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1cd769af23fd3654", "name": "Commented-code block (5 lines) in apps/web/server/admin/tournaments/actions.ts:334", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/server/admin/tournaments/actions.ts:334"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-76fbc50d30ce8337", "name": "Commented-code block (8 lines) in apps/web/server/web/schedule/actions.test.ts:214", "shortDescription": {"text": "Commented-code block (8 lines) in apps/web/server/web/schedule/actions.test.ts:214"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-073f949582dbdf59", "name": "Commented-code block (5 lines) in apps/web/server/web/schedule/materialize.concurrency.test.ts:278", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/server/web/schedule/materialize.concurrency.test.ts:278"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-06c354ee94017b8d", "name": "Commented-code block (6 lines) in apps/web/server/web/directory/filter-options.ts:23", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/server/web/directory/filter-options.ts:23"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5d968b451ef7e73e", "name": "Legacy-named symbol `notifyAdminOfBblJoinLegacy` in apps/web/server/web/lead/public-actions.ts:11", "shortDescription": {"text": "Legacy-named symbol `notifyAdminOfBblJoinLegacy` in apps/web/server/web/lead/public-actions.ts:11"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-50ba79390a11d8d5", "name": "Commented-code block (7 lines) in apps/web/server/web/lineage/payloads.ts:28", "shortDescription": {"text": "Commented-code block (7 lines) in apps/web/server/web/lineage/payloads.ts:28"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-05a86f44e229c74e", "name": "Commented-code block (5 lines) in apps/web/server/web/lineage/queries.test.ts:188", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/server/web/lineage/queries.test.ts:188"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8d43718a1f17311c", "name": "Commented-code block (5 lines) in apps/web/server/web/lineage/queries.ts:70", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/server/web/lineage/queries.ts:70"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f1aab2c4c3d43478", "name": "Commented-code block (7 lines) in apps/web/server/web/disciplines/top-ranked-queries.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in apps/web/server/web/disciplines/top-ranked-queries.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cfb02ec9c82dbcb3", "name": "Commented-code block (5 lines) in apps/web/server/web/organization/actions.ts:161", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/server/web/organization/actions.ts:161"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fbdd80b99922ea97", "name": "Commented-code block (5 lines) in apps/web/server/web/merch/printful-actions.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/server/web/merch/printful-actions.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cb62ed9802495a53", "name": "Commented-code block (8 lines) in apps/web/services/printful.ts:3", "shortDescription": {"text": "Commented-code block (8 lines) in apps/web/services/printful.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-44fcb9527b863e1c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/services/printful.ts:8", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/services/printful.ts:8"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a03bec3de07026d1", "name": "Commented-code block (5 lines) in apps/web/e2e/lineage/public-visibility.spec.ts:17", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/e2e/lineage/public-visibility.spec.ts:17"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-16d9fd7ea2a385a7", "name": "Commented-code block (5 lines) in apps/web/e2e/lineage/authenticated-lifecycle.spec.ts:47", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/e2e/lineage/authenticated-lifecycle.spec.ts:47"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-467aee4b7a49a72f", "name": "Commented-code block (5 lines) in apps/web/e2e/lineage/editor-drag-reorder.spec.ts:166", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/e2e/lineage/editor-drag-reorder.spec.ts:166"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fab9a0c2a05aa171", "name": "Commented-code block (6 lines) in apps/web/e2e/lineage/public-rank-redaction.spec.ts:36", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/e2e/lineage/public-rank-redaction.spec.ts:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-01b0fcf8e2bd076c", "name": "Legacy-named symbol `cs_e2e_unused` in apps/web/e2e/helpers/stripe-checkout-db.ts:42", "shortDescription": {"text": "Legacy-named symbol `cs_e2e_unused` in apps/web/e2e/helpers/stripe-checkout-db.ts:42"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa0c8e8d6e627122", "name": "Commented-code block (7 lines) in apps/web/e2e/admin/scoring.spec.ts:22", "shortDescription": {"text": "Commented-code block (7 lines) in apps/web/e2e/admin/scoring.spec.ts:22"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4b3992d0fd3d1442", "name": "Commented-code block (6 lines) in scripts/wiki-lint.ts:496", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/wiki-lint.ts:496"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-af022f937dd5b7fd", "name": "9 env vars used in code but missing from .env.example", "shortDescription": {"text": "9 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `CI`, `E2E_STRIPE_MOCK`, `EXPO_PUBLIC_API_URL`, `NODE_ENV`, `PHASE3B_ALLOW_DESTRUCTIVE`, `PORT`, `SKIP_ENV_VALIDATION`, `VERCEL_ENV` + 1 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/18463"}, "properties": {"repository": "Ronin-Dojo-Design/ronin-dojo-baseline", "repoUrl": "https://github.com/Ronin-Dojo-Design/ronin-dojo-baseline", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-7eaf54602aa3e45b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/backfill-walkin-stub-users.ts:40"}, "properties": {"repobilityId": "963df0e6db61908f", "scanner": "scanner-primary", "fingerprint": "7eaf54602aa3e45b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cfcb72bde5ce8690", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-program.ts:28"}, "properties": {"repobilityId": "11d9e79627949026", "scanner": "scanner-primary", "fingerprint": "cfcb72bde5ce8690", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7d1342cc7ade8776", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/seed-brand-settings.ts:40"}, "properties": {"repobilityId": "640f6b59cb883192", "scanner": "scanner-primary", "fingerprint": "7d1342cc7ade8776", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bafa3ae6597acece", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-passport.ts:24"}, "properties": {"repobilityId": "8eb6ec18230f305e", "scanner": "scanner-primary", "fingerprint": "bafa3ae6597acece", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7c2d0be588e115f5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/phase3-preflight-assert.ts:42"}, "properties": {"repobilityId": "cf516e45cb3f6ab3", "scanner": "scanner-primary", "fingerprint": "7c2d0be588e115f5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a1add9a7e8c6f409", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/fix-merch-stripe-display-names.ts:48"}, "properties": {"repobilityId": "b605a31940da486f", "scanner": "scanner-primary", "fingerprint": "a1add9a7e8c6f409", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-162456ed8580e5d5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-school-ops-extended.ts:37"}, "properties": {"repobilityId": "d17f45fa1240525f", "scanner": "scanner-primary", "fingerprint": "162456ed8580e5d5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cede9b5b21a1d369", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/phase3b-user-carry-data.ts:329"}, "properties": {"repobilityId": "dba46a0406e1ff04", "scanner": "scanner-primary", "fingerprint": "cede9b5b21a1d369", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-04b9aff7548e390d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-attendance.ts:43"}, "properties": {"repobilityId": "ff3c0b83ede30243", "scanner": "scanner-primary", "fingerprint": "04b9aff7548e390d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-55a45a5c87197e27", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/send-resend-production-test.tsx:81"}, "properties": {"repobilityId": "68d97da6decfb52f", "scanner": "scanner-primary", "fingerprint": "55a45a5c87197e27", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a0ed428cedda5407", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/setup-stripe-products.ts:305"}, "properties": {"repobilityId": "4f54f9d6a187a4c3", "scanner": "scanner-primary", "fingerprint": "a0ed428cedda5407", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c51225b788bb29fc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/backfill-slugs.ts:28"}, "properties": {"repobilityId": "f35ffc56e88c2455", "scanner": "scanner-primary", "fingerprint": "c51225b788bb29fc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-def5fa609c635734", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/setup-merch-stripe-products.ts:94"}, "properties": {"repobilityId": "b200bf5713962904", "scanner": "scanner-primary", "fingerprint": "def5fa609c635734", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9b6eabbb0d376e6a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-schedule.ts:59"}, "properties": {"repobilityId": "a65cd01069cf7259", "scanner": "scanner-primary", "fingerprint": "9b6eabbb0d376e6a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-aad44c2d54d39b70", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/audit-payment-entitlements.ts:10"}, "properties": {"repobilityId": "71cc66577f89eb8d", "scanner": "scanner-primary", "fingerprint": "aad44c2d54d39b70", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ce0873767d3b3da9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-org.ts:27"}, "properties": {"repobilityId": "5b4c068ba57ecf7f", "scanner": "scanner-primary", "fingerprint": "ce0873767d3b3da9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-135d1e9b3ea47af7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-entitlements.ts:12"}, "properties": {"repobilityId": "f11e6b17b952fda4", "scanner": "scanner-primary", "fingerprint": "135d1e9b3ea47af7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-14264a3a60fa60a9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/setup-ronin-stripe-products.ts:741"}, "properties": {"repobilityId": "7601e79984e3f4ee", "scanner": "scanner-primary", "fingerprint": "14264a3a60fa60a9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-558bb2a222d78f60", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/scripts/smoke-lead-lifecycle.ts:19"}, "properties": {"repobilityId": "a0b5b01bed0d6608", "scanner": "scanner-primary", "fingerprint": "558bb2a222d78f60", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-001679e7309322db", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-baseline-lineage.ts:600"}, "properties": {"repobilityId": "ddd174a4aeedb4b4", "scanner": "scanner-primary", "fingerprint": "001679e7309322db", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-518f52d370178218", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-baseline-listings.ts:555"}, "properties": {"repobilityId": "01ab35d2ece7b803", "scanner": "scanner-primary", "fingerprint": "518f52d370178218", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ade8be745b3c776c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-tuffbuffs-merch.ts:494"}, "properties": {"repobilityId": "e19b24943c5f9c15", "scanner": "scanner-primary", "fingerprint": "ade8be745b3c776c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a6e982fa4b11e6c6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-baseline-launch.ts:103"}, "properties": {"repobilityId": "c91a680f77d421ba", "scanner": "scanner-primary", "fingerprint": "a6e982fa4b11e6c6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-33efa7889ae831f0", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/prisma/seed.ts:1158"}, "properties": {"repobilityId": "f44a6600719b4bee", "scanner": "scanner-primary", "fingerprint": "33efa7889ae831f0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-f446a91479852e99", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed.ts:25"}, "properties": {"repobilityId": "112a72e56ade1136", "scanner": "scanner-primary", "fingerprint": "f446a91479852e99", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-89dc3dea16391afe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-baseline-programs.ts:540"}, "properties": {"repobilityId": "851492494090b68d", "scanner": "scanner-primary", "fingerprint": "89dc3dea16391afe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-391d79dd08133393", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-content-atom-proof.ts:220"}, "properties": {"repobilityId": "fbba8e6ac2f207e3", "scanner": "scanner-primary", "fingerprint": "391d79dd08133393", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a5cf23a82cd43242", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-bbl-org.ts:38"}, "properties": {"repobilityId": "313e83e2d00379aa", "scanner": "scanner-primary", "fingerprint": "a5cf23a82cd43242", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f84e0dd763c2e807", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-baseline-platform.ts:41"}, "properties": {"repobilityId": "c3f632cb3ec6a5f3", "scanner": "scanner-primary", "fingerprint": "f84e0dd763c2e807", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-14ffd7dd5a99843a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-gear-recommendations.ts:213"}, "properties": {"repobilityId": "f8f624a24f024b23", "scanner": "scanner-primary", "fingerprint": "14ffd7dd5a99843a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-46be328718d26103", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-tuffbuffs-affiliate.ts:428"}, "properties": {"repobilityId": "113de6d11431fb35", "scanner": "scanner-primary", "fingerprint": "46be328718d26103", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-510c286c14f9afc2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-gear-recommendations-remaining.ts:89"}, "properties": {"repobilityId": "8f7d195e207c1a18", "scanner": "scanner-primary", "fingerprint": "510c286c14f9afc2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-25b69ae1179c2c53", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-pricing-plans.ts:384"}, "properties": {"repobilityId": "fb444626cb03d1c9", "scanner": "scanner-primary", "fingerprint": "25b69ae1179c2c53", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-04c5aa26232cc306", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-age-groups-skill-levels.ts:14"}, "properties": {"repobilityId": "608a72b8af027778", "scanner": "scanner-primary", "fingerprint": "04c5aa26232cc306", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-33d0e00dd3f20807", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/prisma/seed-baseline-owner.ts:71"}, "properties": {"repobilityId": "7eec6ee5e2a837bd", "scanner": "scanner-primary", "fingerprint": "33d0e00dd3f20807", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6ff75693fba2f43c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/common/search.tsx:220"}, "properties": {"repobilityId": "2043730d0b58c24a", "scanner": "scanner-primary", "fingerprint": "6ff75693fba2f43c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-97635689f12809b5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/admin/tournaments/registrations-table-columns.tsx:97"}, "properties": {"repobilityId": "c55ce00aecd95151", "scanner": "scanner-primary", "fingerprint": "97635689f12809b5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-38d060f91e851d35", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/inline-menu.tsx:50"}, "properties": {"repobilityId": "57ea77a3c459d925", "scanner": "scanner-primary", "fingerprint": "38d060f91e851d35", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-92b2989a35e3f6fb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/user-menu.tsx:80"}, "properties": {"repobilityId": "dd06a0fee6347858", "scanner": "scanner-primary", "fingerprint": "92b2989a35e3f6fb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f73c998efda0780a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/bottom.tsx:43"}, "properties": {"repobilityId": "1c3e846e4cbebf29", "scanner": "scanner-primary", "fingerprint": "f73c998efda0780a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-61ef024de937e9c9", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/components/web/structured-data.tsx:5"}, "properties": {"repobilityId": "909aa70d55d98e2a", "scanner": "scanner-primary", "fingerprint": "61ef024de937e9c9", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9969a4667a312c7b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/schools/school-card.tsx:36"}, "properties": {"repobilityId": "37ebaf861823bc51", "scanner": "scanner-primary", "fingerprint": "9969a4667a312c7b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-05e0a03b45ee5ded", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/directory/facet-result-card.tsx:32"}, "properties": {"repobilityId": "b2021e3706a56c57", "scanner": "scanner-primary", "fingerprint": "05e0a03b45ee5ded", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1365d83aa921d716", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/ui/logo.tsx:35"}, "properties": {"repobilityId": "f71302714be610a1", "scanner": "scanner-primary", "fingerprint": "1365d83aa921d716", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-135de63c34d03c58", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/ui/tile.tsx:33"}, "properties": {"repobilityId": "90b5e942ff92e2ba", "scanner": "scanner-primary", "fingerprint": "135de63c34d03c58", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-335e24cd00e1306b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/ui/author.tsx:28"}, "properties": {"repobilityId": "1049ec806e6ddb2e", "scanner": "scanner-primary", "fingerprint": "335e24cd00e1306b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5e4386945ba6d680", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/ads/ad-card.tsx:65"}, "properties": {"repobilityId": "aa9c514b946cfaaf", "scanner": "scanner-primary", "fingerprint": "5e4386945ba6d680", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9a73cb92bbd19daa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/nav/nav-sheet.tsx:101"}, "properties": {"repobilityId": "17c00114c4fea997", "scanner": "scanner-primary", "fingerprint": "9a73cb92bbd19daa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c8077d5c7f10afe5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/lineage-profile-drawer.tsx:363"}, "properties": {"repobilityId": "5252f5de549d8bbb", "scanner": "scanner-primary", "fingerprint": "c8077d5c7f10afe5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0ad42afe5abaccc3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/lineage-compact-child-list.tsx:245"}, "properties": {"repobilityId": "e87fec85b5eacc3a", "scanner": "scanner-primary", "fingerprint": "0ad42afe5abaccc3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e7a4267bbf32591f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/lineage-rank-progression-panel.tsx:97"}, "properties": {"repobilityId": "480b27f44f47df7f", "scanner": "scanner-primary", "fingerprint": "e7a4267bbf32591f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-df0cd7a2f24f5904", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/lineage-node-card.tsx:140"}, "properties": {"repobilityId": "c25c9b293b6f5040", "scanner": "scanner-primary", "fingerprint": "df0cd7a2f24f5904", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9f1023cc48df7fe8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/lineage-mobile-list.tsx:132"}, "properties": {"repobilityId": "520d2b14a25eadce", "scanner": "scanner-primary", "fingerprint": "9f1023cc48df7fe8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3f962e24fa5f8bc4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/students-carousel.tsx:77"}, "properties": {"repobilityId": "b4488bb28c24495c", "scanner": "scanner-primary", "fingerprint": "3f962e24fa5f8bc4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-894e38806a2a10dd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/lineage/lineage-honor-strip.tsx:126"}, "properties": {"repobilityId": "4ad9dd0040eedfcc", "scanner": "scanner-primary", "fingerprint": "894e38806a2a10dd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a1dc14d57981da25", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/techniques/technique-card.tsx:41"}, "properties": {"repobilityId": "3ebe702423e1390c", "scanner": "scanner-primary", "fingerprint": "a1dc14d57981da25", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-248a738dcae5529d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/tools/tool-entry.tsx:43"}, "properties": {"repobilityId": "22ea010996406ee0", "scanner": "scanner-primary", "fingerprint": "248a738dcae5529d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-50aecb0e10721e43", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/tools/tool-card.tsx:28"}, "properties": {"repobilityId": "7e7e5148dbfb6d55", "scanner": "scanner-primary", "fingerprint": "50aecb0e10721e43", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c658a0e9e955fcb3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/profile/profile-hero.tsx:53"}, "properties": {"repobilityId": "d6c80ea90ddb47d6", "scanner": "scanner-primary", "fingerprint": "c658a0e9e955fcb3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-220baf19d39110b1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/courses/course-card.tsx:39"}, "properties": {"repobilityId": "554cef0c4c8b10b6", "scanner": "scanner-primary", "fingerprint": "220baf19d39110b1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-99255411be3f24f5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/web/products/product.tsx:123"}, "properties": {"repobilityId": "85e0977927e561ad", "scanner": "scanner-primary", "fingerprint": "99255411be3f24f5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b74c324ce4d7ed12", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/components/data-table/data-table-view-options.tsx:61"}, "properties": {"repobilityId": "e53c098eab47353c", "scanner": "scanner-primary", "fingerprint": "b74c324ce4d7ed12", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c70e83aa401516dc", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/layout.tsx:69"}, "properties": {"repobilityId": "c0c2a3988fe8adb9", "scanner": "scanner-primary", "fingerprint": "c70e83aa401516dc", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-df1a969043e42b18", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/app/api/stripe/webhooks/route.ts:461"}, "properties": {"repobilityId": "7764c44b36ed33d8", "scanner": "scanner-primary", "fingerprint": "df1a969043e42b18", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-aa5c5eeb44f17ed9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/app/api/printful/webhooks/route.ts:34"}, "properties": {"repobilityId": "3031c05f6b12a73e", "scanner": "scanner-primary", "fingerprint": "aa5c5eeb44f17ed9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a37d972464034d6e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/posts/_components/post-form.tsx:103"}, "properties": {"repobilityId": "b8c2ae4167dcc922", "scanner": "scanner-primary", "fingerprint": "a37d972464034d6e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d484bd22da692d42", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/skill-levels/_components/skill-levels-table-columns.tsx:60"}, "properties": {"repobilityId": "30b9b55c88e5ae4f", "scanner": "scanner-primary", "fingerprint": "d484bd22da692d42", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3689e2466bab83e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/skill-levels/_components/skill-level-form.tsx:67"}, "properties": {"repobilityId": "4c9a7398a36e5538", "scanner": "scanner-primary", "fingerprint": "3689e2466bab83e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-138dd85b214494df", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/email/_components/bbl-email-catalog-panel.tsx:87"}, "properties": {"repobilityId": "2df08bac9a33119f", "scanner": "scanner-primary", "fingerprint": "138dd85b214494df", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2d5484611ddacfa7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/entitlements/_components/entitlements-table-columns.tsx:67"}, "properties": {"repobilityId": "f4ab9a0ac1fca585", "scanner": "scanner-primary", "fingerprint": "2d5484611ddacfa7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bddf4da3a2c3c180", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/entitlements/_components/entitlement-form.tsx:80"}, "properties": {"repobilityId": "b1b5c7511aef61f4", "scanner": "scanner-primary", "fingerprint": "bddf4da3a2c3c180", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1382c9248933b9f3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/leads/_components/leads-table-columns.tsx:70"}, "properties": {"repobilityId": "a7b58f4ca0fb3056", "scanner": "scanner-primary", "fingerprint": "1382c9248933b9f3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a4565d668cd5f597", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/leads/_components/lead-form.tsx:77"}, "properties": {"repobilityId": "f54c390f1571e1eb", "scanner": "scanner-primary", "fingerprint": "a4565d668cd5f597", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e8a9b5a428183312", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/media/page.tsx:70"}, "properties": {"repobilityId": "ea52a35fd87af768", "scanner": "scanner-primary", "fingerprint": "e8a9b5a428183312", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8a2caa1708359cde", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/claims/page.tsx:32"}, "properties": {"repobilityId": "39a2a387e971597a", "scanner": "scanner-primary", "fingerprint": "8a2caa1708359cde", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-965ff0da56a927e0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/subscription-tiers/_components/subscription-tiers-table-columns.tsx:82"}, "properties": {"repobilityId": "c158c5799ee0b875", "scanner": "scanner-primary", "fingerprint": "965ff0da56a927e0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e992e6eab18cd24a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/subscription-tiers/_components/subscription-tier-form.tsx:87"}, "properties": {"repobilityId": "f9432b70df2c1f16", "scanner": "scanner-primary", "fingerprint": "e992e6eab18cd24a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fa4316d971578858", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/pricing-plans/_components/pricing-plan-form.tsx:133"}, "properties": {"repobilityId": "36a2b3d493d832f2", "scanner": "scanner-primary", "fingerprint": "fa4316d971578858", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e2e97a16b2516a99", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/pricing-plans/_components/pricing-plans-table-columns.tsx:77"}, "properties": {"repobilityId": "81c91c54f38d0cbf", "scanner": "scanner-primary", "fingerprint": "e2e97a16b2516a99", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-675c6d778dea9219", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/lineage/page.tsx:83"}, "properties": {"repobilityId": "ed1740aaa247bef8", "scanner": "scanner-primary", "fingerprint": "675c6d778dea9219", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-261e42efdd6fec5f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/lineage/[treeId]/page.tsx:157"}, "properties": {"repobilityId": "841128bb2ddd0c1e", "scanner": "scanner-primary", "fingerprint": "261e42efdd6fec5f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2a3b4b43041c3049", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/lineage/claims/page.tsx:35"}, "properties": {"repobilityId": "37b624e0191fad31", "scanner": "scanner-primary", "fingerprint": "2a3b4b43041c3049", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1f448a1a1c550bd3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/billing/monitoring/page.tsx:49"}, "properties": {"repobilityId": "dc61eac6ff9eb2ea", "scanner": "scanner-primary", "fingerprint": "1f448a1a1c550bd3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a6c90a7d07901db8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/roles/_components/role-form.tsx:61"}, "properties": {"repobilityId": "c8bd3c5695c172f4", "scanner": "scanner-primary", "fingerprint": "a6c90a7d07901db8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-02e5c337178d51b2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/categories/_components/categories-table-columns.tsx:55"}, "properties": {"repobilityId": "821eecb2c9ca723e", "scanner": "scanner-primary", "fingerprint": "02e5c337178d51b2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-212a42ac0295e660", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/categories/_components/category-form.tsx:97"}, "properties": {"repobilityId": "5449682ea3790c1d", "scanner": "scanner-primary", "fingerprint": "212a42ac0295e660", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fa809680654564a8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/content/_components/content-atom-form.tsx:115"}, "properties": {"repobilityId": "5718771b967f9cf8", "scanner": "scanner-primary", "fingerprint": "fa809680654564a8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b0129b3e6e18ab9d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/content/_components/content-media-panel.tsx:88"}, "properties": {"repobilityId": "fd505fb354878f1d", "scanner": "scanner-primary", "fingerprint": "b0129b3e6e18ab9d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c93a74162ce2978e", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/app/app/tools/_components/tool-actions.tsx:44"}, "properties": {"repobilityId": "3ab755f38ef348f5", "scanner": "scanner-primary", "fingerprint": "c93a74162ce2978e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-37e54c430ff227a2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/tools/_components/tool-form.tsx:200"}, "properties": {"repobilityId": "853012c174f7c68d", "scanner": "scanner-primary", "fingerprint": "37e54c430ff227a2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-220f780d9006ed82", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/tools/_components/tools-table-columns.tsx:65"}, "properties": {"repobilityId": "8fc673199b12d0e4", "scanner": "scanner-primary", "fingerprint": "220f780d9006ed82", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c1fd4ed7770ed9a4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/reports/_components/report-form.tsx:66"}, "properties": {"repobilityId": "478a1043313534e4", "scanner": "scanner-primary", "fingerprint": "c1fd4ed7770ed9a4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b84115060d48e05e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/reports/_components/reports-table-columns.tsx:61"}, "properties": {"repobilityId": "6e6d179106bed7dc", "scanner": "scanner-primary", "fingerprint": "b84115060d48e05e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e3d8e6b028da111c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/merch/orders/_components/orders-table-columns.tsx:69"}, "properties": {"repobilityId": "c04858d98124387b", "scanner": "scanner-primary", "fingerprint": "e3d8e6b028da111c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0c9e6953aba95170", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/age-groups/_components/age-group-form.tsx:67"}, "properties": {"repobilityId": "352d22e022230c3d", "scanner": "scanner-primary", "fingerprint": "0c9e6953aba95170", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b1314e5ec22ce425", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/privacy/requests/page.tsx:55"}, "properties": {"repobilityId": "5a68a91f79fc1786", "scanner": "scanner-primary", "fingerprint": "b1314e5ec22ce425", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c550c72a9e29dc03", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/subscriptions/_components/subscription-form.tsx:82"}, "properties": {"repobilityId": "6211502592a80e4d", "scanner": "scanner-primary", "fingerprint": "c550c72a9e29dc03", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-50438d1fdc459d13", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/tags/_components/tag-form.tsx:75"}, "properties": {"repobilityId": "23e076835850557c", "scanner": "scanner-primary", "fingerprint": "50438d1fdc459d13", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3593fdfa00da95c8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/app/invites/_components/invite-form.tsx:80"}, "properties": {"repobilityId": "6686e7f359025cf8", "scanner": "scanner-primary", "fingerprint": "3593fdfa00da95c8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bdf4ad5aacb3e6e5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/blog/[slug]/page.tsx:126"}, "properties": {"repobilityId": "e5e872d44b42564c", "scanner": "scanner-primary", "fingerprint": "bdf4ad5aacb3e6e5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1b9e98a286d7d5cf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/schools/[slug]/page.tsx:376"}, "properties": {"repobilityId": "41ea7887abef50c1", "scanner": "scanner-primary", "fingerprint": "1b9e98a286d7d5cf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-579331401461f7f9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/posts/[slug]/page.tsx:152"}, "properties": {"repobilityId": "1dce07a81ffe4953", "scanner": "scanner-primary", "fingerprint": "579331401461f7f9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-42cdbd8331c0f967", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/lineage/join/lineage-membership-checkout.tsx:71"}, "properties": {"repobilityId": "1493e1d7f46c1ca1", "scanner": "scanner-primary", "fingerprint": "42cdbd8331c0f967", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-96f198c0bc82eb93", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/disciplines/_components/member-carousel-by-rank.tsx:35"}, "properties": {"repobilityId": "64e74b65cfaf1019", "scanner": "scanner-primary", "fingerprint": "96f198c0bc82eb93", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-003b39cef6d07d19", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/disciplines/_components/video-carousel.tsx:42"}, "properties": {"repobilityId": "6dfd931059fda897", "scanner": "scanner-primary", "fingerprint": "003b39cef6d07d19", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cab9a730f4978dac", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/disciplines/_components/discipline-card.tsx:52"}, "properties": {"repobilityId": "967ddc5dbd83932c", "scanner": "scanner-primary", "fingerprint": "cab9a730f4978dac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bf951e25f59dc143", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/disciplines/[slug]/page.tsx:284"}, "properties": {"repobilityId": "9cf91e6c1f2613b5", "scanner": "scanner-primary", "fingerprint": "bf951e25f59dc143", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7f44380fd0d99577", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/programs/page.tsx:107"}, "properties": {"repobilityId": "641cf77167b6b7e0", "scanner": "scanner-primary", "fingerprint": "7f44380fd0d99577", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e09927e1054fe8f9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/programs/[id]/page.tsx:225"}, "properties": {"repobilityId": "85eb72264362a4e6", "scanner": "scanner-primary", "fingerprint": "e09927e1054fe8f9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fa074a6e8659c540", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/programs/[id]/schedules/page.tsx:129"}, "properties": {"repobilityId": "bcc43333007a3a91", "scanner": "scanner-primary", "fingerprint": "fa074a6e8659c540", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-820a6b979b32dce8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/(home)/bbl/bbl-landing.tsx:265"}, "properties": {"repobilityId": "c7f36e2c19e463f0", "scanner": "scanner-primary", "fingerprint": "820a6b979b32dce8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8632bf4781bc86e5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/organizations/page.tsx:112"}, "properties": {"repobilityId": "1eda232efbd08398", "scanner": "scanner-primary", "fingerprint": "8632bf4781bc86e5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-898224b3c553293c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/organizations/[slug]/page.tsx:366"}, "properties": {"repobilityId": "7fbcc88f0c607092", "scanner": "scanner-primary", "fingerprint": "898224b3c553293c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f219278501dcfe96", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/app/(web)/organizations/[slug]/layout.tsx:37"}, "properties": {"repobilityId": "332ab951f1da7678", "scanner": "scanner-primary", "fingerprint": "f219278501dcfe96", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-40280c429bbb0d43", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/me/passport-editor.tsx:470"}, "properties": {"repobilityId": "451a7414ef525c97", "scanner": "scanner-primary", "fingerprint": "40280c429bbb0d43", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ee45cb14122c2438", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/(web)/[slug]/page.tsx:102"}, "properties": {"repobilityId": "ea2a270d00053bdb", "scanner": "scanner-primary", "fingerprint": "ee45cb14122c2438", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6d8a14b61d98925b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/users/_components/user-form.tsx:68"}, "properties": {"repobilityId": "317bd584c0ed00fd", "scanner": "scanner-primary", "fingerprint": "6d8a14b61d98925b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ac2c53b237964b45", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/users/_components/person-form.tsx:115"}, "properties": {"repobilityId": "150e06cdd20a395c", "scanner": "scanner-primary", "fingerprint": "ac2c53b237964b45", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-953f37d4b2cb77a2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/claims/page.tsx:33"}, "properties": {"repobilityId": "9f4e24f835882e9f", "scanner": "scanner-primary", "fingerprint": "953f37d4b2cb77a2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7fee89621dc017be", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/subscription-tiers/_components/subscription-tiers-table-columns.tsx:82"}, "properties": {"repobilityId": "ea6bfb2199c464de", "scanner": "scanner-primary", "fingerprint": "7fee89621dc017be", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d5d59429a652a68e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/subscription-tiers/_components/subscription-tier-form.tsx:87"}, "properties": {"repobilityId": "3a5e14e36b060100", "scanner": "scanner-primary", "fingerprint": "d5d59429a652a68e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6cd8c4bb1e079834", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/pricing-plans/_components/pricing-plan-form.tsx:133"}, "properties": {"repobilityId": "01c847c66524a4ac", "scanner": "scanner-primary", "fingerprint": "6cd8c4bb1e079834", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-45075c180dc63489", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/pricing-plans/_components/pricing-plans-table-columns.tsx:77"}, "properties": {"repobilityId": "789b346e1ff48528", "scanner": "scanner-primary", "fingerprint": "45075c180dc63489", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3ad905cf31834d22", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/lineage/page.tsx:83"}, "properties": {"repobilityId": "faae6d72835af297", "scanner": "scanner-primary", "fingerprint": "3ad905cf31834d22", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-42617a2976b2769e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/lineage/[treeId]/page.tsx:155"}, "properties": {"repobilityId": "07b8e15ea6d54ff9", "scanner": "scanner-primary", "fingerprint": "42617a2976b2769e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8e65e0c2b6550971", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/lineage/claims/page.tsx:35"}, "properties": {"repobilityId": "2ffe6a5b96d0444c", "scanner": "scanner-primary", "fingerprint": "8e65e0c2b6550971", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a8531431cfed8551", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/lineage/_components/lineage-selected-rank-select.tsx:65"}, "properties": {"repobilityId": "450aa98c9c3b3991", "scanner": "scanner-primary", "fingerprint": "a8531431cfed8551", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1f616a1e1784cd35", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tournaments/roles/_components/tournament-role-form.tsx:87"}, "properties": {"repobilityId": "93010fa4aea6e9df", "scanner": "scanner-primary", "fingerprint": "1f616a1e1784cd35", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f0bf6a79d8963bc5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tournaments/rule-sets/_components/rule-set-form.tsx:83"}, "properties": {"repobilityId": "1f55a48e2293f796", "scanner": "scanner-primary", "fingerprint": "f0bf6a79d8963bc5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d29ca79845d80164", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tournaments/_components/score-forms.tsx:133"}, "properties": {"repobilityId": "57c680ee46f98069", "scanner": "scanner-primary", "fingerprint": "d29ca79845d80164", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5fde3d129216e1a2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tournaments/_components/staff-panel.tsx:132"}, "properties": {"repobilityId": "b6251fa60359ea4f", "scanner": "scanner-primary", "fingerprint": "5fde3d129216e1a2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9c003f0b61a9d999", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tournaments/_components/bracket-viewer.tsx:341"}, "properties": {"repobilityId": "3aff84bf2f2deb8b", "scanner": "scanner-primary", "fingerprint": "9c003f0b61a9d999", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-177103673c5444b6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/billing/monitoring/page.tsx:50"}, "properties": {"repobilityId": "a0cdfc66033062d0", "scanner": "scanner-primary", "fingerprint": "177103673c5444b6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3d13f30d6610aad4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/categories/_components/categories-table-columns.tsx:55"}, "properties": {"repobilityId": "20785a4d8f1b5d9a", "scanner": "scanner-primary", "fingerprint": "3d13f30d6610aad4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c91f1078550565b2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/categories/_components/category-form.tsx:97"}, "properties": {"repobilityId": "89a5c208662ea035", "scanner": "scanner-primary", "fingerprint": "c91f1078550565b2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-89818b387dbbca02", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/app/admin/tools/_components/tool-actions.tsx:44"}, "properties": {"repobilityId": "2cd4d907ff189067", "scanner": "scanner-primary", "fingerprint": "89818b387dbbca02", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-86d9d47bd8f02f25", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tools/_components/tool-form.tsx:200"}, "properties": {"repobilityId": "3cd60932f711eb6c", "scanner": "scanner-primary", "fingerprint": "86d9d47bd8f02f25", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0ec190586a8d1840", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tools/_components/tools-table-columns.tsx:65"}, "properties": {"repobilityId": "7eb88c4c5d1a7103", "scanner": "scanner-primary", "fingerprint": "0ec190586a8d1840", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eedc218c43830d72", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/memberships/_components/memberships-table-columns.tsx:91"}, "properties": {"repobilityId": "78c9fef8b65ed276", "scanner": "scanner-primary", "fingerprint": "eedc218c43830d72", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-21a7d8e680ec1345", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/merch/orders/_components/orders-table-columns.tsx:69"}, "properties": {"repobilityId": "f3c0a23e0fc582ed", "scanner": "scanner-primary", "fingerprint": "21a7d8e680ec1345", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4fd068bb95369f98", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/subscriptions/_components/subscription-form.tsx:82"}, "properties": {"repobilityId": "dcebacfbb95cc04d", "scanner": "scanner-primary", "fingerprint": "4fd068bb95369f98", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e3e8c6d3918535d3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/app/admin/tags/_components/tag-form.tsx:75"}, "properties": {"repobilityId": "b9c50a511fcca711", "scanner": "scanner-primary", "fingerprint": "e3e8c6d3918535d3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8acbdc5e0b76f2a8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/lib/email.ts:126"}, "properties": {"repobilityId": "fb48700c00a8729f", "scanner": "scanner-primary", "fingerprint": "8acbdc5e0b76f2a8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e3354c95bb5f2e12", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/lib/i18n.ts:28"}, "properties": {"repobilityId": "e12ce9c7b23499ce", "scanner": "scanner-primary", "fingerprint": "e3354c95bb5f2e12", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-0fc9f56c180dcd99", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/lib/lineage/family-chart/types/form.ts:11"}, "properties": {"repobilityId": "85b34ca07dbe6c8a", "scanner": "scanner-primary", "fingerprint": "0fc9f56c180dcd99", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-fa4197cab458f946", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/lib/lineage/family-chart/renderers/card-svg/card-svg.ts:10"}, "properties": {"repobilityId": "b8cec4b5d725a988", "scanner": "scanner-primary", "fingerprint": "fa4197cab458f946", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-bbd87abc9e00573a", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/lib/lineage/family-chart/core/edit.ts:267"}, "properties": {"repobilityId": "df011fe91a97a983", "scanner": "scanner-primary", "fingerprint": "bbd87abc9e00573a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-3de917128aa21ee6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/lib/lineage/family-chart/core/edit.ts:220"}, "properties": {"repobilityId": "e4f9f5fbf82c156f", "scanner": "scanner-primary", "fingerprint": "3de917128aa21ee6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9913c8c051862205", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/lib/lineage/family-chart/handlers/general.ts:15"}, "properties": {"repobilityId": "4d41605237a8d42f", "scanner": "scanner-primary", "fingerprint": "9913c8c051862205", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-c242ab13b8d44f6e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/lib/lineage/family-chart/handlers/view-handlers.ts:106"}, "properties": {"repobilityId": "b083832ebff37633", "scanner": "scanner-primary", "fingerprint": "c242ab13b8d44f6e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2383bde325f26079", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/hooks/use-track-event.ts:14"}, "properties": {"repobilityId": "b210369d59f2acd6", "scanner": "scanner-primary", "fingerprint": "2383bde325f26079", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ad1f435d6f8bddd3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/directory/search-organizations.ts:62"}, "properties": {"repobilityId": "70095a305ffba705", "scanner": "scanner-primary", "fingerprint": "ad1f435d6f8bddd3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-62561bbee712d9db", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/directory/search-profiles.ts:71"}, "properties": {"repobilityId": "c260662e0aa404ad", "scanner": "scanner-primary", "fingerprint": "62561bbee712d9db", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3310ec025e721f32", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/techniques/queries.ts:58"}, "properties": {"repobilityId": "cc009789f5bc2035", "scanner": "scanner-primary", "fingerprint": "3310ec025e721f32", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-914cc32dd4f25432", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/tools/queries.ts:68"}, "properties": {"repobilityId": "dfddf32b01938231", "scanner": "scanner-primary", "fingerprint": "914cc32dd4f25432", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1faa945c6f99dc90", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/actions/search.ts:42"}, "properties": {"repobilityId": "769defd96c1d90eb", "scanner": "scanner-primary", "fingerprint": "1faa945c6f99dc90", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c739de34d20b1e8f", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/web/server/web/merch/printful-actions.ts:12"}, "properties": {"repobilityId": "1b058ea824e3a4bd", "scanner": "scanner-primary", "fingerprint": "c739de34d20b1e8f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-542478cf42ef9aad", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/merch/printful-actions.ts:292"}, "properties": {"repobilityId": "f21a1ae279b6cc0c", "scanner": "scanner-primary", "fingerprint": "542478cf42ef9aad", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-52934fa0f516a1ab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/server/web/tags/queries.ts:56"}, "properties": {"repobilityId": "9edd4d988f7527e1", "scanner": "scanner-primary", "fingerprint": "52934fa0f516a1ab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3f8c5e34aacbfdf6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-vercel-env-parity.ts:60"}, "properties": {"repobilityId": "f15263be7117fcf7", "scanner": "scanner-primary", "fingerprint": "3f8c5e34aacbfdf6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d436dfaeba0b3ada", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/capture-balkan-orgchart.ts:40"}, "properties": {"repobilityId": "6e9c58a3d5700e35", "scanner": "scanner-primary", "fingerprint": "d436dfaeba0b3ada", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8ed47bdb5ce1f772", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-architecture-markdownlint.ts:271"}, "properties": {"repobilityId": "dfe035f63be058e2", "scanner": "scanner-primary", "fingerprint": "8ed47bdb5ce1f772", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-974b3e590dd18fb7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/wiki-lint.ts:537"}, "properties": {"repobilityId": "9def10a0f81267b8", "scanner": "scanner-primary", "fingerprint": "974b3e590dd18fb7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-b09b64466ddbe3df", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/components/web/structured-data.tsx:5"}, "properties": {"repobilityId": "97aa8fadb24ed016", "scanner": "scanner-primary", "fingerprint": "b09b64466ddbe3df", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/components/web/structured-data.tsx"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-8129207e4832cf68", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/components/web/lineage/lineage-view-a-island.tsx:347"}, "properties": {"repobilityId": "65f439691f7cef54", "scanner": "scanner-primary", "fingerprint": "8129207e4832cf68", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/components/web/lineage/lineage-view-a-island.tsx"}, "region": {"startLine": 347}}}]}, {"ruleId": "scanner-bbbccfdde202f7e9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/components/web/lineage/lineage-family-chart-smoke.tsx:47"}, "properties": {"repobilityId": "1c1ce618465eb390", "scanner": "scanner-primary", "fingerprint": "bbbccfdde202f7e9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/components/web/lineage/lineage-family-chart-smoke.tsx"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-85bdebaae873109c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/layout.tsx:69"}, "properties": {"repobilityId": "9e48a86129166999", "scanner": "scanner-primary", "fingerprint": "85bdebaae873109c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/app/layout.tsx"}, "region": {"startLine": 69}}}]}, {"ruleId": "scanner-559d38675701c8e9", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/app/(web)/organizations/[slug]/layout.tsx:37"}, "properties": {"repobilityId": "850f8a47fd5bc0a5", "scanner": "scanner-primary", "fingerprint": "559d38675701c8e9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/app/(web)/organizations/[slug]/layout.tsx"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-bc5f2f13f4c620bd", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/renderers/svg.ts:26"}, "properties": {"repobilityId": "4c468037c4c43d3b", "scanner": "scanner-primary", "fingerprint": "bc5f2f13f4c620bd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/lib/lineage/family-chart/renderers/svg.ts"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-fa53616ef3f17719", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/renderers/card-html.ts:39"}, "properties": {"repobilityId": "bac85b7f5e9c4d9d", "scanner": "scanner-primary", "fingerprint": "fa53616ef3f17719", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/lib/lineage/family-chart/renderers/card-html.ts"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-910e08cc7361e2a5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/renderers/create-form.ts:23"}, "properties": {"repobilityId": "3fa7b893372ef3bc", "scanner": "scanner-primary", "fingerprint": "910e08cc7361e2a5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/lib/lineage/family-chart/renderers/create-form.ts"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-27f18acc85f8c634", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/renderers/card-svg/card-svg.ts:44"}, "properties": {"repobilityId": "6abec0a36eebba8b", "scanner": "scanner-primary", "fingerprint": "27f18acc85f8c634", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/lib/lineage/family-chart/renderers/card-svg/card-svg.ts"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-422e95a0e2c35a98", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in apps/web/lib/lineage/family-chart/renderers/card-svg/defs.ts:5"}, "properties": {"repobilityId": "66690d2803730451", "scanner": "scanner-primary", "fingerprint": "422e95a0e2c35a98", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/lib/lineage/family-chart/renderers/card-svg/defs.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-ec46eb6568cf52d4", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/core/edit.ts:246"}, "properties": {"repobilityId": "820cb30536bf8e40", "scanner": "scanner-primary", "fingerprint": "ec46eb6568cf52d4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/lib/lineage/family-chart/core/edit.ts"}, "region": {"startLine": 246}}}]}, {"ruleId": "scanner-52affc2538e1c431", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/core/chart.ts:267"}, "properties": {"repobilityId": "6ee72d9e86e6dffa", "scanner": "scanner-primary", "fingerprint": "52affc2538e1c431", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/lib/lineage/family-chart/core/chart.ts"}, "region": {"startLine": 267}}}]}, {"ruleId": "scanner-dbfaed9ecd4b1166", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/lib/lineage/family-chart/features/modal.ts:59"}, "properties": {"repobilityId": "587242c76160ee2a", "scanner": "scanner-primary", "fingerprint": "dbfaed9ecd4b1166", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/lib/lineage/family-chart/features/modal.ts"}, "region": {"startLine": 59}}}]}, {"ruleId": "scanner-9758c9053c3b7157", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/web/e2e/global-teardown.ts:5"}, "properties": {"repobilityId": "7c92dd1ca72e1269", "scanner": "scanner-primary", "fingerprint": "9758c9053c3b7157", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/e2e/global-teardown.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-9044a18096863fb3", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/web/e2e/global-setup.ts:6"}, "properties": {"repobilityId": "ec3d2bd31daf13c0", "scanner": "scanner-primary", "fingerprint": "9044a18096863fb3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/e2e/global-setup.ts"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-10906bd833331383", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/auth.ts:10"}, "properties": {"repobilityId": "98843d712171cb84", "scanner": "scanner-primary", "fingerprint": "10906bd833331383", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/e2e/helpers/auth.ts"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-7c9e0c169d392d60", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/seed-lineage-comp-fixture.ts:1"}, "properties": {"repobilityId": "568044a38f7c67dc", "scanner": "scanner-primary", "fingerprint": "7c9e0c169d392d60", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/e2e/helpers/seed-lineage-comp-fixture.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b947672633a5b02f", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/seed-lineage-lifecycle.ts:1"}, "properties": {"repobilityId": "890d4f359f1b479a", "scanner": "scanner-primary", "fingerprint": "b947672633a5b02f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/e2e/helpers/seed-lineage-lifecycle.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8e922218391c9a7e", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/stripe-checkout.ts:1"}, "properties": {"repobilityId": "8d2e45d9ffe6059c", "scanner": "scanner-primary", "fingerprint": "8e922218391c9a7e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/e2e/helpers/stripe-checkout.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-683fa5adc0b48d6e", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/dsr.ts:7"}, "properties": {"repobilityId": "ce50a9cbc9b35163", "scanner": "scanner-primary", "fingerprint": "683fa5adc0b48d6e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/e2e/helpers/dsr.ts"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-65c0b8953636e181", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/seed-lineage-rank-redaction.ts:1"}, "properties": {"repobilityId": "6a7058bdad958cd1", "scanner": "scanner-primary", "fingerprint": "65c0b8953636e181", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/e2e/helpers/seed-lineage-rank-redaction.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-352b86bfd315ef3b", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/seed-lineage.ts:1"}, "properties": {"repobilityId": "d222964a0083710e", "scanner": "scanner-primary", "fingerprint": "352b86bfd315ef3b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/e2e/helpers/seed-lineage.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f38b1cbbe9f2fb60", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in apps/web/e2e/helpers/seed-membership.ts:8"}, "properties": {"repobilityId": "e1eed58c6630769b", "scanner": "scanner-primary", "fingerprint": "f38b1cbbe9f2fb60", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/e2e/helpers/seed-membership.ts"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-afe5d4ae6b3185ee", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/check-vercel-env-parity.ts:14"}, "properties": {"repobilityId": "f6615bda6c2f9897", "scanner": "scanner-primary", "fingerprint": "afe5d4ae6b3185ee", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/check-vercel-env-parity.ts"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-ddee78234647b509", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/wiki-lint.ts:17"}, "properties": {"repobilityId": "64bc52f21aa28806", "scanner": "scanner-primary", "fingerprint": "ddee78234647b509", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/wiki-lint.ts"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-f8cdfffd70600cb1", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2b7ca20f3964fe6b", "scanner": "scanner-primary", "fingerprint": "f8cdfffd70600cb1", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/playwright.yml"}, "region": {"startLine": 84}}}]}, {"ruleId": "scanner-f8cdfffd70600cb1", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "7fe4f35046d1ae14", "scanner": "scanner-primary", "fingerprint": "f8cdfffd70600cb1", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/playwright.yml"}, "region": {"startLine": 87}}}]}, {"ruleId": "scanner-f8cdfffd70600cb1", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "07c02d3457e0087b", "scanner": "scanner-primary", "fingerprint": "f8cdfffd70600cb1", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/playwright.yml"}, "region": {"startLine": 92}}}]}, {"ruleId": "scanner-f8cdfffd70600cb1", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "18c8174306e70d67", "scanner": "scanner-primary", "fingerprint": "f8cdfffd70600cb1", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/playwright.yml"}, "region": {"startLine": 112}}}]}, {"ruleId": "scanner-f8cdfffd70600cb1", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "70bd5e1ab83dad41", "scanner": "scanner-primary", "fingerprint": "f8cdfffd70600cb1", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/playwright.yml"}, "region": {"startLine": 135}}}]}, {"ruleId": "scanner-f8cdfffd70600cb1", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "70bd5e1ab83dad41", "scanner": "scanner-primary", "fingerprint": "f8cdfffd70600cb1", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/playwright.yml"}, "region": {"startLine": 143}}}]}, {"ruleId": "scanner-878357cdc8b567d8", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "6c86d46fe43be8ea", "scanner": "scanner-primary", "fingerprint": "878357cdc8b567d8", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-81daf9ff25f1a6ec", "level": "note", "message": {"text": "Very large file: apps/web/prisma/seed-baseline-lineage.ts (1841 lines)"}, "properties": {"repobilityId": "d947faa4dea14b58", "scanner": "scanner-primary", "fingerprint": "81daf9ff25f1a6ec", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d1366563d2214170", "level": "note", "message": {"text": "Very large file: apps/web/prisma/seed.ts (2053 lines)"}, "properties": {"repobilityId": "c52b2d3ebd31243d", "scanner": "scanner-primary", "fingerprint": "d1366563d2214170", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-910d36d9bd0aa305", "level": "note", "message": {"text": "Very large file: apps/web/components/web/lineage/lineage-tree-canvas.tsx (1502 lines)"}, "properties": {"repobilityId": "4d02f107a3c567d9", "scanner": "scanner-primary", "fingerprint": "910d36d9bd0aa305", "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-4a9eb7dc7c6e3880", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "properties": {"repobilityId": "6c1704bf24cf19ac", "scanner": "scanner-primary", "fingerprint": "4a9eb7dc7c6e3880", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-892d4f964c9036e2", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/api-client/package.json"}, "properties": {"repobilityId": "e1c2e42c288c295a", "scanner": "scanner-primary", "fingerprint": "892d4f964c9036e2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/api-client/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "53aa18197fc0d646", "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": "97e5693dcc391043", "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": "91582374ad33c298", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "dec553b33b80427a", "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": "f4887aba6058c3c2", "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": "67c07d1c9ecf01e5", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-40f058715e993ae0", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/bow-out/SKILL.md"}, "properties": {"repobilityId": "591b603b9c45b41b", "scanner": "scanner-primary", "fingerprint": "40f058715e993ae0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/bow-out/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b64845e4a6d25bd7", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/playwright.config.ts:22"}, "properties": {"repobilityId": "4b6d355cfcadacd0", "scanner": "scanner-primary", "fingerprint": "b64845e4a6d25bd7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-48f01fae7da4a477", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/next.config.ts:49"}, "properties": {"repobilityId": "1fd4f307793396fd", "scanner": "scanner-primary", "fingerprint": "48f01fae7da4a477", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3386525727932444", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/scripts/smoke-schedule.ts:333"}, "properties": {"repobilityId": "290d639cf3698063", "scanner": "scanner-primary", "fingerprint": "3386525727932444", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3e7e34ebe404324f", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/prisma/seed-baseline-lineage.ts:396"}, "properties": {"repobilityId": "ab14909ce19cfd9c", "scanner": "scanner-primary", "fingerprint": "3e7e34ebe404324f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-11efb7a22f7331d6", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/web/prisma/seed-baseline-launch.ts:137"}, "properties": {"repobilityId": "ca4130af4a3258ad", "scanner": "scanner-primary", "fingerprint": "11efb7a22f7331d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7780b76f312e5b7c", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/web/prisma/seed.ts:527"}, "properties": {"repobilityId": "4f5be1fdbdd654a4", "scanner": "scanner-primary", "fingerprint": "7780b76f312e5b7c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-afb5c61adfdaea0c", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/prisma/seed-baseline-owner.ts:246"}, "properties": {"repobilityId": "97b319728683167c", "scanner": "scanner-primary", "fingerprint": "afb5c61adfdaea0c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-31562c011f6f1afd", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/components/common/drawer.tsx:137"}, "properties": {"repobilityId": "e180eb98ab19df6e", "scanner": "scanner-primary", "fingerprint": "31562c011f6f1afd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4578c23417730c07", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/components/app/sidebar.tsx:122"}, "properties": {"repobilityId": "c3395a1b8e2e5cb3", "scanner": "scanner-primary", "fingerprint": "4578c23417730c07", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a3529e154cf49d74", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/components/web/user-menu.tsx:29"}, "properties": {"repobilityId": "2685ed6bfc8717fb", "scanner": "scanner-primary", "fingerprint": "a3529e154cf49d74", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a02c4f4bf11a463f", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/components/web/lineage/lineage-tree-canvas.tsx:170"}, "properties": {"repobilityId": "5910dff3c293d21d", "scanner": "scanner-primary", "fingerprint": "a02c4f4bf11a463f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6f256ca6254317cc", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/components/web/tools/tool-filters.tsx:12"}, "properties": {"repobilityId": "044b9ced47457a9a", "scanner": "scanner-primary", "fingerprint": "6f256ca6254317cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bf2da0de2f3989d6", "level": "note", "message": {"text": "Legacy-named symbol `cs_test_unused` in apps/web/app/api/stripe/webhooks/route.test.ts:75"}, "properties": {"repobilityId": "13fa6fe8fd2f67d0", "scanner": "scanner-primary", "fingerprint": "bf2da0de2f3989d6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f8edbaa0c1826d79", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/app/api/stripe/webhooks/route.test.ts:46"}, "properties": {"repobilityId": "f89dc1271d11f14d", "scanner": "scanner-primary", "fingerprint": "f8edbaa0c1826d79", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-092d236a8c26fda9", "level": "none", "message": {"text": "Commented-code block (10 lines) in apps/web/app/api/printful/webhooks/route.ts:44"}, "properties": {"repobilityId": "031008e759d75341", "scanner": "scanner-primary", "fingerprint": "092d236a8c26fda9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e98a83313b25043e", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/app/(web)/lineage/[treeSlug]/page.tsx:84"}, "properties": {"repobilityId": "bceabee7aa76f25f", "scanner": "scanner-primary", "fingerprint": "e98a83313b25043e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d440fd3e076d144c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/app/(web)/courses/page.tsx:65"}, "properties": {"repobilityId": "c8851d3f8114a2d7", "scanner": "scanner-primary", "fingerprint": "d440fd3e076d144c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-12455317a8def9a5", "level": "note", "message": {"text": "Legacy-named symbol `EmailAdminBblJoinLegacy` in apps/web/lib/notifications.ts:10"}, "properties": {"repobilityId": "8baf6c91b0df62a7", "scanner": "scanner-primary", "fingerprint": "12455317a8def9a5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-70e0be53f7b417fb", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/lib/notifications.ts:352"}, "properties": {"repobilityId": "28166cb1f5b0f6e8", "scanner": "scanner-primary", "fingerprint": "70e0be53f7b417fb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-59b908d4df535950", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/lib/fonts.ts:13"}, "properties": {"repobilityId": "b16323425f054229", "scanner": "scanner-primary", "fingerprint": "59b908d4df535950", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-96efe0b0bc4b0638", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/lib/orpc-client.ts:15"}, "properties": {"repobilityId": "d55819d99502e2c8", "scanner": "scanner-primary", "fingerprint": "96efe0b0bc4b0638", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2eed4571f4b37f3a", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/lib/directory/facet-result.ts:50"}, "properties": {"repobilityId": "3da5209fc3914b0a", "scanner": "scanner-primary", "fingerprint": "2eed4571f4b37f3a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-69b3b39d269d685c", "level": "note", "message": {"text": "Legacy-named symbol `htmlHandlersWithDeprecated` in apps/web/lib/lineage/family-chart/exports.ts:40"}, "properties": {"repobilityId": "62a6b77b9948e947", "scanner": "scanner-primary", "fingerprint": "69b3b39d269d685c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a968c396f05a48c8", "level": "note", "message": {"text": "Legacy-named symbol `EmailAdminBblJoinLegacy` in apps/web/emails/admin-bbl-join-legacy.tsx:19"}, "properties": {"repobilityId": "7da3e0abcb3ca64f", "scanner": "scanner-primary", "fingerprint": "a968c396f05a48c8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-33035d00209c6d0e", "level": "note", "message": {"text": "Legacy-named symbol `EmailAdminBblJoinLegacy` in apps/web/server/admin/email/catalog.tsx:4"}, "properties": {"repobilityId": "a0d6a4e8a46c7c53", "scanner": "scanner-primary", "fingerprint": "33035d00209c6d0e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1f9043600fe13135", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/server/admin/lineage/claim-review-actions.ts:135"}, "properties": {"repobilityId": "b3bbae8b338802e2", "scanner": "scanner-primary", "fingerprint": "1f9043600fe13135", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a11f1735e7c90b1d", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/server/admin/tournaments/schema.ts:181"}, "properties": {"repobilityId": "b3f8c6cefde3882a", "scanner": "scanner-primary", "fingerprint": "a11f1735e7c90b1d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1cd769af23fd3654", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/server/admin/tournaments/actions.ts:334"}, "properties": {"repobilityId": "06e29ce228b96964", "scanner": "scanner-primary", "fingerprint": "1cd769af23fd3654", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-76fbc50d30ce8337", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/web/server/web/schedule/actions.test.ts:214"}, "properties": {"repobilityId": "dcabba49e7c7dbbb", "scanner": "scanner-primary", "fingerprint": "76fbc50d30ce8337", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-073f949582dbdf59", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/server/web/schedule/materialize.concurrency.test.ts:278"}, "properties": {"repobilityId": "9b3c42fdcb97e09a", "scanner": "scanner-primary", "fingerprint": "073f949582dbdf59", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-06c354ee94017b8d", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/server/web/directory/filter-options.ts:23"}, "properties": {"repobilityId": "a50dc66089d9f7b1", "scanner": "scanner-primary", "fingerprint": "06c354ee94017b8d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d968b451ef7e73e", "level": "note", "message": {"text": "Legacy-named symbol `notifyAdminOfBblJoinLegacy` in apps/web/server/web/lead/public-actions.ts:11"}, "properties": {"repobilityId": "ffa7548e940a43ec", "scanner": "scanner-primary", "fingerprint": "5d968b451ef7e73e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-50ba79390a11d8d5", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/web/server/web/lineage/payloads.ts:28"}, "properties": {"repobilityId": "bf65710d76afe0f0", "scanner": "scanner-primary", "fingerprint": "50ba79390a11d8d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-05a86f44e229c74e", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/server/web/lineage/queries.test.ts:188"}, "properties": {"repobilityId": "9f092a58d52dab3f", "scanner": "scanner-primary", "fingerprint": "05a86f44e229c74e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8d43718a1f17311c", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/server/web/lineage/queries.ts:70"}, "properties": {"repobilityId": "6a8f81ac5a1c04d0", "scanner": "scanner-primary", "fingerprint": "8d43718a1f17311c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f1aab2c4c3d43478", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/web/server/web/disciplines/top-ranked-queries.ts:1"}, "properties": {"repobilityId": "a145e3ba3545c4bf", "scanner": "scanner-primary", "fingerprint": "f1aab2c4c3d43478", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cfb02ec9c82dbcb3", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/server/web/organization/actions.ts:161"}, "properties": {"repobilityId": "c2ab52c6461ed6f0", "scanner": "scanner-primary", "fingerprint": "cfb02ec9c82dbcb3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fbdd80b99922ea97", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/server/web/merch/printful-actions.ts:6"}, "properties": {"repobilityId": "513ae188b2d3cce6", "scanner": "scanner-primary", "fingerprint": "fbdd80b99922ea97", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cb62ed9802495a53", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/web/services/printful.ts:3"}, "properties": {"repobilityId": "136a4b9a47ed47a6", "scanner": "scanner-primary", "fingerprint": "cb62ed9802495a53", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-44fcb9527b863e1c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/services/printful.ts:8"}, "properties": {"repobilityId": "1ed91c6c86e3ab93", "scanner": "scanner-primary", "fingerprint": "44fcb9527b863e1c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a03bec3de07026d1", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/e2e/lineage/public-visibility.spec.ts:17"}, "properties": {"repobilityId": "6556d819e681b945", "scanner": "scanner-primary", "fingerprint": "a03bec3de07026d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-16d9fd7ea2a385a7", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/e2e/lineage/authenticated-lifecycle.spec.ts:47"}, "properties": {"repobilityId": "15de0cbbc42f42c2", "scanner": "scanner-primary", "fingerprint": "16d9fd7ea2a385a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-467aee4b7a49a72f", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/e2e/lineage/editor-drag-reorder.spec.ts:166"}, "properties": {"repobilityId": "6039ea9fe7219b12", "scanner": "scanner-primary", "fingerprint": "467aee4b7a49a72f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fab9a0c2a05aa171", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/e2e/lineage/public-rank-redaction.spec.ts:36"}, "properties": {"repobilityId": "c8a5f2b6f5b7bca1", "scanner": "scanner-primary", "fingerprint": "fab9a0c2a05aa171", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-01b0fcf8e2bd076c", "level": "note", "message": {"text": "Legacy-named symbol `cs_e2e_unused` in apps/web/e2e/helpers/stripe-checkout-db.ts:42"}, "properties": {"repobilityId": "d57df9d02e6fd596", "scanner": "scanner-primary", "fingerprint": "01b0fcf8e2bd076c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-aa0c8e8d6e627122", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/web/e2e/admin/scoring.spec.ts:22"}, "properties": {"repobilityId": "a4c16ac13ba7d286", "scanner": "scanner-primary", "fingerprint": "aa0c8e8d6e627122", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4b3992d0fd3d1442", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/wiki-lint.ts:496"}, "properties": {"repobilityId": "03ecc1bd18652f4b", "scanner": "scanner-primary", "fingerprint": "4b3992d0fd3d1442", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af022f937dd5b7fd", "level": "note", "message": {"text": "9 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "5597384795dea7a4", "scanner": "scanner-primary", "fingerprint": "af022f937dd5b7fd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}