{"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-8d9e07270a17dca3", "name": "Stray `console.log` in TS/JS \u2014 scripts/reconcile-founding.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reconcile-founding.ts:31"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c2118315f7f2b85d", "name": "Stray `console.log` in TS/JS \u2014 scripts/relance-prereg.ts:103", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/relance-prereg.ts:103"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ff48abad5c560f08", "name": "Stray `console.log` in TS/JS \u2014 scripts/fix-short-handles.ts:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-short-handles.ts:62"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-66a4710f21c9fd91", "name": "Stray `console.log` in TS/JS \u2014 scripts/delete-demo-users.ts:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/delete-demo-users.ts:29"}, "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-7fb8b131d230a775", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-recent-signups.ts:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-recent-signups.ts:46"}, "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-545d770891b2a34f", "name": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-auto-handles.ts:65", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-auto-handles.ts:65"}, "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-20b61be7628a40f0", "name": "Stray `console.log` in TS/JS \u2014 scripts/restore-2027-sessions.ts:59", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/restore-2027-sessions.ts:59"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2ddc5169f442d350", "name": "Stray `console.log` in TS/JS \u2014 scripts/send-profile-reminders.ts:105", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/send-profile-reminders.ts:105"}, "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-88091df38d3d8a9c", "name": "Stray `console.log` in TS/JS \u2014 scripts/send-completion-invite.ts:149", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/send-completion-invite.ts:149"}, "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-c615597f6501b933", "name": "Stray `console.log` in TS/JS \u2014 scripts/backup-db.ts:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backup-db.ts:53"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-249a9522d5a4a134", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-demo-results.ts:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-demo-results.ts:46"}, "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-2f61e7b30c2a7f30", "name": "TODO/FIXME marker in shipping code \u2014 src/app/api/stripe/webhook/route.ts:72", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/stripe/webhook/route.ts:72"}, "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-2a2015c870c3d278", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/page.tsx:716", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/page.tsx:716"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ad8e184cd75f1da3", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/page.tsx:247", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/page.tsx:247"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-55c01cea5db6a364", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(admin)/admin/messages/page.tsx:135", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(admin)/admin/messages/page.tsx:135"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7972224acc9051fe", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(admin)/admin/messages/[id]/page.tsx:52", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(admin)/admin/messages/[id]/page.tsx:52"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5b75a21348114611", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(admin)/admin/activity/page.tsx:153", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(admin)/admin/activity/page.tsx:153"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f6b24421744805eb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(admin)/admin/pre-registrations/page.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(admin)/admin/pre-registrations/page.tsx:95"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f378a08370aca1f9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(admin)/admin/announcements/page.tsx:75", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(admin)/admin/announcements/page.tsx:75"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6b5c6324e9c3fa44", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(public)/photographers/page.tsx:445", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(public)/photographers/page.tsx:445"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1c44f6b8fbc3db75", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/photographers/page.tsx:246", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/photographers/page.tsx:246"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3c52077045aead9c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(public)/photographers/[handle]/ProfileGallery.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(public)/photographers/[handle]/ProfileGallery.tsx:127"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-833140750dfa44a1", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/photographers/[handle]/page.tsx:498", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/photographers/[handle]/page.tsx:498"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d8b3a991b4453e69", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/workshops/page.tsx:70", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/workshops/page.tsx:70"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a3630c2e96932b53", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/workshops/[slug]/page.tsx:124", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/workshops/[slug]/page.tsx:124"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-26e49928a98f9ca8", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/magazine/[slug]/page.tsx:59", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/magazine/[slug]/page.tsx:59"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4f242ec478ca178e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/faq/page.tsx:63", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/faq/page.tsx:63"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-82f27a05e1b06a86", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/founder/page.tsx:72", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/founder/page.tsx:72"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4b4ef644e9be6262", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/calendar/page.tsx:114", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/calendar/page.tsx:114"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-17bfea22db2a8217", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/winners/page.tsx:179", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/winners/page.tsx:179"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1c3696d9b9902efe", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(public)/winners/WinnersGallery.tsx:203", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(public)/winners/WinnersGallery.tsx:203"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a339feddc35b905e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(public)/winners/[sessionId]/page.tsx:362", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(public)/winners/[sessionId]/page.tsx:362"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9ca6b747fdbda3b4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/winners/[sessionId]/page.tsx:177", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/winners/[sessionId]/page.tsx:177"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-61f845abc4304a65", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(member)/dashboard/page.tsx:529", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(member)/dashboard/page.tsx:529"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e7881fea6538875a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(member)/dashboard/workshops/page.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(member)/dashboard/workshops/page.tsx:112"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5beb44c5bf8b00ef", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(member)/dashboard/messages/page.tsx:119", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(member)/dashboard/messages/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-914ac897b0598dad", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(member)/submissions/page.tsx:301", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(member)/submissions/page.tsx:301"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dd11070559738f13", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(member)/profile/page.tsx:159", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(member)/profile/page.tsx:159"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a2935db0a93ddccb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(member)/ambassador/page.tsx:132", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(member)/ambassador/page.tsx:132"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9bae069189124632", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(jury)/review/session/[sessionId]/page.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(jury)/review/session/[sessionId]/page.tsx:71"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a3e3e412fa39cea7", "name": "Stray `console.log` in TS/JS \u2014 src/server/actions/unsubscribe.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/server/actions/unsubscribe.ts:39"}, "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-cbe3d0062db05e81", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/keen/JuryCurationBoard.tsx:484", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/keen/JuryCurationBoard.tsx:484"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-184b4145cbd86a43", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/keen/AppUserAvatar.tsx:81", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/keen/AppUserAvatar.tsx:81"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4064f9dacf982e6b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/keen/WorldMapInteractive.tsx:188", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/keen/WorldMapInteractive.tsx:188"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f7d5baa70c457e64", "name": "Icon-only button without accessible name \u2014 src/components/keen/WorkshopSessionManager.tsx:249", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/keen/WorkshopSessionManager.tsx:249"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b62b38d48274f052", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/keen/SearchOverlay.tsx:192", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/keen/SearchOverlay.tsx:192"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-096d73f745a4dd6d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/keen/PortfolioManager.tsx:287", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/keen/PortfolioManager.tsx:287"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-827222ce385280ea", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed-demo.ts:301", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-demo.ts:301"}, "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-8d840869b8685de9", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed.ts:113", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed.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-e962d1fb505b440b", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/page.tsx:247", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/page.tsx:247"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8d30e555fc8a0abb", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/photographers/page.tsx:246", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/photographers/page.tsx:246"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-018e57e3e72cca21", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/photographers/[handle]/page.tsx:498", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/photographers/[handle]/page.tsx:498"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f5316cd1d204ea68", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/workshops/page.tsx:70", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/workshops/page.tsx:70"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0e80aaa7e310c385", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/workshops/[slug]/page.tsx:124", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/workshops/[slug]/page.tsx:124"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-48479a58b9753e85", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/magazine/[slug]/page.tsx:59", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/magazine/[slug]/page.tsx:59"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8893de3d2ee745d0", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/faq/page.tsx:63", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/faq/page.tsx:63"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-604086882ed72579", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/founder/page.tsx:72", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/founder/page.tsx:72"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-098b322069d1454d", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/calendar/page.tsx:114", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/calendar/page.tsx:114"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-384e0e1785369a9b", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/winners/page.tsx:179", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/winners/page.tsx:179"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1bd8de2b508dda2e", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/winners/[sessionId]/page.tsx:177", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/winners/[sessionId]/page.tsx:177"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a8b0a8470e1b6de1", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-690c1aab51b312cd", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb639d9a10a47b23", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-23cba0afddeca6ea", "name": "Very large file: src/app/[locale]/page.tsx (1386 lines)", "shortDescription": {"text": "Very large file: src/app/[locale]/page.tsx (1386 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": "14 test file(s) for 305 source file(s) (ratio 0.05). 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 91 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 61 placeholder/mock markers across 25 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. 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-10bf6d094a1fedfa", "name": "Commented-code block (6 lines) in next.config.ts:19", "shortDescription": {"text": "Commented-code block (6 lines) in next.config.ts:19"}, "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-3fb65eb4069a4f1c", "name": "Commented-code block (7 lines) in src/middleware.ts:35", "shortDescription": {"text": "Commented-code block (7 lines) in src/middleware.ts:35"}, "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-705c995ea68565f7", "name": "Commented-code block (6 lines) in src/app/api/stripe/webhook/route.ts:72", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/stripe/webhook/route.ts:72"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c021e6886ed2cd89", "name": "Commented-code block (5 lines) in src/app/api/og/trophy/route.tsx:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/og/trophy/route.tsx:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9daf3b6f2dff8378", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/badges/founding-member/[number]/route.tsx:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/badges/founding-member/[number]/route.tsx:11"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b24c1852d1ac6a1d", "name": "Commented-code block (6 lines) in src/app/[locale]/(public)/calendar/page.tsx:354", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/[locale]/(public)/calendar/page.tsx:354"}, "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-8e879acb057565e2", "name": "Commented-code block (7 lines) in src/app/auth/callback/route.ts:59", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/auth/callback/route.ts:59"}, "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-9292bfbeda9020ef", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/actions/translate.ts:57", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/actions/translate.ts: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-5204d7f0242d9838", "name": "Commented-code block (7 lines) in src/server/actions/profile-wizard.ts:168", "shortDescription": {"text": "Commented-code block (7 lines) in src/server/actions/profile-wizard.ts:168"}, "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-c6f7a2ee8918e098", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/keen/SearchOverlay.tsx:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/keen/SearchOverlay.tsx:68"}, "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: `NEXT_RUNTIME`. 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/24311"}, "properties": {"repository": "arnaudchapelle/kissmefortytimes", "repoUrl": "https://github.com/arnaudchapelle/kissmefortytimes", "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-8d9e07270a17dca3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reconcile-founding.ts:31"}, "properties": {"repobilityId": "aec490297ef50b65", "scanner": "scanner-primary", "fingerprint": "8d9e07270a17dca3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c2118315f7f2b85d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/relance-prereg.ts:103"}, "properties": {"repobilityId": "6c714709721a145a", "scanner": "scanner-primary", "fingerprint": "c2118315f7f2b85d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ff48abad5c560f08", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-short-handles.ts:62"}, "properties": {"repobilityId": "c9f85d4785c9c9e1", "scanner": "scanner-primary", "fingerprint": "ff48abad5c560f08", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-66a4710f21c9fd91", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/delete-demo-users.ts:29"}, "properties": {"repobilityId": "b981085fafde895c", "scanner": "scanner-primary", "fingerprint": "66a4710f21c9fd91", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7fb8b131d230a775", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-recent-signups.ts:46"}, "properties": {"repobilityId": "c6ff2a2960213e17", "scanner": "scanner-primary", "fingerprint": "7fb8b131d230a775", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-545d770891b2a34f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-auto-handles.ts:65"}, "properties": {"repobilityId": "fe4420fc0c163b41", "scanner": "scanner-primary", "fingerprint": "545d770891b2a34f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-20b61be7628a40f0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/restore-2027-sessions.ts:59"}, "properties": {"repobilityId": "47a824d8633d2328", "scanner": "scanner-primary", "fingerprint": "20b61be7628a40f0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2ddc5169f442d350", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/send-profile-reminders.ts:105"}, "properties": {"repobilityId": "b4e7d530c5f481b1", "scanner": "scanner-primary", "fingerprint": "2ddc5169f442d350", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-88091df38d3d8a9c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/send-completion-invite.ts:149"}, "properties": {"repobilityId": "1132929e2fd3a21a", "scanner": "scanner-primary", "fingerprint": "88091df38d3d8a9c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c615597f6501b933", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backup-db.ts:53"}, "properties": {"repobilityId": "8db6820cf395eec7", "scanner": "scanner-primary", "fingerprint": "c615597f6501b933", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-249a9522d5a4a134", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-demo-results.ts:46"}, "properties": {"repobilityId": "2889ace383b5c10d", "scanner": "scanner-primary", "fingerprint": "249a9522d5a4a134", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2f61e7b30c2a7f30", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/stripe/webhook/route.ts:72"}, "properties": {"repobilityId": "f1ea72adc6e14d5c", "scanner": "scanner-primary", "fingerprint": "2f61e7b30c2a7f30", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-2a2015c870c3d278", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/page.tsx:716"}, "properties": {"repobilityId": "e4f964d228f425a5", "scanner": "scanner-primary", "fingerprint": "2a2015c870c3d278", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ad8e184cd75f1da3", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/page.tsx:247"}, "properties": {"repobilityId": "e4c68e30127bf9a9", "scanner": "scanner-primary", "fingerprint": "ad8e184cd75f1da3", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-55c01cea5db6a364", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(admin)/admin/messages/page.tsx:135"}, "properties": {"repobilityId": "0892d0d1c22ceae6", "scanner": "scanner-primary", "fingerprint": "55c01cea5db6a364", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7972224acc9051fe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(admin)/admin/messages/[id]/page.tsx:52"}, "properties": {"repobilityId": "b7858d235ff45730", "scanner": "scanner-primary", "fingerprint": "7972224acc9051fe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5b75a21348114611", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(admin)/admin/activity/page.tsx:153"}, "properties": {"repobilityId": "6b6aecec06056a0e", "scanner": "scanner-primary", "fingerprint": "5b75a21348114611", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f6b24421744805eb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(admin)/admin/pre-registrations/page.tsx:95"}, "properties": {"repobilityId": "3eb2ac99f4f84956", "scanner": "scanner-primary", "fingerprint": "f6b24421744805eb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f378a08370aca1f9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(admin)/admin/announcements/page.tsx:75"}, "properties": {"repobilityId": "08033390874f7676", "scanner": "scanner-primary", "fingerprint": "f378a08370aca1f9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6b5c6324e9c3fa44", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(public)/photographers/page.tsx:445"}, "properties": {"repobilityId": "73ea7cfed5362333", "scanner": "scanner-primary", "fingerprint": "6b5c6324e9c3fa44", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c44f6b8fbc3db75", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/photographers/page.tsx:246"}, "properties": {"repobilityId": "c6ffb827414204ba", "scanner": "scanner-primary", "fingerprint": "1c44f6b8fbc3db75", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-3c52077045aead9c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(public)/photographers/[handle]/ProfileGallery.tsx:127"}, "properties": {"repobilityId": "ed9e32eeb167931b", "scanner": "scanner-primary", "fingerprint": "3c52077045aead9c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-833140750dfa44a1", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/photographers/[handle]/page.tsx:498"}, "properties": {"repobilityId": "88528b80bbd5db4b", "scanner": "scanner-primary", "fingerprint": "833140750dfa44a1", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-d8b3a991b4453e69", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/workshops/page.tsx:70"}, "properties": {"repobilityId": "2a750bc2c2174b35", "scanner": "scanner-primary", "fingerprint": "d8b3a991b4453e69", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a3630c2e96932b53", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/workshops/[slug]/page.tsx:124"}, "properties": {"repobilityId": "585f54b356e08eff", "scanner": "scanner-primary", "fingerprint": "a3630c2e96932b53", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-26e49928a98f9ca8", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/magazine/[slug]/page.tsx:59"}, "properties": {"repobilityId": "05ddc9f82c92bfe1", "scanner": "scanner-primary", "fingerprint": "26e49928a98f9ca8", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4f242ec478ca178e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/faq/page.tsx:63"}, "properties": {"repobilityId": "ec56b2c5baf9b50a", "scanner": "scanner-primary", "fingerprint": "4f242ec478ca178e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-82f27a05e1b06a86", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/founder/page.tsx:72"}, "properties": {"repobilityId": "80791f37d2ee383c", "scanner": "scanner-primary", "fingerprint": "82f27a05e1b06a86", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4b4ef644e9be6262", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/calendar/page.tsx:114"}, "properties": {"repobilityId": "d2fd5980ffa7969e", "scanner": "scanner-primary", "fingerprint": "4b4ef644e9be6262", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-17bfea22db2a8217", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/winners/page.tsx:179"}, "properties": {"repobilityId": "c65330cf4674fdcb", "scanner": "scanner-primary", "fingerprint": "17bfea22db2a8217", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1c3696d9b9902efe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(public)/winners/WinnersGallery.tsx:203"}, "properties": {"repobilityId": "f217fcd00de1936e", "scanner": "scanner-primary", "fingerprint": "1c3696d9b9902efe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a339feddc35b905e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(public)/winners/[sessionId]/page.tsx:362"}, "properties": {"repobilityId": "4c3e6d5ed6ffd2e6", "scanner": "scanner-primary", "fingerprint": "a339feddc35b905e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9ca6b747fdbda3b4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/[locale]/(public)/winners/[sessionId]/page.tsx:177"}, "properties": {"repobilityId": "50eed31754ce2819", "scanner": "scanner-primary", "fingerprint": "9ca6b747fdbda3b4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-61f845abc4304a65", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(member)/dashboard/page.tsx:529"}, "properties": {"repobilityId": "e86928f98783ac95", "scanner": "scanner-primary", "fingerprint": "61f845abc4304a65", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e7881fea6538875a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(member)/dashboard/workshops/page.tsx:112"}, "properties": {"repobilityId": "0da660295c29e7d8", "scanner": "scanner-primary", "fingerprint": "e7881fea6538875a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5beb44c5bf8b00ef", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(member)/dashboard/messages/page.tsx:119"}, "properties": {"repobilityId": "96224cb5a2cd5846", "scanner": "scanner-primary", "fingerprint": "5beb44c5bf8b00ef", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-914ac897b0598dad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(member)/submissions/page.tsx:301"}, "properties": {"repobilityId": "f00fd10230a12a0f", "scanner": "scanner-primary", "fingerprint": "914ac897b0598dad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dd11070559738f13", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(member)/profile/page.tsx:159"}, "properties": {"repobilityId": "c97f786cc3b8cd58", "scanner": "scanner-primary", "fingerprint": "dd11070559738f13", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a2935db0a93ddccb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(member)/ambassador/page.tsx:132"}, "properties": {"repobilityId": "c308d65c58bbdae5", "scanner": "scanner-primary", "fingerprint": "a2935db0a93ddccb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9bae069189124632", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/[locale]/(jury)/review/session/[sessionId]/page.tsx:71"}, "properties": {"repobilityId": "807ac34ee911bca2", "scanner": "scanner-primary", "fingerprint": "9bae069189124632", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a3e3e412fa39cea7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/server/actions/unsubscribe.ts:39"}, "properties": {"repobilityId": "8d9c73bb591bced1", "scanner": "scanner-primary", "fingerprint": "a3e3e412fa39cea7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cbe3d0062db05e81", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/keen/JuryCurationBoard.tsx:484"}, "properties": {"repobilityId": "908716bb62f2c9cc", "scanner": "scanner-primary", "fingerprint": "cbe3d0062db05e81", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-184b4145cbd86a43", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/keen/AppUserAvatar.tsx:81"}, "properties": {"repobilityId": "6b37f18f21d2332b", "scanner": "scanner-primary", "fingerprint": "184b4145cbd86a43", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4064f9dacf982e6b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/keen/WorldMapInteractive.tsx:188"}, "properties": {"repobilityId": "398bcd1f7c07e7a3", "scanner": "scanner-primary", "fingerprint": "4064f9dacf982e6b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f7d5baa70c457e64", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/keen/WorkshopSessionManager.tsx:249"}, "properties": {"repobilityId": "81761c1e58a60269", "scanner": "scanner-primary", "fingerprint": "f7d5baa70c457e64", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-b62b38d48274f052", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/keen/SearchOverlay.tsx:192"}, "properties": {"repobilityId": "3d0074423da99a29", "scanner": "scanner-primary", "fingerprint": "b62b38d48274f052", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-096d73f745a4dd6d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/keen/PortfolioManager.tsx:287"}, "properties": {"repobilityId": "0294f8753bb6d969", "scanner": "scanner-primary", "fingerprint": "096d73f745a4dd6d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-827222ce385280ea", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed-demo.ts:301"}, "properties": {"repobilityId": "04408501143ae10b", "scanner": "scanner-primary", "fingerprint": "827222ce385280ea", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8d840869b8685de9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed.ts:113"}, "properties": {"repobilityId": "f77d7e0fb34b08e2", "scanner": "scanner-primary", "fingerprint": "8d840869b8685de9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e962d1fb505b440b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/page.tsx:247"}, "properties": {"repobilityId": "dd4f0510c05c7dc4", "scanner": "scanner-primary", "fingerprint": "e962d1fb505b440b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/page.tsx"}, "region": {"startLine": 247}}}]}, {"ruleId": "scanner-8d30e555fc8a0abb", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/photographers/page.tsx:246"}, "properties": {"repobilityId": "8013846f6b41ea49", "scanner": "scanner-primary", "fingerprint": "8d30e555fc8a0abb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/(public)/photographers/page.tsx"}, "region": {"startLine": 246}}}]}, {"ruleId": "scanner-018e57e3e72cca21", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/photographers/[handle]/page.tsx:498"}, "properties": {"repobilityId": "3df726876c9f86a5", "scanner": "scanner-primary", "fingerprint": "018e57e3e72cca21", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/(public)/photographers/[handle]/page.tsx"}, "region": {"startLine": 498}}}]}, {"ruleId": "scanner-f5316cd1d204ea68", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/workshops/page.tsx:70"}, "properties": {"repobilityId": "26beed5c58e75ab1", "scanner": "scanner-primary", "fingerprint": "f5316cd1d204ea68", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/(public)/workshops/page.tsx"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-0e80aaa7e310c385", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/workshops/[slug]/page.tsx:124"}, "properties": {"repobilityId": "4ed8ee3e1f236ad7", "scanner": "scanner-primary", "fingerprint": "0e80aaa7e310c385", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/(public)/workshops/[slug]/page.tsx"}, "region": {"startLine": 124}}}]}, {"ruleId": "scanner-48479a58b9753e85", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/magazine/[slug]/page.tsx:59"}, "properties": {"repobilityId": "184719c9bb70716f", "scanner": "scanner-primary", "fingerprint": "48479a58b9753e85", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/(public)/magazine/[slug]/page.tsx"}, "region": {"startLine": 59}}}]}, {"ruleId": "scanner-8893de3d2ee745d0", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/faq/page.tsx:63"}, "properties": {"repobilityId": "5e8d996805b363e5", "scanner": "scanner-primary", "fingerprint": "8893de3d2ee745d0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/(public)/faq/page.tsx"}, "region": {"startLine": 63}}}]}, {"ruleId": "scanner-604086882ed72579", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/founder/page.tsx:72"}, "properties": {"repobilityId": "44899f85a7c84093", "scanner": "scanner-primary", "fingerprint": "604086882ed72579", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/(public)/founder/page.tsx"}, "region": {"startLine": 72}}}]}, {"ruleId": "scanner-098b322069d1454d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/calendar/page.tsx:114"}, "properties": {"repobilityId": "ec308fe694c628bb", "scanner": "scanner-primary", "fingerprint": "098b322069d1454d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/(public)/calendar/page.tsx"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-384e0e1785369a9b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/winners/page.tsx:179"}, "properties": {"repobilityId": "71fd5033ef428142", "scanner": "scanner-primary", "fingerprint": "384e0e1785369a9b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/(public)/winners/page.tsx"}, "region": {"startLine": 179}}}]}, {"ruleId": "scanner-1bd8de2b508dda2e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/[locale]/(public)/winners/[sessionId]/page.tsx:177"}, "properties": {"repobilityId": "9c1f274fadbc4722", "scanner": "scanner-primary", "fingerprint": "1bd8de2b508dda2e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/[locale]/(public)/winners/[sessionId]/page.tsx"}, "region": {"startLine": 177}}}]}, {"ruleId": "scanner-a8b0a8470e1b6de1", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "22dfbc6d28ff6b42", "scanner": "scanner-primary", "fingerprint": "a8b0a8470e1b6de1", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/db-backup.yml"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-a8b0a8470e1b6de1", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f195fbcd8c1cb361", "scanner": "scanner-primary", "fingerprint": "a8b0a8470e1b6de1", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/db-backup.yml"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-a8b0a8470e1b6de1", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a8d5b62bf33242ec", "scanner": "scanner-primary", "fingerprint": "a8b0a8470e1b6de1", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/db-backup.yml"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-690c1aab51b312cd", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "374aa0b9acb5bc4b", "scanner": "scanner-primary", "fingerprint": "690c1aab51b312cd", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/profile-reminders.yml"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-690c1aab51b312cd", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "aeb727d84e234c71", "scanner": "scanner-primary", "fingerprint": "690c1aab51b312cd", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/profile-reminders.yml"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "edeab51902066991", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-23cba0afddeca6ea", "level": "note", "message": {"text": "Very large file: src/app/[locale]/page.tsx (1386 lines)"}, "properties": {"repobilityId": "d6afa70efb5dc984", "scanner": "scanner-primary", "fingerprint": "23cba0afddeca6ea", "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": "b10ad3ee0156787e", "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": "20c9a0214ebe9d32", "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": "81488dff615c9007", "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": "ce4019f3befeb5a6", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "c0cd0a4a86e23ef7", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-10bf6d094a1fedfa", "level": "none", "message": {"text": "Commented-code block (6 lines) in next.config.ts:19"}, "properties": {"repobilityId": "7825e73590fee7fe", "scanner": "scanner-primary", "fingerprint": "10bf6d094a1fedfa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3fb65eb4069a4f1c", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/middleware.ts:35"}, "properties": {"repobilityId": "1b56571c50cde81b", "scanner": "scanner-primary", "fingerprint": "3fb65eb4069a4f1c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-705c995ea68565f7", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/stripe/webhook/route.ts:72"}, "properties": {"repobilityId": "36a7a67e2db8ff71", "scanner": "scanner-primary", "fingerprint": "705c995ea68565f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c021e6886ed2cd89", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/og/trophy/route.tsx:6"}, "properties": {"repobilityId": "2038ec4f29967178", "scanner": "scanner-primary", "fingerprint": "c021e6886ed2cd89", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9daf3b6f2dff8378", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/badges/founding-member/[number]/route.tsx:11"}, "properties": {"repobilityId": "e121571ba3922037", "scanner": "scanner-primary", "fingerprint": "9daf3b6f2dff8378", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b24c1852d1ac6a1d", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/[locale]/(public)/calendar/page.tsx:354"}, "properties": {"repobilityId": "98d7adce387634ee", "scanner": "scanner-primary", "fingerprint": "b24c1852d1ac6a1d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e879acb057565e2", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/auth/callback/route.ts:59"}, "properties": {"repobilityId": "c385ead25b9336ec", "scanner": "scanner-primary", "fingerprint": "8e879acb057565e2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9292bfbeda9020ef", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/actions/translate.ts:57"}, "properties": {"repobilityId": "ca706bf8010734df", "scanner": "scanner-primary", "fingerprint": "9292bfbeda9020ef", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5204d7f0242d9838", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/server/actions/profile-wizard.ts:168"}, "properties": {"repobilityId": "84627efa0df876f7", "scanner": "scanner-primary", "fingerprint": "5204d7f0242d9838", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c6f7a2ee8918e098", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/keen/SearchOverlay.tsx:68"}, "properties": {"repobilityId": "93ef8ac72585a3c3", "scanner": "scanner-primary", "fingerprint": "c6f7a2ee8918e098", "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"]}}]}]}