{"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-8067219e2b8c4908", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-study-plans.ts:61", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-study-plans.ts:61"}, "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-1d4d84340ecdf937", "name": "Stray `console.log` in TS/JS \u2014 scripts/update-co-leaders.ts:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/update-co-leaders.ts:50"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-40e6a85f78846965", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-donations.ts:56", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-donations.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-8c7021ec209f18c6", "name": "Stray `console.log` in TS/JS \u2014 scripts/update-enrollment-results.ts:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/update-enrollment-results.ts:54"}, "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-e98c0da83b53dda7", "name": "Stray `console.log` in TS/JS \u2014 scripts/inspect-grupos.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/inspect-grupos.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-91db37c40fa4ce45", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-test-users.ts:99", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-test-users.ts:99"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a84370ca8a3e7be0", "name": "Stray `console.log` in TS/JS \u2014 scripts/import-grupos.ts:111", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import-grupos.ts:111"}, "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-c0bd571db95aaa0d", "name": "Stray `console.log` in TS/JS \u2014 scripts/update-group-dates.ts:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/update-group-dates.ts:64"}, "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-a8cd6410245b0b9e", "name": "Stray `console.log` in TS/JS \u2014 scripts/update-active-groups.ts:113", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/update-active-groups.ts:113"}, "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-f42a546ce20ea849", "name": "Stray `console.log` in TS/JS \u2014 scripts/import-study-history.ts:88", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import-study-history.ts:88"}, "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-c63afd55ebc67495", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-service-positions.ts:81", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-service-positions.ts: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-faa72385a86e8d41", "name": "Stray `console.log` in TS/JS \u2014 scripts/restore-volunteers.ts:77", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/restore-volunteers.ts:77"}, "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-f4c7bdc22e4256d9", "name": "Stray `console.log` in TS/JS \u2014 scripts/import-members.ts:123", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import-members.ts:123"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-04c46fb438000f45", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-charlas.ts:73", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-charlas.ts:73"}, "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-ea96ec5ab9d8124b", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-event-attendance.ts:84", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-event-attendance.ts:84"}, "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-073d108447bcb2f9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Sidebar.tsx:244", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Sidebar.tsx:244"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e866d38b9eede135", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Topbar.tsx:113", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Topbar.tsx:113"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-87b5643857843915", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/employees/DocumentCard.tsx:36", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/employees/DocumentCard.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-81926ef1569b01b4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/events/EventCard.tsx:74", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/events/EventCard.tsx:74"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-91b976c3bb594ee9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/DirigentesCombobox.tsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/DirigentesCombobox.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-aaa4dc6a56cde053", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/MemberCombobox.tsx:154", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/MemberCombobox.tsx:154"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fc4be39442c87413", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/RequestBoard.tsx:366", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/RequestBoard.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-64b9b7c449a176f3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/studies/LeaderCard.tsx:53", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/studies/LeaderCard.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-77c2d63c1856845b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/members/AdvancedFilters.tsx:148", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/members/AdvancedFilters.tsx:148"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8026a66743a73154", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/members/DuplicateWarning.tsx:33", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/members/DuplicateWarning.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-19bccf60126e4c03", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/forms/ResponseSummaryChart.tsx:40", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/forms/ResponseSummaryChart.tsx:40"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3cb1dda0b52ec6cd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/estudios/solicitudes/page.tsx:152", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/estudios/solicitudes/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-1d8db4ee56206d52", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/estudios/dirigentes/page.tsx:36", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/estudios/dirigentes/page.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-6c1b6d63f9bbebc2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/estudios/dirigentes/[id]/page.tsx:54", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/estudios/dirigentes/[id]/page.tsx:54"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-355f315457dcf1b2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/estudios/grupos/page.tsx:408", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/estudios/grupos/page.tsx:408"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-131099341de643dd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/estudios/plan/[id]/page.tsx:515", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/estudios/plan/[id]/page.tsx:515"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-79db3be5d92ffc4f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/configuracion/page.tsx:279", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/configuracion/page.tsx:279"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-249b881d517d9408", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/configuracion/seguridad/page.tsx:317", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/configuracion/seguridad/page.tsx:317"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4a0470f9f6f2d64a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/page.tsx:218", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/page.tsx:218"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f1b10c08f62863f8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/nuevo/_components/TopBar.tsx:27", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/nuevo/_components/TopBar.tsx:27"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-427ac450a0a8ed9f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/nuevo/_components/StepPersonSearch.tsx:41", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/nuevo/_components/StepPersonSearch.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-936bdb06282b342e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/nuevo/_components/StepDocuments.tsx:161", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/nuevo/_components/StepDocuments.tsx:161"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-44a840d603c606ff", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/puestos/nuevo/page.tsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/puestos/nuevo/page.tsx:94"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-85e3f885768d013a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/puestos/[id]/page.tsx:119", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/puestos/[id]/page.tsx:119"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-febcec0ae56cf164", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/[id]/editar/page.tsx:125", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/[id]/editar/page.tsx:125"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d553c9ecc82feb66", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/dashboard/page.tsx:334", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/dashboard/page.tsx:334"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e1786bf96decce40", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/eventos/page.tsx:328", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/eventos/page.tsx:328"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c6c1ae0bf1ef0876", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/eventos/[id]/checkin/page.tsx:187", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/eventos/[id]/checkin/page.tsx:187"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ab877cd0544288fe", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/eventos/[id]/_components/EventRegistrationsTab.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/eventos/[id]/_components/EventRegistrationsTab.tsx:205"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-59e214e3732bd277", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/eventos/[id]/_components/EventCheckinTab.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/eventos/[id]/_components/EventCheckinTab.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-dfe0decd34969528", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/eventos/[id]/_components/EventServersTab.tsx:158", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/eventos/[id]/_components/EventServersTab.tsx:158"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-693021da15ae6689", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/miembros/page.tsx:721", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/miembros/page.tsx:721"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1751fba3fb200d16", "name": "TODO/FIXME marker in shipping code \u2014 src/app/(admin)/miembros/page.tsx:346", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/(admin)/miembros/page.tsx:346"}, "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-cf06d9fba0a6b347", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/miembros/nuevo/_components/NewMemberStep2.tsx:67", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/miembros/nuevo/_components/NewMemberStep2.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-d1bc087a82ee0796", "name": "TODO/FIXME marker in shipping code \u2014 src/app/(admin)/miembros/[id]/_components/MemberFamilyTab.tsx:53", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/(admin)/miembros/[id]/_components/MemberFamilyTab.tsx:53"}, "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-e064029d34bd2d41", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/miembros/[id]/_components/MemberSummaryTab.tsx:202", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/miembros/[id]/_components/MemberSummaryTab.tsx:202"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-22660f8b8de8ef0f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/miembros/listas/[id]/page.tsx:329", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/miembros/listas/[id]/page.tsx:329"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8a14caa283313600", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/miembros/duplicados/page.tsx:70", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/miembros/duplicados/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-136a82d9234c0372", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/servidores/page.tsx:47", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/servidores/page.tsx:47"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-306cf4f1cd1ab4db", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/servidores/[committeeId]/page.tsx:493", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/servidores/[committeeId]/page.tsx:493"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fedb7ba9bbbfd6e0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/servidores/[committeeId]/_components/MembersTab.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/servidores/[committeeId]/_components/MembersTab.tsx:211"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dd48ce3b96a2b543", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/servidores/admin/page.tsx:858", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/servidores/admin/page.tsx:858"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b481fc1e6c24d85c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/servidores/aplicaciones/page.tsx:284", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/servidores/aplicaciones/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-4cb8140be0cec07b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/accesos/page.tsx:320", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/accesos/page.tsx:320"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-837bbfd7da0a50c6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/comunicaciones/page.tsx:289", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/comunicaciones/page.tsx:289"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cfe3d0fd133fb18c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/comunicaciones/[id]/page.tsx:351", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/comunicaciones/[id]/page.tsx:351"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3ef6534bb134e4a6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/finanzas/page.tsx:268", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/finanzas/page.tsx:268"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b55fa031a135c72c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/finanzas/pagos/page.tsx:315", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/finanzas/pagos/page.tsx:315"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6b8a80c12ebd7bbf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/finanzas/donaciones/page.tsx:285", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/finanzas/donaciones/page.tsx:285"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f2be6abaf3e81adf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/finanzas/becas/page.tsx:226", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/finanzas/becas/page.tsx:226"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-859ae83f8bf55403", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/finanzas/devoluciones/page.tsx:194", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/finanzas/devoluciones/page.tsx:194"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5db811c32f28c266", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/matricula/page.tsx:407", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/matricula/page.tsx:407"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6400c18794574a58", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/formularios/page.tsx:367", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/formularios/page.tsx:367"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-95bb9e797dbd4903", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/formularios/[id]/respuestas/page.tsx:283", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/formularios/[id]/respuestas/page.tsx:283"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-51639e325fd3c03c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/formularios/_components/FormBuilder.tsx:464", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/formularios/_components/FormBuilder.tsx:464"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-698d509409203b40", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/supabase/queries/members.ts:222", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/supabase/queries/members.ts:222"}, "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-627c32a94102037c", "name": "Privileged port 587 in use", "shortDescription": {"text": "Privileged port 587 in use"}, "fullDescription": {"text": "Port 587 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-92cbe386593cac73", "name": "Very large file: src/types/database.ts (3669 lines)", "shortDescription": {"text": "Very large file: src/types/database.ts (3669 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-1272dbb8768916f2", "name": "Very large file: src/lib/supabase/queries/members.ts (1292 lines)", "shortDescription": {"text": "Very large file: src/lib/supabase/queries/members.ts (1292 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": "1 test file(s) for 434 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 114 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 372 placeholder/mock markers across 139 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, tests. 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-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-abb61a801a9c5cd0", "name": "Commented-code block (6 lines) in Theos Place Design System/tweaks-panel.jsx:12", "shortDescription": {"text": "Commented-code block (6 lines) in Theos Place Design System/tweaks-panel.jsx: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-ee50ff50939815c7", "name": "Commented-code block (7 lines) in supabase/functions/process-email-queue/index.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in supabase/functions/process-email-queue/index.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-120cd758ba8e6e55", "name": "Commented-code block (5 lines) in src/types/member.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/types/member.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-578ea727b47548b4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/shared/MemberCombobox.tsx:76", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/shared/MemberCombobox.tsx:76"}, "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-4bbc8ad3b7af33b7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/finance/FinanceRequestActions.tsx:43", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/finance/FinanceRequestActions.tsx:43"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9e7c7c2b9d799972", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/members/FamilyMemberModal.tsx:57", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/members/FamilyMemberModal.tsx:57"}, "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-f4b36cfe0b2fb3ce", "name": "Commented-code block (6 lines) in src/app/api/studies/groups/route.ts:15", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/studies/groups/route.ts:15"}, "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-600397dbe758426b", "name": "Commented-code block (6 lines) in src/app/api/public/events/route.ts:5", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/public/events/route.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cb4cdc94015fdade", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/estudios/analisis/page.tsx:117", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/estudios/analisis/page.tsx:117"}, "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-00ddea1b0b0f87c0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/estudios/grupos/page.tsx:173", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/estudios/grupos/page.tsx:173"}, "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-33d79414a9a68800", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/estudios/grupos/[id]/cierre/page.tsx:110", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/estudios/grupos/[id]/cierre/page.tsx:110"}, "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-5c337850ce60cea9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/estudios/grupos/[id]/asistencia/page.tsx:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/estudios/grupos/[id]/asistencia/page.tsx:27"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d7c9974eb9959400", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/estudios/plan/[id]/page.tsx:245", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/estudios/plan/[id]/page.tsx:245"}, "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-e9110dc5e1ad8727", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/empleados/nuevo/page.tsx:138", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/empleados/nuevo/page.tsx:138"}, "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-6dab508f92a8c48e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/eventos/[id]/checkin/page.tsx:65", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/eventos/[id]/checkin/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-872cd7e09f618584", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/eventos/tipos/page.tsx:241", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/eventos/tipos/page.tsx:241"}, "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-5334772863d855ec", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/miembros/page.tsx:321", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/miembros/page.tsx:321"}, "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-965c30ce3201ca54", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/miembros/nuevo/page.tsx:308", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/miembros/nuevo/page.tsx:308"}, "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-f12e8b579e2f6c0b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/miembros/listas/[id]/page.tsx:114", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/miembros/listas/[id]/page.tsx:114"}, "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-810cc8aa7b1822f4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/servidores/[committeeId]/page.tsx:242", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/servidores/[committeeId]/page.tsx:242"}, "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-11f10b39a00a36f0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/servidores/admin/page.tsx:384", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/servidores/admin/page.tsx:384"}, "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-b822652aad0dd651", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/servidores/aplicaciones/page.tsx:103", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/servidores/aplicaciones/page.tsx:103"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e0018c767cc5857c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/comunicaciones/nueva/page.tsx:144", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/comunicaciones/nueva/page.tsx:144"}, "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-9247968fa93e4a85", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/matricula/confirmacion/page.tsx:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/matricula/confirmacion/page.tsx:35"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-936b51502b330534", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/formularios/_components/FormBuilder.tsx:183", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/formularios/_components/FormBuilder.tsx:183"}, "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-5b1f3ce4651f2a36", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/org.tsx:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/org.tsx:44"}, "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-240f51221c1c83dd", "name": "Commented-code block (5 lines) in src/lib/supabase/queries/members.ts:220", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/supabase/queries/members.ts:220"}, "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-4af3e398a772c3b2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useMembers.ts:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useMembers.ts:33"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cc506397ebaf48fe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useFinance.ts:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useFinance.ts:28"}, "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-4d68ee99c9c69fe4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useEvents.ts:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useEvents.ts:30"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bbbe7899f9b2257f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useAuth.ts:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useAuth.ts:19"}, "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-1b5a76780c3df9aa", "name": "1 env vars used in code but missing from .env.example", "shortDescription": {"text": "1 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `NODE_ENV`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/21140"}, "properties": {"repository": "Theos-Place/theos-admin", "repoUrl": "https://github.com/Theos-Place/theos-admin", "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-8067219e2b8c4908", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-study-plans.ts:61"}, "properties": {"repobilityId": "0a76778cfc649642", "scanner": "scanner-primary", "fingerprint": "8067219e2b8c4908", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1d4d84340ecdf937", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/update-co-leaders.ts:50"}, "properties": {"repobilityId": "dc725fa05a9cd9ea", "scanner": "scanner-primary", "fingerprint": "1d4d84340ecdf937", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-40e6a85f78846965", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-donations.ts:56"}, "properties": {"repobilityId": "513f290f155b3eee", "scanner": "scanner-primary", "fingerprint": "40e6a85f78846965", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8c7021ec209f18c6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/update-enrollment-results.ts:54"}, "properties": {"repobilityId": "ce67db62c40ba3d1", "scanner": "scanner-primary", "fingerprint": "8c7021ec209f18c6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e98c0da83b53dda7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/inspect-grupos.ts:10"}, "properties": {"repobilityId": "3c263bb8f0ddebff", "scanner": "scanner-primary", "fingerprint": "e98c0da83b53dda7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-91db37c40fa4ce45", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-test-users.ts:99"}, "properties": {"repobilityId": "4cc5f022e18c32a2", "scanner": "scanner-primary", "fingerprint": "91db37c40fa4ce45", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a84370ca8a3e7be0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import-grupos.ts:111"}, "properties": {"repobilityId": "9fb21e0de98495d2", "scanner": "scanner-primary", "fingerprint": "a84370ca8a3e7be0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c0bd571db95aaa0d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/update-group-dates.ts:64"}, "properties": {"repobilityId": "dd310d904fe9f365", "scanner": "scanner-primary", "fingerprint": "c0bd571db95aaa0d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a8cd6410245b0b9e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/update-active-groups.ts:113"}, "properties": {"repobilityId": "cabf67ebaaea29aa", "scanner": "scanner-primary", "fingerprint": "a8cd6410245b0b9e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f42a546ce20ea849", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import-study-history.ts:88"}, "properties": {"repobilityId": "17d6deecc9c55b21", "scanner": "scanner-primary", "fingerprint": "f42a546ce20ea849", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c63afd55ebc67495", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-service-positions.ts:81"}, "properties": {"repobilityId": "98a6349603b5c6a5", "scanner": "scanner-primary", "fingerprint": "c63afd55ebc67495", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-faa72385a86e8d41", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/restore-volunteers.ts:77"}, "properties": {"repobilityId": "aff01eda8b930654", "scanner": "scanner-primary", "fingerprint": "faa72385a86e8d41", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f4c7bdc22e4256d9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import-members.ts:123"}, "properties": {"repobilityId": "78612cdb3d35f4ac", "scanner": "scanner-primary", "fingerprint": "f4c7bdc22e4256d9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-04c46fb438000f45", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-charlas.ts:73"}, "properties": {"repobilityId": "beb92cbcb4dd0cec", "scanner": "scanner-primary", "fingerprint": "04c46fb438000f45", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ea96ec5ab9d8124b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-event-attendance.ts:84"}, "properties": {"repobilityId": "8cec29746eeb116e", "scanner": "scanner-primary", "fingerprint": "ea96ec5ab9d8124b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-073d108447bcb2f9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Sidebar.tsx:244"}, "properties": {"repobilityId": "be1152cdf47927a8", "scanner": "scanner-primary", "fingerprint": "073d108447bcb2f9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e866d38b9eede135", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Topbar.tsx:113"}, "properties": {"repobilityId": "32c3331e95ce22bf", "scanner": "scanner-primary", "fingerprint": "e866d38b9eede135", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-87b5643857843915", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/employees/DocumentCard.tsx:36"}, "properties": {"repobilityId": "f48088a6be05e65b", "scanner": "scanner-primary", "fingerprint": "87b5643857843915", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-81926ef1569b01b4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/events/EventCard.tsx:74"}, "properties": {"repobilityId": "c47636d64ce0a1a4", "scanner": "scanner-primary", "fingerprint": "81926ef1569b01b4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-91b976c3bb594ee9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/DirigentesCombobox.tsx:123"}, "properties": {"repobilityId": "2fa26014ce9cac4e", "scanner": "scanner-primary", "fingerprint": "91b976c3bb594ee9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aaa4dc6a56cde053", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/MemberCombobox.tsx:154"}, "properties": {"repobilityId": "f36b20b07c9ea555", "scanner": "scanner-primary", "fingerprint": "aaa4dc6a56cde053", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fc4be39442c87413", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/shared/RequestBoard.tsx:366"}, "properties": {"repobilityId": "6fb566cf7cf2aa92", "scanner": "scanner-primary", "fingerprint": "fc4be39442c87413", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-64b9b7c449a176f3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/studies/LeaderCard.tsx:53"}, "properties": {"repobilityId": "ea6fd963d7ec7be4", "scanner": "scanner-primary", "fingerprint": "64b9b7c449a176f3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-77c2d63c1856845b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/members/AdvancedFilters.tsx:148"}, "properties": {"repobilityId": "dc46cedd23aff0bb", "scanner": "scanner-primary", "fingerprint": "77c2d63c1856845b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8026a66743a73154", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/members/DuplicateWarning.tsx:33"}, "properties": {"repobilityId": "99887553898365b1", "scanner": "scanner-primary", "fingerprint": "8026a66743a73154", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-19bccf60126e4c03", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/forms/ResponseSummaryChart.tsx:40"}, "properties": {"repobilityId": "51ae6036e0eeb60a", "scanner": "scanner-primary", "fingerprint": "19bccf60126e4c03", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3cb1dda0b52ec6cd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/estudios/solicitudes/page.tsx:152"}, "properties": {"repobilityId": "0de800fc3d27aa64", "scanner": "scanner-primary", "fingerprint": "3cb1dda0b52ec6cd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1d8db4ee56206d52", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/estudios/dirigentes/page.tsx:36"}, "properties": {"repobilityId": "082130b72f51caa2", "scanner": "scanner-primary", "fingerprint": "1d8db4ee56206d52", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6c1b6d63f9bbebc2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/estudios/dirigentes/[id]/page.tsx:54"}, "properties": {"repobilityId": "b4ddf49e33bbccf7", "scanner": "scanner-primary", "fingerprint": "6c1b6d63f9bbebc2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-355f315457dcf1b2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/estudios/grupos/page.tsx:408"}, "properties": {"repobilityId": "230c30b5efaa3908", "scanner": "scanner-primary", "fingerprint": "355f315457dcf1b2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-131099341de643dd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/estudios/plan/[id]/page.tsx:515"}, "properties": {"repobilityId": "5f1f7926a5594037", "scanner": "scanner-primary", "fingerprint": "131099341de643dd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-79db3be5d92ffc4f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/configuracion/page.tsx:279"}, "properties": {"repobilityId": "a3d0f4b62743098e", "scanner": "scanner-primary", "fingerprint": "79db3be5d92ffc4f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-249b881d517d9408", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/configuracion/seguridad/page.tsx:317"}, "properties": {"repobilityId": "c5c4977f00dfbea4", "scanner": "scanner-primary", "fingerprint": "249b881d517d9408", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4a0470f9f6f2d64a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/page.tsx:218"}, "properties": {"repobilityId": "9dda94f6d9973129", "scanner": "scanner-primary", "fingerprint": "4a0470f9f6f2d64a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f1b10c08f62863f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/nuevo/_components/TopBar.tsx:27"}, "properties": {"repobilityId": "675e02819832da98", "scanner": "scanner-primary", "fingerprint": "f1b10c08f62863f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-427ac450a0a8ed9f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/nuevo/_components/StepPersonSearch.tsx:41"}, "properties": {"repobilityId": "e8afabb0af9142e9", "scanner": "scanner-primary", "fingerprint": "427ac450a0a8ed9f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-936bdb06282b342e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/nuevo/_components/StepDocuments.tsx:161"}, "properties": {"repobilityId": "75551bdcf1813d40", "scanner": "scanner-primary", "fingerprint": "936bdb06282b342e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-44a840d603c606ff", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/puestos/nuevo/page.tsx:94"}, "properties": {"repobilityId": "e82a63487ce9c55f", "scanner": "scanner-primary", "fingerprint": "44a840d603c606ff", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-85e3f885768d013a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/puestos/[id]/page.tsx:119"}, "properties": {"repobilityId": "a3ead5925383efa7", "scanner": "scanner-primary", "fingerprint": "85e3f885768d013a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-febcec0ae56cf164", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/empleados/[id]/editar/page.tsx:125"}, "properties": {"repobilityId": "5c62520a4052f436", "scanner": "scanner-primary", "fingerprint": "febcec0ae56cf164", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d553c9ecc82feb66", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/dashboard/page.tsx:334"}, "properties": {"repobilityId": "52480eda49a27ed2", "scanner": "scanner-primary", "fingerprint": "d553c9ecc82feb66", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e1786bf96decce40", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/eventos/page.tsx:328"}, "properties": {"repobilityId": "a14771b5b4c50760", "scanner": "scanner-primary", "fingerprint": "e1786bf96decce40", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c6c1ae0bf1ef0876", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/eventos/[id]/checkin/page.tsx:187"}, "properties": {"repobilityId": "ffed30f9d60e2f98", "scanner": "scanner-primary", "fingerprint": "c6c1ae0bf1ef0876", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ab877cd0544288fe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/eventos/[id]/_components/EventRegistrationsTab.tsx:205"}, "properties": {"repobilityId": "eb3141429eed423d", "scanner": "scanner-primary", "fingerprint": "ab877cd0544288fe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-59e214e3732bd277", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/eventos/[id]/_components/EventCheckinTab.tsx:68"}, "properties": {"repobilityId": "a929280dae978487", "scanner": "scanner-primary", "fingerprint": "59e214e3732bd277", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dfe0decd34969528", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/eventos/[id]/_components/EventServersTab.tsx:158"}, "properties": {"repobilityId": "7e2016d8fdf89ce9", "scanner": "scanner-primary", "fingerprint": "dfe0decd34969528", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-693021da15ae6689", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/miembros/page.tsx:721"}, "properties": {"repobilityId": "25179721e3b9320a", "scanner": "scanner-primary", "fingerprint": "693021da15ae6689", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1751fba3fb200d16", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/(admin)/miembros/page.tsx:346"}, "properties": {"repobilityId": "719ab8acca52fe26", "scanner": "scanner-primary", "fingerprint": "1751fba3fb200d16", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-cf06d9fba0a6b347", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/miembros/nuevo/_components/NewMemberStep2.tsx:67"}, "properties": {"repobilityId": "c29956886672e6e2", "scanner": "scanner-primary", "fingerprint": "cf06d9fba0a6b347", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d1bc087a82ee0796", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/(admin)/miembros/[id]/_components/MemberFamilyTab.tsx:53"}, "properties": {"repobilityId": "1df8db901d4a04a1", "scanner": "scanner-primary", "fingerprint": "d1bc087a82ee0796", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-e064029d34bd2d41", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/miembros/[id]/_components/MemberSummaryTab.tsx:202"}, "properties": {"repobilityId": "0aa8e559dd3768f2", "scanner": "scanner-primary", "fingerprint": "e064029d34bd2d41", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-22660f8b8de8ef0f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/miembros/listas/[id]/page.tsx:329"}, "properties": {"repobilityId": "dc66b8e6dc5fa31a", "scanner": "scanner-primary", "fingerprint": "22660f8b8de8ef0f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8a14caa283313600", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/miembros/duplicados/page.tsx:70"}, "properties": {"repobilityId": "50943eb27598f545", "scanner": "scanner-primary", "fingerprint": "8a14caa283313600", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-136a82d9234c0372", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/servidores/page.tsx:47"}, "properties": {"repobilityId": "3a9796320ee691ef", "scanner": "scanner-primary", "fingerprint": "136a82d9234c0372", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-306cf4f1cd1ab4db", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/servidores/[committeeId]/page.tsx:493"}, "properties": {"repobilityId": "b1a8a714011168b6", "scanner": "scanner-primary", "fingerprint": "306cf4f1cd1ab4db", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fedb7ba9bbbfd6e0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/servidores/[committeeId]/_components/MembersTab.tsx:211"}, "properties": {"repobilityId": "3741accfb1599d52", "scanner": "scanner-primary", "fingerprint": "fedb7ba9bbbfd6e0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dd48ce3b96a2b543", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/servidores/admin/page.tsx:858"}, "properties": {"repobilityId": "ff67b2efdd2f6669", "scanner": "scanner-primary", "fingerprint": "dd48ce3b96a2b543", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b481fc1e6c24d85c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/servidores/aplicaciones/page.tsx:284"}, "properties": {"repobilityId": "f0c64470d2f08679", "scanner": "scanner-primary", "fingerprint": "b481fc1e6c24d85c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4cb8140be0cec07b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/accesos/page.tsx:320"}, "properties": {"repobilityId": "42fcd2fd2caa80a2", "scanner": "scanner-primary", "fingerprint": "4cb8140be0cec07b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-837bbfd7da0a50c6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/comunicaciones/page.tsx:289"}, "properties": {"repobilityId": "52172e3a62abd23b", "scanner": "scanner-primary", "fingerprint": "837bbfd7da0a50c6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cfe3d0fd133fb18c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/comunicaciones/[id]/page.tsx:351"}, "properties": {"repobilityId": "f79cde8843ec80f5", "scanner": "scanner-primary", "fingerprint": "cfe3d0fd133fb18c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3ef6534bb134e4a6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/finanzas/page.tsx:268"}, "properties": {"repobilityId": "f08d7d473b4e35b6", "scanner": "scanner-primary", "fingerprint": "3ef6534bb134e4a6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b55fa031a135c72c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/finanzas/pagos/page.tsx:315"}, "properties": {"repobilityId": "06b1769de3617211", "scanner": "scanner-primary", "fingerprint": "b55fa031a135c72c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6b8a80c12ebd7bbf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/finanzas/donaciones/page.tsx:285"}, "properties": {"repobilityId": "3111fbc859a02951", "scanner": "scanner-primary", "fingerprint": "6b8a80c12ebd7bbf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f2be6abaf3e81adf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/finanzas/becas/page.tsx:226"}, "properties": {"repobilityId": "fa2ac17486e88050", "scanner": "scanner-primary", "fingerprint": "f2be6abaf3e81adf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-859ae83f8bf55403", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/finanzas/devoluciones/page.tsx:194"}, "properties": {"repobilityId": "b11b54e125327d6e", "scanner": "scanner-primary", "fingerprint": "859ae83f8bf55403", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5db811c32f28c266", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/matricula/page.tsx:407"}, "properties": {"repobilityId": "845884d869361b7b", "scanner": "scanner-primary", "fingerprint": "5db811c32f28c266", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6400c18794574a58", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/formularios/page.tsx:367"}, "properties": {"repobilityId": "602200c98b399217", "scanner": "scanner-primary", "fingerprint": "6400c18794574a58", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-95bb9e797dbd4903", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/formularios/[id]/respuestas/page.tsx:283"}, "properties": {"repobilityId": "a04dbc90e5a6e282", "scanner": "scanner-primary", "fingerprint": "95bb9e797dbd4903", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-51639e325fd3c03c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/(admin)/formularios/_components/FormBuilder.tsx:464"}, "properties": {"repobilityId": "5e0f994c316ccc22", "scanner": "scanner-primary", "fingerprint": "51639e325fd3c03c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-698d509409203b40", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/supabase/queries/members.ts:222"}, "properties": {"repobilityId": "6a1398290371bbd6", "scanner": "scanner-primary", "fingerprint": "698d509409203b40", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-627c32a94102037c", "level": "warning", "message": {"text": "Privileged port 587 in use"}, "properties": {"repobilityId": "a87a96c3b2e62c08", "scanner": "scanner-primary", "fingerprint": "627c32a94102037c", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/(admin)/comunicaciones/configuracion/page.tsx"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-92cbe386593cac73", "level": "note", "message": {"text": "Very large file: src/types/database.ts (3669 lines)"}, "properties": {"repobilityId": "a3b95ecee12e4f2c", "scanner": "scanner-primary", "fingerprint": "92cbe386593cac73", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1272dbb8768916f2", "level": "note", "message": {"text": "Very large file: src/lib/supabase/queries/members.ts (1292 lines)"}, "properties": {"repobilityId": "5153dff83635701b", "scanner": "scanner-primary", "fingerprint": "1272dbb8768916f2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "469109ce7fe0a724", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "c5565774fa41a860", "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": "540994503976997b", "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": "27d8d30c83543fcc", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "6189413c054c5a52", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "4edc8f9412957df0", "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": "c598940557946fba", "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": "a7c860b30fb992c6", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-abb61a801a9c5cd0", "level": "none", "message": {"text": "Commented-code block (6 lines) in Theos Place Design System/tweaks-panel.jsx:12"}, "properties": {"repobilityId": "44ca5e9772736145", "scanner": "scanner-primary", "fingerprint": "abb61a801a9c5cd0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ee50ff50939815c7", "level": "none", "message": {"text": "Commented-code block (7 lines) in supabase/functions/process-email-queue/index.ts:1"}, "properties": {"repobilityId": "a3768ca5f0143c77", "scanner": "scanner-primary", "fingerprint": "ee50ff50939815c7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-120cd758ba8e6e55", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/types/member.ts:1"}, "properties": {"repobilityId": "9282711abc7662d6", "scanner": "scanner-primary", "fingerprint": "120cd758ba8e6e55", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-578ea727b47548b4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/shared/MemberCombobox.tsx:76"}, "properties": {"repobilityId": "037069413c65b5e7", "scanner": "scanner-primary", "fingerprint": "578ea727b47548b4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4bbc8ad3b7af33b7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/finance/FinanceRequestActions.tsx:43"}, "properties": {"repobilityId": "530d9ef332ef56c7", "scanner": "scanner-primary", "fingerprint": "4bbc8ad3b7af33b7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9e7c7c2b9d799972", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/members/FamilyMemberModal.tsx:57"}, "properties": {"repobilityId": "0384904f21a0ac3d", "scanner": "scanner-primary", "fingerprint": "9e7c7c2b9d799972", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f4b36cfe0b2fb3ce", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/studies/groups/route.ts:15"}, "properties": {"repobilityId": "cd37e5876e6325a1", "scanner": "scanner-primary", "fingerprint": "f4b36cfe0b2fb3ce", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-600397dbe758426b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/public/events/route.ts:5"}, "properties": {"repobilityId": "13564c7b75f4e55e", "scanner": "scanner-primary", "fingerprint": "600397dbe758426b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cb4cdc94015fdade", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/estudios/analisis/page.tsx:117"}, "properties": {"repobilityId": "606788c7577275a2", "scanner": "scanner-primary", "fingerprint": "cb4cdc94015fdade", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-00ddea1b0b0f87c0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/estudios/grupos/page.tsx:173"}, "properties": {"repobilityId": "9f72ba74df843c97", "scanner": "scanner-primary", "fingerprint": "00ddea1b0b0f87c0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-33d79414a9a68800", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/estudios/grupos/[id]/cierre/page.tsx:110"}, "properties": {"repobilityId": "3ef71aebdd8a5b03", "scanner": "scanner-primary", "fingerprint": "33d79414a9a68800", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5c337850ce60cea9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/estudios/grupos/[id]/asistencia/page.tsx:27"}, "properties": {"repobilityId": "a148eb94884a9369", "scanner": "scanner-primary", "fingerprint": "5c337850ce60cea9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d7c9974eb9959400", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/estudios/plan/[id]/page.tsx:245"}, "properties": {"repobilityId": "f88dbc3b4c372af3", "scanner": "scanner-primary", "fingerprint": "d7c9974eb9959400", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e9110dc5e1ad8727", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/empleados/nuevo/page.tsx:138"}, "properties": {"repobilityId": "26717a284cfdeb76", "scanner": "scanner-primary", "fingerprint": "e9110dc5e1ad8727", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6dab508f92a8c48e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/eventos/[id]/checkin/page.tsx:65"}, "properties": {"repobilityId": "dcccf2f4a8862545", "scanner": "scanner-primary", "fingerprint": "6dab508f92a8c48e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-872cd7e09f618584", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/eventos/tipos/page.tsx:241"}, "properties": {"repobilityId": "270b2a0431d5043e", "scanner": "scanner-primary", "fingerprint": "872cd7e09f618584", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5334772863d855ec", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/miembros/page.tsx:321"}, "properties": {"repobilityId": "d38b9bec51e965c0", "scanner": "scanner-primary", "fingerprint": "5334772863d855ec", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-965c30ce3201ca54", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/miembros/nuevo/page.tsx:308"}, "properties": {"repobilityId": "67af323a58c2dd65", "scanner": "scanner-primary", "fingerprint": "965c30ce3201ca54", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f12e8b579e2f6c0b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/miembros/listas/[id]/page.tsx:114"}, "properties": {"repobilityId": "d6679a9227064d44", "scanner": "scanner-primary", "fingerprint": "f12e8b579e2f6c0b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-810cc8aa7b1822f4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/servidores/[committeeId]/page.tsx:242"}, "properties": {"repobilityId": "0e4599cbbf302e6a", "scanner": "scanner-primary", "fingerprint": "810cc8aa7b1822f4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-11f10b39a00a36f0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/servidores/admin/page.tsx:384"}, "properties": {"repobilityId": "8417062accc6ce20", "scanner": "scanner-primary", "fingerprint": "11f10b39a00a36f0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b822652aad0dd651", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/servidores/aplicaciones/page.tsx:103"}, "properties": {"repobilityId": "4da4591504de1bb9", "scanner": "scanner-primary", "fingerprint": "b822652aad0dd651", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e0018c767cc5857c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/comunicaciones/nueva/page.tsx:144"}, "properties": {"repobilityId": "8fbe6e0965d46da7", "scanner": "scanner-primary", "fingerprint": "e0018c767cc5857c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9247968fa93e4a85", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/matricula/confirmacion/page.tsx:35"}, "properties": {"repobilityId": "da877be7b45fc408", "scanner": "scanner-primary", "fingerprint": "9247968fa93e4a85", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-936b51502b330534", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/(admin)/formularios/_components/FormBuilder.tsx:183"}, "properties": {"repobilityId": "afa9959b39bc41c8", "scanner": "scanner-primary", "fingerprint": "936b51502b330534", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5b1f3ce4651f2a36", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/org.tsx:44"}, "properties": {"repobilityId": "cf70fd7454091f20", "scanner": "scanner-primary", "fingerprint": "5b1f3ce4651f2a36", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-240f51221c1c83dd", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/supabase/queries/members.ts:220"}, "properties": {"repobilityId": "1b04e113f1796a9f", "scanner": "scanner-primary", "fingerprint": "240f51221c1c83dd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4af3e398a772c3b2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useMembers.ts:33"}, "properties": {"repobilityId": "eca48792400212a8", "scanner": "scanner-primary", "fingerprint": "4af3e398a772c3b2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cc506397ebaf48fe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useFinance.ts:28"}, "properties": {"repobilityId": "bbfec00fbfb37745", "scanner": "scanner-primary", "fingerprint": "cc506397ebaf48fe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4d68ee99c9c69fe4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useEvents.ts:30"}, "properties": {"repobilityId": "13bebc7f65ed8d21", "scanner": "scanner-primary", "fingerprint": "4d68ee99c9c69fe4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bbbe7899f9b2257f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useAuth.ts:19"}, "properties": {"repobilityId": "f218851ac754cc15", "scanner": "scanner-primary", "fingerprint": "bbbe7899f9b2257f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1b5a76780c3df9aa", "level": "none", "message": {"text": "1 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d04379b337b44a15", "scanner": "scanner-primary", "fingerprint": "1b5a76780c3df9aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}