{"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-bbf287dae14ac6e3", "name": "Stray `console.log` in TS/JS \u2014 generate_meta.js:52", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 generate_meta.js:52"}, "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-680c4ddf63c8b577", "name": "Stray `console.log` in TS/JS \u2014 generate_meta_all.js:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 generate_meta_all.js:35"}, "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-158a0d0e20cb4ea6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/GuardianChat.tsx:303", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/GuardianChat.tsx:303"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-066649707685b474", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/GlobalSearch.tsx:151", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/GlobalSearch.tsx:151"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-78f35b6caa2cdaff", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/PendingInvitations.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/PendingInvitations.tsx:84"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-24b6e1a1ebfc88e1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/SmartDashboard.tsx:869", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/SmartDashboard.tsx:869"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-110dfffddba34943", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/CSVImport.tsx:192", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/CSVImport.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-ec0e99dcbd5fa663", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/NCC2025Compliance.tsx:573", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/NCC2025Compliance.tsx:573"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7383bc1a08b5a859", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/ProjectDefects.tsx:659", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/ProjectDefects.tsx:659"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c89bb32e6eed9817", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/ShouldIPay.tsx:283", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/ShouldIPay.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-1bd7933b60ac9cd0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/AdminSupportInbox.tsx:122", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/AdminSupportInbox.tsx:122"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-95babafc79a7d907", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/AdminUserSearch.tsx:106", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/AdminUserSearch.tsx:106"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b24d8d0dd41b867d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/PhoneVerificationBanner.tsx:79", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/PhoneVerificationBanner.tsx:79"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4a000d12aef5076d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/ProgressPhotos.tsx:437", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/ProgressPhotos.tsx:437"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f110f71afea04bc3", "name": "Stray `console.log` in TS/JS \u2014 src/components/guardian/__tests__/PaymentSchedule.test.tsx:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/guardian/__tests__/PaymentSchedule.test.tsx:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5291d8e56caf4ed4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/JsonLd.tsx:20", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/JsonLd.tsx:20"}, "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-d4ff6d4bd1ff5273", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/BreadcrumbJsonLd.tsx:23", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/BreadcrumbJsonLd.tsx:23"}, "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-ccbb737a805fc6fa", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/ToolJsonLd.tsx:29", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/ToolJsonLd.tsx:29"}, "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-1014781d6ee9e24b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/page.tsx:35", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/page.tsx:35"}, "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-04b07b81008bdf5d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:83", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:83"}, "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-2ec31f264ceb831e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/blog/[slug]/page.tsx:53", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/blog/[slug]/page.tsx:53"}, "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-6271892576fa8351", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/guardian/phone-verify/route.ts:150", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/guardian/phone-verify/route.ts:150"}, "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-c9c7309a15312388", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/guardian/ai/chat/route.ts:131", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/guardian/ai/chat/route.ts:131"}, "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-b60fc81d1c13e8a6", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/guardian/delete-account/route.ts:203", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/guardian/delete-account/route.ts:203"}, "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-936a454be0fa4fe0", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/cleanup-trials/route.ts:56", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/cleanup-trials/route.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-77324339f21aa846", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/defect-reminders/route.ts:163", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/defect-reminders/route.ts:163"}, "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-1017f094a9723f0e", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/stripe/webhook/route.ts:122", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/stripe/webhook/route.ts:122"}, "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-c4009a32470fa948", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/guardian/page.tsx:99", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/guardian/page.tsx:99"}, "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-b6853137a1b21244", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/guardian/learn/[slug]/page.tsx:53", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/guardian/learn/[slug]/page.tsx:53"}, "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-ced10c2e0dd23cb4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/guardian/faq/page.tsx:137", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/guardian/faq/page.tsx:137"}, "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-f1bd9d8c94e3024d", "name": "Icon-only button without accessible name \u2014 src/app/tools/notes-app/page.tsx:28", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/app/tools/notes-app/page.tsx:28"}, "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-e10fd0135f35bacb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/tools/notes-app/page.tsx:34", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/tools/notes-app/page.tsx:34"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6f3074317308dacc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/tools/batch-image-compressor/page.tsx:150", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/tools/batch-image-compressor/page.tsx:150"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4f6eed7f2a62635f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/tools/pdf-merge/page.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/tools/pdf-merge/page.tsx:124"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-891fee6b7ec7be81", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/tools/markdown-editor/page.tsx:248", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/tools/markdown-editor/page.tsx:248"}, "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-c5503ff1b7d7d88e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/tools/regex-tester/page.tsx:270", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/tools/regex-tester/page.tsx:270"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4309c9e9ea9c5e0f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/tools/habit-tracker/page.tsx:239", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/tools/habit-tracker/page.tsx:239"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8c53c904dace690e", "name": "Stray `console.log` in TS/JS \u2014 src/app/tools/screen-recorder/page.tsx:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/tools/screen-recorder/page.tsx:53"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-13c3866fb7a779eb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/tools/image-to-pdf/page.tsx:197", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/tools/image-to-pdf/page.tsx:197"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a6725c2483141da9", "name": "Stray `console.log` in TS/JS \u2014 e2e/setup/global-teardown.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/setup/global-teardown.ts:28"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-744ad73c04181ee4", "name": "Stray `console.log` in TS/JS \u2014 e2e/setup/global-setup.ts:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/setup/global-setup.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-a1317712f6db3cd2", "name": "Insecure pattern 'eval_used' in generate_meta.js:31", "shortDescription": {"text": "Insecure pattern 'eval_used' in generate_meta.js:31"}, "fullDescription": {"text": "Found a known-risky pattern (eval_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-17159cfb9f6b13f3", "name": "Insecure pattern 'node_child_process' in scripts/mcp/marketing-server.mjs:34", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/mcp/marketing-server.mjs:34"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-48d3509a3a0ba44a", "name": "Insecure pattern 'local_storage_auth_token' in src/components/guardian/PageViewTracker.tsx:12", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in src/components/guardian/PageViewTracker.tsx:12"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-324384a953619a7b", "name": "Insecure pattern 'document_write' in src/components/guardian/ReportGenerator.tsx:381", "shortDescription": {"text": "Insecure pattern 'document_write' in src/components/guardian/ReportGenerator.tsx:381"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2225795bcc4b1922", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/JsonLd.tsx:20", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/JsonLd.tsx:20"}, "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-b5f14144669c0e49", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/BreadcrumbJsonLd.tsx:23", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/BreadcrumbJsonLd.tsx:23"}, "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-f1d8b068e87ce835", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/ToolJsonLd.tsx:29", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/ToolJsonLd.tsx:29"}, "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-f5f77c7497c3ea09", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/page.tsx:35", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/page.tsx:35"}, "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-172bfbfa27d9d504", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:83", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:83"}, "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-4cd4b1aa044af32c", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/blog/[slug]/page.tsx:53", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/blog/[slug]/page.tsx:53"}, "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-1d35258524ed97b5", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/guardian/page.tsx:99", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/guardian/page.tsx:99"}, "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-42fd0023d91850b0", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/guardian/learn/[slug]/page.tsx:53", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/guardian/learn/[slug]/page.tsx:53"}, "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-71f843d4835f9438", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/guardian/faq/page.tsx:137", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/guardian/faq/page.tsx:137"}, "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-2071742e9b3dc35b", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/tools/markdown-editor/page.tsx:248", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/tools/markdown-editor/page.tsx:248"}, "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-7cc82bb24cf0b79a", "name": "Insecure pattern 'eval_used' in src/app/tools/scientific-calculator/page.tsx:24", "shortDescription": {"text": "Insecure pattern 'eval_used' in src/app/tools/scientific-calculator/page.tsx:24"}, "fullDescription": {"text": "Found a known-risky pattern (eval_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-56979e8d810ffb6e", "name": "Insecure pattern 'document_write' in src/lib/export/pdf-export.ts:352", "shortDescription": {"text": "Insecure pattern 'document_write' in src/lib/export/pdf-export.ts:352"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bd325afbf34900f9", "name": "Possible secret in e2e/setup/supabase-seed.ts", "shortDescription": {"text": "Possible secret in e2e/setup/supabase-seed.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-ef52f5b353d7311d", "name": "Insecure pattern 'node_child_process' in e2e/setup/init-test-db.mjs:11", "shortDescription": {"text": "Insecure pattern 'node_child_process' in e2e/setup/init-test-db.mjs:11"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b4517218b3c078cc", "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-a94a5b871289099b", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cb42e8d23f8a8565", "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-84390e463ad08ffa", "name": "Very large file: src/app/guardian/projects/[id]/page.tsx (859 lines)", "shortDescription": {"text": "Very large file: src/app/guardian/projects/[id]/page.tsx (859 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-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 209 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 202 placeholder/mock markers across 93 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-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-cc55229a7a3c078d", "name": "Agent authority lacks a verifier contract: .mcp.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .mcp.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9be557ad9cadebd7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-ai-posts.mjs:86", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-ai-posts.mjs:86"}, "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-335525b5e700d57f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/auto-post-social.mjs:84", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/auto-post-social.mjs:84"}, "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-1f1b30cc920a7ff9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/post-to-bluesky.mjs:93", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/post-to-bluesky.mjs:93"}, "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-d113e66bf44c43dd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/post-to-meta.mjs:276", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/post-to-meta.mjs:276"}, "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-12175c18d48b6291", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/run-migrations.mjs:58", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/run-migrations.mjs:58"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3036c80220d2b091", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/mcp/marketing-server.mjs:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/mcp/marketing-server.mjs: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-88fec2df99af3170", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guardian/InspectorReportImport.tsx:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guardian/InspectorReportImport.tsx:73"}, "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-c75e8edc4d810729", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guardian/ContractParser.tsx:79", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guardian/ContractParser.tsx:79"}, "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-77bd40a22692989c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guardian/TimelineBenchmark.tsx:62", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guardian/TimelineBenchmark.tsx:62"}, "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-9b34d5c744d75bf8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/guardian/apply-referral/route.ts:101", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/guardian/apply-referral/route.ts:101"}, "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-275ad3f558eb3e1f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/guardian/disable-mfa/route.ts:88", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/guardian/disable-mfa/route.ts:88"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b301a21bb838ff2d", "name": "Commented-code block (6 lines) in src/app/api/guardian/export-data/route.ts:13", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/guardian/export-data/route.ts:13"}, "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-71591ce1483de639", "name": "Commented-code block (5 lines) in src/app/api/guardian/export-pdf/route.ts:371", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/guardian/export-pdf/route.ts:371"}, "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-abc16fdf53e268e4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/social/auto-post/route.ts:51", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/social/auto-post/route.ts:51"}, "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-2fe9eb4195b405ec", "name": "Commented-code block (5 lines) in src/app/api/stripe/webhook/route.ts:228", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/stripe/webhook/route.ts:228"}, "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-b6dc42031cf0c53c", "name": "Legacy-named symbol `vw_attrib_v1` in src/app/red-flags/SignupForm.tsx:17", "shortDescription": {"text": "Legacy-named symbol `vw_attrib_v1` in src/app/red-flags/SignupForm.tsx:17"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-30302ee3bacccef8", "name": "Commented-code block (5 lines) in src/app/guardian/actions.ts:94", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/guardian/actions.ts:94"}, "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-fe9970cb80b2a79d", "name": "Commented-code block (5 lines) in src/app/guardian/projects/new/page.tsx:219", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/guardian/projects/new/page.tsx:219"}, "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-43bd1a81ab709480", "name": "Commented-code block (5 lines) in src/app/guardian/projects/[id]/page.tsx:310", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/guardian/projects/[id]/page.tsx:310"}, "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-da5efd2ce999f7f4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/tools/image-to-pdf/page.tsx:109", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/tools/image-to-pdf/page.tsx:109"}, "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-dcc278e857876f6d", "name": "Commented-code block (5 lines) in src/lib/guardian/stage-keys.ts:16", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/guardian/stage-keys.ts:16"}, "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-76251a315d3c3bcb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/tools/safety.ts:6", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/tools/safety.ts:6"}, "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-4d223bfdf539b12d", "name": "42 env vars used in code but missing from .env.example", "shortDescription": {"text": "42 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ADMIN_EMAILS`, `ANTHROPIC_API_KEY`, `BLUESKY_APP_PASSWORD`, `BLUESKY_HANDLE`, `CI`, `CRON_SECRET`, `FACEBOOK_PAGE_ID`, `FACEBOOK_PAGE_TOKEN` + 34 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/20188"}, "properties": {"repository": "sritedd/vedawellapp-website", "repoUrl": "https://github.com/sritedd/vedawellapp-website", "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-bbf287dae14ac6e3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 generate_meta.js:52"}, "properties": {"repobilityId": "3f6167bd2fa6f3a1", "scanner": "scanner-primary", "fingerprint": "bbf287dae14ac6e3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-680c4ddf63c8b577", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 generate_meta_all.js:35"}, "properties": {"repobilityId": "b0d66e4b874ca958", "scanner": "scanner-primary", "fingerprint": "680c4ddf63c8b577", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-158a0d0e20cb4ea6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/GuardianChat.tsx:303"}, "properties": {"repobilityId": "56c250e72e251f58", "scanner": "scanner-primary", "fingerprint": "158a0d0e20cb4ea6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-066649707685b474", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/GlobalSearch.tsx:151"}, "properties": {"repobilityId": "4aa100f51e56fcd3", "scanner": "scanner-primary", "fingerprint": "066649707685b474", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-78f35b6caa2cdaff", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/PendingInvitations.tsx:84"}, "properties": {"repobilityId": "e50c35e5584ad155", "scanner": "scanner-primary", "fingerprint": "78f35b6caa2cdaff", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-24b6e1a1ebfc88e1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/SmartDashboard.tsx:869"}, "properties": {"repobilityId": "b989632390ac21e6", "scanner": "scanner-primary", "fingerprint": "24b6e1a1ebfc88e1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-110dfffddba34943", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/CSVImport.tsx:192"}, "properties": {"repobilityId": "184ac1ba8bc0d835", "scanner": "scanner-primary", "fingerprint": "110dfffddba34943", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec0e99dcbd5fa663", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/NCC2025Compliance.tsx:573"}, "properties": {"repobilityId": "c349e38507cebb67", "scanner": "scanner-primary", "fingerprint": "ec0e99dcbd5fa663", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7383bc1a08b5a859", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/ProjectDefects.tsx:659"}, "properties": {"repobilityId": "9e35a6693ffe7b87", "scanner": "scanner-primary", "fingerprint": "7383bc1a08b5a859", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c89bb32e6eed9817", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/ShouldIPay.tsx:283"}, "properties": {"repobilityId": "e1f3d0cf1259cf72", "scanner": "scanner-primary", "fingerprint": "c89bb32e6eed9817", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1bd7933b60ac9cd0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/AdminSupportInbox.tsx:122"}, "properties": {"repobilityId": "00875864a817d7b0", "scanner": "scanner-primary", "fingerprint": "1bd7933b60ac9cd0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-95babafc79a7d907", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/AdminUserSearch.tsx:106"}, "properties": {"repobilityId": "0b5ccd4bb1e8bff6", "scanner": "scanner-primary", "fingerprint": "95babafc79a7d907", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b24d8d0dd41b867d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/PhoneVerificationBanner.tsx:79"}, "properties": {"repobilityId": "80a02e38daba6855", "scanner": "scanner-primary", "fingerprint": "b24d8d0dd41b867d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4a000d12aef5076d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/guardian/ProgressPhotos.tsx:437"}, "properties": {"repobilityId": "01093bfb1a6117f7", "scanner": "scanner-primary", "fingerprint": "4a000d12aef5076d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f110f71afea04bc3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/guardian/__tests__/PaymentSchedule.test.tsx:20"}, "properties": {"repobilityId": "93b43f9db122f677", "scanner": "scanner-primary", "fingerprint": "f110f71afea04bc3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5291d8e56caf4ed4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/JsonLd.tsx:20"}, "properties": {"repobilityId": "f07cf3d2a261ff34", "scanner": "scanner-primary", "fingerprint": "5291d8e56caf4ed4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-d4ff6d4bd1ff5273", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/BreadcrumbJsonLd.tsx:23"}, "properties": {"repobilityId": "f592e6fe1606494b", "scanner": "scanner-primary", "fingerprint": "d4ff6d4bd1ff5273", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ccbb737a805fc6fa", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/ToolJsonLd.tsx:29"}, "properties": {"repobilityId": "d89c7fdb58574189", "scanner": "scanner-primary", "fingerprint": "ccbb737a805fc6fa", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1014781d6ee9e24b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/page.tsx:35"}, "properties": {"repobilityId": "4d4ab3e03315f684", "scanner": "scanner-primary", "fingerprint": "1014781d6ee9e24b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-04b07b81008bdf5d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:83"}, "properties": {"repobilityId": "0d72350965068f5b", "scanner": "scanner-primary", "fingerprint": "04b07b81008bdf5d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-2ec31f264ceb831e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/blog/[slug]/page.tsx:53"}, "properties": {"repobilityId": "edc166468e8868e7", "scanner": "scanner-primary", "fingerprint": "2ec31f264ceb831e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6271892576fa8351", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/guardian/phone-verify/route.ts:150"}, "properties": {"repobilityId": "ce20f12c9f9e09f8", "scanner": "scanner-primary", "fingerprint": "6271892576fa8351", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c9c7309a15312388", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/guardian/ai/chat/route.ts:131"}, "properties": {"repobilityId": "ae044e43e04ca624", "scanner": "scanner-primary", "fingerprint": "c9c7309a15312388", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b60fc81d1c13e8a6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/guardian/delete-account/route.ts:203"}, "properties": {"repobilityId": "9da114d67f40873d", "scanner": "scanner-primary", "fingerprint": "b60fc81d1c13e8a6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-936a454be0fa4fe0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/cleanup-trials/route.ts:56"}, "properties": {"repobilityId": "130362a55353a9b1", "scanner": "scanner-primary", "fingerprint": "936a454be0fa4fe0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-77324339f21aa846", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/defect-reminders/route.ts:163"}, "properties": {"repobilityId": "4b9f285a604901c4", "scanner": "scanner-primary", "fingerprint": "77324339f21aa846", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1017f094a9723f0e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/stripe/webhook/route.ts:122"}, "properties": {"repobilityId": "e3501193b3efa3b7", "scanner": "scanner-primary", "fingerprint": "1017f094a9723f0e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c4009a32470fa948", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/guardian/page.tsx:99"}, "properties": {"repobilityId": "4a95b6164474221a", "scanner": "scanner-primary", "fingerprint": "c4009a32470fa948", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b6853137a1b21244", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/guardian/learn/[slug]/page.tsx:53"}, "properties": {"repobilityId": "664e6ad675bcb7be", "scanner": "scanner-primary", "fingerprint": "b6853137a1b21244", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ced10c2e0dd23cb4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/guardian/faq/page.tsx:137"}, "properties": {"repobilityId": "476e665b174a13db", "scanner": "scanner-primary", "fingerprint": "ced10c2e0dd23cb4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f1bd9d8c94e3024d", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/app/tools/notes-app/page.tsx:28"}, "properties": {"repobilityId": "5d3fa4d9b6ff1857", "scanner": "scanner-primary", "fingerprint": "f1bd9d8c94e3024d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-e10fd0135f35bacb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/tools/notes-app/page.tsx:34"}, "properties": {"repobilityId": "4af777b2396373b6", "scanner": "scanner-primary", "fingerprint": "e10fd0135f35bacb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6f3074317308dacc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/tools/batch-image-compressor/page.tsx:150"}, "properties": {"repobilityId": "ba03d197b092e18d", "scanner": "scanner-primary", "fingerprint": "6f3074317308dacc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4f6eed7f2a62635f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/tools/pdf-merge/page.tsx:124"}, "properties": {"repobilityId": "b1dd6f272c7bb9c2", "scanner": "scanner-primary", "fingerprint": "4f6eed7f2a62635f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-891fee6b7ec7be81", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/tools/markdown-editor/page.tsx:248"}, "properties": {"repobilityId": "247a62a6842458de", "scanner": "scanner-primary", "fingerprint": "891fee6b7ec7be81", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c5503ff1b7d7d88e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/tools/regex-tester/page.tsx:270"}, "properties": {"repobilityId": "cff01d76ff4ba509", "scanner": "scanner-primary", "fingerprint": "c5503ff1b7d7d88e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4309c9e9ea9c5e0f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/tools/habit-tracker/page.tsx:239"}, "properties": {"repobilityId": "a4d80bdcbc21a2dd", "scanner": "scanner-primary", "fingerprint": "4309c9e9ea9c5e0f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8c53c904dace690e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/tools/screen-recorder/page.tsx:53"}, "properties": {"repobilityId": "ac55193bf7a88965", "scanner": "scanner-primary", "fingerprint": "8c53c904dace690e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-13c3866fb7a779eb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/tools/image-to-pdf/page.tsx:197"}, "properties": {"repobilityId": "4f6cb16f42bc70cc", "scanner": "scanner-primary", "fingerprint": "13c3866fb7a779eb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a6725c2483141da9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/setup/global-teardown.ts:28"}, "properties": {"repobilityId": "beafa31141e93bb9", "scanner": "scanner-primary", "fingerprint": "a6725c2483141da9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-744ad73c04181ee4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/setup/global-setup.ts:29"}, "properties": {"repobilityId": "13ed825e2f29c6a9", "scanner": "scanner-primary", "fingerprint": "744ad73c04181ee4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a1317712f6db3cd2", "level": "error", "message": {"text": "Insecure pattern 'eval_used' in generate_meta.js:31"}, "properties": {"repobilityId": "e65a3135f8a62a99", "scanner": "scanner-primary", "fingerprint": "a1317712f6db3cd2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "eval_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "generate_meta.js"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-17159cfb9f6b13f3", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/mcp/marketing-server.mjs:34"}, "properties": {"repobilityId": "121de88183425651", "scanner": "scanner-primary", "fingerprint": "17159cfb9f6b13f3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/mcp/marketing-server.mjs"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-48d3509a3a0ba44a", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in src/components/guardian/PageViewTracker.tsx:12"}, "properties": {"repobilityId": "7ca2c738a2c9c49e", "scanner": "scanner-primary", "fingerprint": "48d3509a3a0ba44a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/guardian/PageViewTracker.tsx"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-324384a953619a7b", "level": "note", "message": {"text": "Insecure pattern 'document_write' in src/components/guardian/ReportGenerator.tsx:381"}, "properties": {"repobilityId": "31fa3e54d807f52f", "scanner": "scanner-primary", "fingerprint": "324384a953619a7b", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/guardian/ReportGenerator.tsx"}, "region": {"startLine": 381}}}]}, {"ruleId": "scanner-2225795bcc4b1922", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/JsonLd.tsx:20"}, "properties": {"repobilityId": "fed4538264d6fd2d", "scanner": "scanner-primary", "fingerprint": "2225795bcc4b1922", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/seo/JsonLd.tsx"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-b5f14144669c0e49", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/BreadcrumbJsonLd.tsx:23"}, "properties": {"repobilityId": "d9896c93e5f4bfa6", "scanner": "scanner-primary", "fingerprint": "b5f14144669c0e49", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/seo/BreadcrumbJsonLd.tsx"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-f1d8b068e87ce835", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/ToolJsonLd.tsx:29"}, "properties": {"repobilityId": "8441d4f8234ec243", "scanner": "scanner-primary", "fingerprint": "f1d8b068e87ce835", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/seo/ToolJsonLd.tsx"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-f5f77c7497c3ea09", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/page.tsx:35"}, "properties": {"repobilityId": "88fd235b712bda65", "scanner": "scanner-primary", "fingerprint": "f5f77c7497c3ea09", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/page.tsx"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-172bfbfa27d9d504", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:83"}, "properties": {"repobilityId": "0bca654fa2052eb0", "scanner": "scanner-primary", "fingerprint": "172bfbfa27d9d504", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/layout.tsx"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-4cd4b1aa044af32c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/blog/[slug]/page.tsx:53"}, "properties": {"repobilityId": "df5a2a4c38f975f6", "scanner": "scanner-primary", "fingerprint": "4cd4b1aa044af32c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/blog/[slug]/page.tsx"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-1d35258524ed97b5", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/guardian/page.tsx:99"}, "properties": {"repobilityId": "26dc82b80d7156b7", "scanner": "scanner-primary", "fingerprint": "1d35258524ed97b5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/guardian/page.tsx"}, "region": {"startLine": 99}}}]}, {"ruleId": "scanner-42fd0023d91850b0", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/guardian/learn/[slug]/page.tsx:53"}, "properties": {"repobilityId": "553edc8c8beebee4", "scanner": "scanner-primary", "fingerprint": "42fd0023d91850b0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/guardian/learn/[slug]/page.tsx"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-71f843d4835f9438", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/guardian/faq/page.tsx:137"}, "properties": {"repobilityId": "c9ec7a8b7cff7efe", "scanner": "scanner-primary", "fingerprint": "71f843d4835f9438", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/guardian/faq/page.tsx"}, "region": {"startLine": 137}}}]}, {"ruleId": "scanner-2071742e9b3dc35b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/tools/markdown-editor/page.tsx:248"}, "properties": {"repobilityId": "e0f17b4f2d0e7640", "scanner": "scanner-primary", "fingerprint": "2071742e9b3dc35b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/tools/markdown-editor/page.tsx"}, "region": {"startLine": 248}}}]}, {"ruleId": "scanner-7cc82bb24cf0b79a", "level": "error", "message": {"text": "Insecure pattern 'eval_used' in src/app/tools/scientific-calculator/page.tsx:24"}, "properties": {"repobilityId": "036cd360a5fbd2ad", "scanner": "scanner-primary", "fingerprint": "7cc82bb24cf0b79a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "eval_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/tools/scientific-calculator/page.tsx"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-56979e8d810ffb6e", "level": "note", "message": {"text": "Insecure pattern 'document_write' in src/lib/export/pdf-export.ts:352"}, "properties": {"repobilityId": "ca493d2950a9ed5d", "scanner": "scanner-primary", "fingerprint": "56979e8d810ffb6e", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/export/pdf-export.ts"}, "region": {"startLine": 352}}}]}, {"ruleId": "scanner-bd325afbf34900f9", "level": "error", "message": {"text": "Possible secret in e2e/setup/supabase-seed.ts"}, "properties": {"repobilityId": "c107b40b665cfe5d", "scanner": "scanner-primary", "fingerprint": "bd325afbf34900f9", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/setup/supabase-seed.ts"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-ef52f5b353d7311d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in e2e/setup/init-test-db.mjs:11"}, "properties": {"repobilityId": "229492fc02c0c5f8", "scanner": "scanner-primary", "fingerprint": "ef52f5b353d7311d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/setup/init-test-db.mjs"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-b4517218b3c078cc", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "33f88703b9ce0290", "scanner": "scanner-primary", "fingerprint": "b4517218b3c078cc", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/bluesky-daily.yml"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-b4517218b3c078cc", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "24a8c058f7f0b9d0", "scanner": "scanner-primary", "fingerprint": "b4517218b3c078cc", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/bluesky-daily.yml"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-b4517218b3c078cc", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b4eddf1f3c15f3ec", "scanner": "scanner-primary", "fingerprint": "b4517218b3c078cc", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/bluesky-daily.yml"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-a94a5b871289099b", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "a144f3e79a6bd7a4", "scanner": "scanner-primary", "fingerprint": "a94a5b871289099b", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/bluesky-daily.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cb42e8d23f8a8565", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "fd164ec1e54c7943", "scanner": "scanner-primary", "fingerprint": "cb42e8d23f8a8565", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/submit-reach.yml"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-cb42e8d23f8a8565", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b5517af28121541d", "scanner": "scanner-primary", "fingerprint": "cb42e8d23f8a8565", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/submit-reach.yml"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-84390e463ad08ffa", "level": "note", "message": {"text": "Very large file: src/app/guardian/projects/[id]/page.tsx (859 lines)"}, "properties": {"repobilityId": "494352ff6a88d658", "scanner": "scanner-primary", "fingerprint": "84390e463ad08ffa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "fc303bca264310f2", "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": "00e8b26b53cd2d23", "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": "32486f177b45f9ec", "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": "95d9dc9d9a5dca55", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "6cb5bc8beb434604", "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": "f3eb47153ef6e0ff", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-cc55229a7a3c078d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .mcp.json"}, "properties": {"repobilityId": "51942fb3d5b8b5b4", "scanner": "scanner-primary", "fingerprint": "cc55229a7a3c078d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "mcp_config"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".mcp.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9be557ad9cadebd7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/generate-ai-posts.mjs:86"}, "properties": {"repobilityId": "decd58625243cc11", "scanner": "scanner-primary", "fingerprint": "9be557ad9cadebd7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-335525b5e700d57f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/auto-post-social.mjs:84"}, "properties": {"repobilityId": "5806f8ace1267281", "scanner": "scanner-primary", "fingerprint": "335525b5e700d57f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1f1b30cc920a7ff9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/post-to-bluesky.mjs:93"}, "properties": {"repobilityId": "0cad7676fcaf59c6", "scanner": "scanner-primary", "fingerprint": "1f1b30cc920a7ff9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d113e66bf44c43dd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/post-to-meta.mjs:276"}, "properties": {"repobilityId": "7d9eeafbb6988f83", "scanner": "scanner-primary", "fingerprint": "d113e66bf44c43dd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-12175c18d48b6291", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/run-migrations.mjs:58"}, "properties": {"repobilityId": "e8d52077d2a228ae", "scanner": "scanner-primary", "fingerprint": "12175c18d48b6291", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3036c80220d2b091", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/mcp/marketing-server.mjs:68"}, "properties": {"repobilityId": "40cf9157960af9e8", "scanner": "scanner-primary", "fingerprint": "3036c80220d2b091", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-88fec2df99af3170", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guardian/InspectorReportImport.tsx:73"}, "properties": {"repobilityId": "01f1df33fa0c5b5f", "scanner": "scanner-primary", "fingerprint": "88fec2df99af3170", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c75e8edc4d810729", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guardian/ContractParser.tsx:79"}, "properties": {"repobilityId": "096a2d56ad30b936", "scanner": "scanner-primary", "fingerprint": "c75e8edc4d810729", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-77bd40a22692989c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/guardian/TimelineBenchmark.tsx:62"}, "properties": {"repobilityId": "f2442dd077c92836", "scanner": "scanner-primary", "fingerprint": "77bd40a22692989c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9b34d5c744d75bf8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/guardian/apply-referral/route.ts:101"}, "properties": {"repobilityId": "682f958f1a4fba5d", "scanner": "scanner-primary", "fingerprint": "9b34d5c744d75bf8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-275ad3f558eb3e1f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/guardian/disable-mfa/route.ts:88"}, "properties": {"repobilityId": "4bc0881083ae5a60", "scanner": "scanner-primary", "fingerprint": "275ad3f558eb3e1f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b301a21bb838ff2d", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/guardian/export-data/route.ts:13"}, "properties": {"repobilityId": "7ca405a82804f186", "scanner": "scanner-primary", "fingerprint": "b301a21bb838ff2d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-71591ce1483de639", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/guardian/export-pdf/route.ts:371"}, "properties": {"repobilityId": "d628956237dd93a7", "scanner": "scanner-primary", "fingerprint": "71591ce1483de639", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-abc16fdf53e268e4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/social/auto-post/route.ts:51"}, "properties": {"repobilityId": "e8e8d266692c5132", "scanner": "scanner-primary", "fingerprint": "abc16fdf53e268e4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2fe9eb4195b405ec", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/stripe/webhook/route.ts:228"}, "properties": {"repobilityId": "6861097b124a0a2d", "scanner": "scanner-primary", "fingerprint": "2fe9eb4195b405ec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b6dc42031cf0c53c", "level": "note", "message": {"text": "Legacy-named symbol `vw_attrib_v1` in src/app/red-flags/SignupForm.tsx:17"}, "properties": {"repobilityId": "ca5433c952b545e7", "scanner": "scanner-primary", "fingerprint": "b6dc42031cf0c53c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-30302ee3bacccef8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/guardian/actions.ts:94"}, "properties": {"repobilityId": "b7cb265f578bee00", "scanner": "scanner-primary", "fingerprint": "30302ee3bacccef8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe9970cb80b2a79d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/guardian/projects/new/page.tsx:219"}, "properties": {"repobilityId": "7a444930106dec6b", "scanner": "scanner-primary", "fingerprint": "fe9970cb80b2a79d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-43bd1a81ab709480", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/guardian/projects/[id]/page.tsx:310"}, "properties": {"repobilityId": "667d1c7b898ced7f", "scanner": "scanner-primary", "fingerprint": "43bd1a81ab709480", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-da5efd2ce999f7f4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/tools/image-to-pdf/page.tsx:109"}, "properties": {"repobilityId": "7fffc0e448549b1c", "scanner": "scanner-primary", "fingerprint": "da5efd2ce999f7f4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dcc278e857876f6d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/guardian/stage-keys.ts:16"}, "properties": {"repobilityId": "b2f724360c0edb4f", "scanner": "scanner-primary", "fingerprint": "dcc278e857876f6d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-76251a315d3c3bcb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/tools/safety.ts:6"}, "properties": {"repobilityId": "f1ff5a1f3e0f1f4e", "scanner": "scanner-primary", "fingerprint": "76251a315d3c3bcb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4d223bfdf539b12d", "level": "note", "message": {"text": "42 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "5bbbd2b50dcb630d", "scanner": "scanner-primary", "fingerprint": "4d223bfdf539b12d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}