{"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-9abc323adfaf6441", "name": "Possibly dead Python function: verify_token", "shortDescription": {"text": "Possibly dead Python function: verify_token"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d572ae10804bfa76", "name": "Possibly dead Python function: decorator", "shortDescription": {"text": "Possibly dead Python function: decorator"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-02052f27dbbecb22", "name": "Stray `console.log` in TS/JS \u2014 scripts/analyze-abstract-sentences.ts:78", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/analyze-abstract-sentences.ts:78"}, "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-4c5523b8b2851321", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-measurement-subcategories.ts:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-measurement-subcategories.ts:66"}, "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-31d8fc9dd8bf8643", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-confused-with.ts:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-confused-with.ts:42"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2ebbe5d8452dd56c", "name": "Stray `console.log` in TS/JS \u2014 scripts/sync-archive-crosslinks.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sync-archive-crosslinks.ts:48"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c00e46bc4fbd414", "name": "Stray `console.log` in TS/JS \u2014 scripts/apply-measurement-seeds.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/apply-measurement-seeds.ts:16"}, "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-3b31f1aa6ea56f62", "name": "Stray `console.log` in TS/JS \u2014 scripts/link-thesis-methods.ts:76", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/link-thesis-methods.ts:76"}, "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-a44cfb3caf5e9d51", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-rm-stat-links.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-rm-stat-links.ts:39"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-00b0db44df46f034", "name": "Stray `console.log` in TS/JS \u2014 scripts/analyze-alumni-abstracts.ts:79", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/analyze-alumni-abstracts.ts:79"}, "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-6db228456cdd918c", "name": "Stray `console.log` in TS/JS \u2014 scripts/enrich-measurement-tools.ts:96", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/enrich-measurement-tools.ts:96"}, "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-35a34d52e9e15b2c", "name": "Stray `console.log` in TS/JS \u2014 scripts/extract-thesis-analysis.ts:172", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/extract-thesis-analysis.ts:172"}, "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-5eefbd4cd5e31577", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-concept-scholars.ts:323", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-concept-scholars.ts:323"}, "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-a9c42069b4e4ba3e", "name": "Stray `console.log` in TS/JS \u2014 scripts/apply-archive-links.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/apply-archive-links.ts:33"}, "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-c7fdad2a6dc2b340", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-confused-with-2.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-confused-with-2.ts:23"}, "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-0a509ad8cfa673a9", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-measurement-scales.ts:131", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-measurement-scales.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-70dc14f3d7d13cbf", "name": "Stray `console.log` in TS/JS \u2014 scripts/deploy-vercel.js:82", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/deploy-vercel.js:82"}, "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-6c57c147a5516052", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-stat-symbols.ts:100", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-stat-symbols.ts:100"}, "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-bb74c4fa09f0c60b", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-learning-theories.ts:275", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-learning-theories.ts:275"}, "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-5a82f0e4cf89dcc9", "name": "Stray `console.log` in TS/JS \u2014 scripts/link-theses-concepts.ts:117", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/link-theses-concepts.ts:117"}, "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-fa164f5ffbef4602", "name": "Stray `console.log` in TS/JS \u2014 scripts/rebuild-thesis-method-links.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/rebuild-thesis-method-links.ts: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-3d59312967c9f41d", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-assumption-remedies.ts:189", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-assumption-remedies.ts:189"}, "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-15f908529089d7a8", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-tf-values.ts:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-tf-values.ts:54"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-55df83e7c4b6bf69", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-variable-domains.ts:123", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-variable-domains.ts:123"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d8237d679024406d", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-writing-cvi.ts:92", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-writing-cvi.ts:92"}, "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-91bd977651de2a08", "name": "Stray `console.log` in TS/JS \u2014 scripts/reclassify-concepts.ts:141", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reclassify-concepts.ts:141"}, "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-69e4e7b28e6b456f", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-scale-development.ts:110", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-scale-development.ts:110"}, "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-4990b7e0af2e90ee", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-purified-names.ts:100", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-purified-names.ts:100"}, "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-4adea976875c4691", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-jamovi-guides.ts:86", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-jamovi-guides.ts:86"}, "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-7c7248f053964085", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-cognitive-measurements.ts:76", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-cognitive-measurements.ts:76"}, "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-904d5a98ea19a055", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-cognitive-measurements-2.ts:55", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-cognitive-measurements-2.ts:55"}, "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-f63f37d4dc84fb54", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-spss-guides.ts:82", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-spss-guides.ts:82"}, "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-2691b4c8023f84df", "name": "TODO/FIXME marker in shipping code \u2014 src/types/diagnostic.ts:488", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/types/diagnostic.ts:488"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5b8ec6e9e73c3529", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/types/diagnostic.ts:119", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/types/diagnostic.ts:119"}, "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-9f1f5052926516a9", "name": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/types/research-model.ts:210", "shortDescription": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/types/research-model.ts:210"}, "fullDescription": {"text": "React Flow edge labels render with a white rectangle behind the text by default, which scatters bright boxes across a dark canvas. Either drop the label, or override `.react-flow__edge-textbg` and `.react-flow__edge-text` in your stylesheet.\n\nWhy: P-H in CHECKLIST.md \u2014 vendor edge labels bleed white through a dark canvas.\nRule id: fq.edge-label.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-23fb65cf89865e27", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/GlobalSearch.tsx:376", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/GlobalSearch.tsx:376"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c124b5b730945dd4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Header.tsx:557", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Header.tsx:557"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a04f00a408998f32", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/archive/ConsoleSimpleArchiveList.tsx:176", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/archive/ConsoleSimpleArchiveList.tsx:176"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ac3a77184d0c1b3f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/archive/ThesisLinker.tsx:91", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/archive/ThesisLinker.tsx:91"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-35323f2c10cacc3f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/file-uploader.tsx:97", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/file-uploader.tsx:97"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-940d983e1b5a5014", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/chat/ChatWidget.tsx:249", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/chat/ChatWidget.tsx:249"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ca6bd03ce5621ae8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/NewsletterPreview.tsx:52", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/NewsletterPreview.tsx:52"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b68124f7e82d1534", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/PromotionPreview.tsx:54", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/PromotionPreview.tsx:54"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-06b015293f439510", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/NoticePreview.tsx:48", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/NoticePreview.tsx:48"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e5d53e3349b297fb", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/diagnosis/DiagnosisRunner.tsx:316", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/diagnosis/DiagnosisRunner.tsx:316"}, "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-097e36b8e1f2559e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/profile/ProfileCertificates.tsx:53", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/profile/ProfileCertificates.tsx:53"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-389b51a5b665fc5f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/profile/ProfileContactInfo.tsx:54", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/profile/ProfileContactInfo.tsx:54"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cbef37fa8134b14e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/profile/ProfileAcademicActivities.tsx:442", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/profile/ProfileAcademicActivities.tsx:442"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cfafb2adfa8b6b9b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mypage/DiagnosticWeakConceptPath.tsx:155", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mypage/DiagnosticWeakConceptPath.tsx:155"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-987045614008b9ee", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mypage/MyResearchView.tsx:543", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mypage/MyResearchView.tsx:543"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-815172856162260b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mypage/MyPageView.tsx:682", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mypage/MyPageView.tsx:682"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0eb4e1f96918e4c9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mypage/MyActivitiesView.tsx:238", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mypage/MyActivitiesView.tsx:238"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6e5946c92bbfba64", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mypage/MyActivityHub.tsx:382", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mypage/MyActivityHub.tsx:382"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b0d3f920f6e3bc65", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/JsonLd.tsx:52", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/JsonLd.tsx:52"}, "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-b97de1a91db2cdbf", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:138", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:138"}, "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-48fa731c33213539", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/archive/[type]/page.tsx:501", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/archive/[type]/page.tsx:501"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ffb0bd4b87b7f643", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/ai/conference-extract/route.ts:137", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/ai/conference-extract/route.ts:137"}, "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-fee37264a2c2e9f1", "name": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/app/research/page.tsx:220", "shortDescription": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/app/research/page.tsx:220"}, "fullDescription": {"text": "React Flow edge labels render with a white rectangle behind the text by default, which scatters bright boxes across a dark canvas. Either drop the label, or override `.react-flow__edge-textbg` and `.react-flow__edge-text` in your stylesheet.\n\nWhy: P-H in CHECKLIST.md \u2014 vendor edge labels bleed white through a dark canvas.\nRule id: fq.edge-label.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c05ac40b916a5109", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/page.tsx:126", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/page.tsx:126"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cfd3380f320ec2b3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/labs/page.tsx:146", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/labs/page.tsx:146"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5541b4b686f9d3c7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/labs/[id]/page.tsx:152", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/labs/[id]/page.tsx:152"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-081eff60c3781cc6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/labs/qa-wall/page.tsx:256", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/labs/qa-wall/page.tsx:256"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8c5b66cdce40131e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/progress-meetings/page.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/progress-meetings/page.tsx:65"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3911718b1bd8ea9b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/leaderboard/page.tsx:288", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/leaderboard/page.tsx:288"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7239e7871c80fe3f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/analytics/page.tsx:59", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/analytics/page.tsx:59"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fdb8f34d9a67e1dc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/audit-log/page.tsx:120", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/audit-log/page.tsx:120"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8a95b1793cc80566", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/exam-schedule-admin/page.tsx:204", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/exam-schedule-admin/page.tsx:204"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bd7504d091a6ac42", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/agents/page.tsx:183", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/agents/page.tsx:183"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9243bb46a1f9fefb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/seminars/[id]/host/page.tsx:323", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/seminars/[id]/host/page.tsx:323"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-83d084ea97053649", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/archive/page.tsx:481", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/archive/page.tsx:481"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-00dc802d9340a794", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/archive/writing-tips/page.tsx:251", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/archive/writing-tips/page.tsx:251"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f3aad33be08f3796", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/archive/foundation-terms/page.tsx:252", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/archive/foundation-terms/page.tsx:252"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-04f73f68b328a142", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/archive/statistical-methods/page.tsx:250", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/archive/statistical-methods/page.tsx:250"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-536336bd7869fc5b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/archive/research-methods/page.tsx:222", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/archive/research-methods/page.tsx:222"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d29333b0cec0a421", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/networking/page.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/networking/page.tsx:149"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ae52ddc20f00c94e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/potential-members/page.tsx:72", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/potential-members/page.tsx:72"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c9e516a07396b26e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/research/page.tsx:453", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/research/page.tsx:453"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3fa47f2ca7fc97e6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/research/[userId]/page.tsx:190", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/research/[userId]/page.tsx:190"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-71512f5a822ebbcf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/agent-workflows/page.tsx:206", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/agent-workflows/page.tsx:206"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-12e326e71e0deca7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/labs/page.tsx:128", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/labs/page.tsx:128"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b060ca0d30c5d0fc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/labs/[id]/page.tsx:151", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/labs/[id]/page.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-7c501e07bb74bd50", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/agent-board/page.tsx:164", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/agent-board/page.tsx:164"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c546bcf79844b630", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/academic/external/[id]/speakers/page.tsx:569", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/academic/external/[id]/speakers/page.tsx:569"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-36c9cd77ac132e26", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/academic/external/[id]/session-analytics/page.tsx:2", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/academic/external/[id]/session-analytics/page.tsx:282"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3bde221898868b0a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/academic/external/[id]/reviews/page.tsx:220", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/academic/external/[id]/reviews/page.tsx:220"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7af149e044a0e93e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/academic/external/[id]/volunteers/page.tsx:542", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/academic/external/[id]/volunteers/page.tsx:542"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-88d41f943d612f19", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/academic/seminars/[id]/page.tsx:212", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/academic/seminars/[id]/page.tsx:212"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8b7df0e391680cb7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/academic/applications/page.tsx:158", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/academic/applications/page.tsx:158"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-11940ceae06ad5d0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/onboarding-checklist/page.tsx:300", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/onboarding-checklist/page.tsx:300"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1eb426647062f38c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/members/[id]/page.tsx:469", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/members/[id]/page.tsx:469"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f3af9205f3056de2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/newsletter/page.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/newsletter/page.tsx:86"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-34f5cd9a645236f2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/newsletter/[id]/page.tsx:175", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/newsletter/[id]/page.tsx:175"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-97c9c79b3cfc3eea", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/mypage/messages/page.tsx:194", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/mypage/messages/page.tsx:194"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b72c34b922ddbc34", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/mypage/calendar-sync/page.tsx:117", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/mypage/calendar-sync/page.tsx:117"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-beee31665bc373f8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/calendar/page.tsx:820", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/calendar/page.tsx:820"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-99a1135df72010ce", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/board/[id]/page.tsx:306", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/board/[id]/page.tsx:306"}, "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-f1bbf6d5930b8bbd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/seminar-admin/RegistrationsTab.tsx:1437", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/seminar-admin/RegistrationsTab.tsx:1437"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-32ee085bc83785bb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/seminar-admin/ReviewManagement.tsx:241", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/seminar-admin/ReviewManagement.tsx:241"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d6ab2a6f74b3b928", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/notifications/NotificationBell.tsx:114", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/notifications/NotificationBell.tsx:114"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c3eee01701bbfee8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/archive/ArchiveStartHere.tsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/archive/ArchiveStartHere.tsx:87"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-db0e0bfe765c40b9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/archive/ArchiveGlobalSearch.tsx:187", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/archive/ArchiveGlobalSearch.tsx:187"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4343e66f59f7b573", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/archive/ArchiveConceptRecommend.tsx:258", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/archive/ArchiveConceptRecommend.tsx:258"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-052bc4ed727b6040", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/auth/MyPostList.tsx:32", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/auth/MyPostList.tsx:32"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d7516540d37bcd22", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/auth/signup-steps/GuestHistoryPreviewDialog.tsx:70", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/auth/signup-steps/GuestHistoryPreviewDialog.tsx:70"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b11ec7d88e8ee4a0", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/features/journal/components/JournalArticleView.tsx:67", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/features/journal/components/JournalArticleView.tsx:67"}, "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-2ff5b0d33b30be1b", "name": "React Flow <MiniMap> without dark background \u2014 src/features/network/NetworkGraph.tsx:228", "shortDescription": {"text": "React Flow <MiniMap> without dark background \u2014 src/features/network/NetworkGraph.tsx:228"}, "fullDescription": {"text": "A bare <MiniMap> renders with the vendor's white default in dark themes. Wrap the canvas in a class that overrides `.react-flow__minimap` background, or pass an explicit `style`/`maskColor`/`bgColor`.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.minimap.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1ef990595d242de0", "name": "React Flow <Controls> without dark theming \u2014 src/features/network/NetworkGraph.tsx:227", "shortDescription": {"text": "React Flow <Controls> without dark theming \u2014 src/features/network/NetworkGraph.tsx:227"}, "fullDescription": {"text": "`<Controls>` ships with white buttons. Override `.react-flow__controls` and `.react-flow__controls-button` in your stylesheet or pass a styled wrapper.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.controls.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-900ba7237cff210a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/ResearchReportInterview.tsx:1790", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/ResearchReportInterview.tsx:1790"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-89e20144e3aab371", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/WritingPaperEditor.tsx:1889", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/WritingPaperEditor.tsx:1889"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8bde67de035ec83c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/ResearchPaperList.tsx:407", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/ResearchPaperList.tsx:407"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b4da030a45487196", "name": "React Flow <MiniMap> without dark background \u2014 src/features/research/ResearchModelEditor.tsx:490", "shortDescription": {"text": "React Flow <MiniMap> without dark background \u2014 src/features/research/ResearchModelEditor.tsx:490"}, "fullDescription": {"text": "A bare <MiniMap> renders with the vendor's white default in dark themes. Wrap the canvas in a class that overrides `.react-flow__minimap` background, or pass an explicit `style`/`maskColor`/`bgColor`.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.minimap.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0c3bd65f890190da", "name": "React Flow <Controls> without dark theming \u2014 src/features/research/ResearchModelEditor.tsx:489", "shortDescription": {"text": "React Flow <Controls> without dark theming \u2014 src/features/research/ResearchModelEditor.tsx:489"}, "fullDescription": {"text": "`<Controls>` ships with white buttons. Override `.react-flow__controls` and `.react-flow__controls-button` in your stylesheet or pass a styled wrapper.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.controls.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1b13d8f79d1a38d4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/WritingHistoryList.tsx:64", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/WritingHistoryList.tsx:64"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-247dd52d205512a5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/ResearchPaperDialog.tsx:393", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/ResearchPaperDialog.tsx:393"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4393350fa3e91b0d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/RisImporter.tsx:278", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/RisImporter.tsx:278"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e5caaa7bcf003570", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/study-timer/PaperReadingSection.tsx:131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/study-timer/PaperReadingSection.tsx:131"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-18ac9ade3afda2c6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/study-timer/FloatingReadingTimer.tsx:286", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/study-timer/FloatingReadingTimer.tsx:286"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ad12c71ded3c8568", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/study-timer/StudyTimerStats.tsx:202", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/study-timer/StudyTimerStats.tsx:202"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6045c04cb41d30df", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/ActivityFeed.tsx:100", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/ActivityFeed.tsx:100"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ec64a22985710521", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/NewMemberOnboardingCard.tsx:244", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/NewMemberOnboardingCard.tsx:244"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-34c651bf48f4a43c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/ProfileSummaryCard.tsx:143", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/ProfileSummaryCard.tsx:143"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4f293e8aef66f61d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/ProfileSideWidget.tsx:62", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/ProfileSideWidget.tsx:62"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-37d2dd5f09e012b0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/DailyClassTimelineWidget.tsx:1021", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/DailyClassTimelineWidget.tsx:1021"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-af01bf5b93968f0c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/AlumniHomeWidgets.tsx:203", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/AlumniHomeWidgets.tsx:203"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-12900aeba63bded9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/NextActionBanner.tsx:358", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/NextActionBanner.tsx:358"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ff138a18fa89e293", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/PeerActivityFeed.tsx:228", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/PeerActivityFeed.tsx:228"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c8de6358dbc0b2d1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/TodayTodosPopup.tsx:330", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/TodayTodosPopup.tsx:330"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-73d75180cdefb61f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/StaffPriorityPanel.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/StaffPriorityPanel.tsx:129"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4f7851fdd6d0bc05", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/RecentPostsWidget.tsx:90", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/RecentPostsWidget.tsx:90"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-73d3907fc10361ec", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/DashboardCommandCenter.tsx:170", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/DashboardCommandCenter.tsx:170"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-10732882eecafdd9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/SpacedRepetitionWidget.tsx:190", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/SpacedRepetitionWidget.tsx:190"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d58f45f19c2a1e2b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/TodaySummaryCard.tsx:224", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/TodaySummaryCard.tsx:224"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-26ede0898eb4b953", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/MyAcademicActivitiesWidget.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/MyAcademicActivitiesWidget.tsx:109"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1fa580ef1b13ab4a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/timeline/WeeklyGrid.tsx:147", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/timeline/WeeklyGrid.tsx:147"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-98d63e5a5db66e33", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/timeline/DailyGrid.tsx:120", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/timeline/DailyGrid.tsx:120"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c4305526d62ad64d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/todos/LectureReviewItem.tsx:131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/todos/LectureReviewItem.tsx:131"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9ddc632b37726b13", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/todos/ResearchItem.tsx:20", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/todos/ResearchItem.tsx:20"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b94d1ce80e359fc6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/todos/ActivityItem.tsx:37", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/todos/ActivityItem.tsx:37"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0c8769d2d8268461", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/agent/TaskListItem.tsx:40", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/agent/TaskListItem.tsx:40"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1f86df90b4960dca", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/conference/ConferenceProgramEditor.tsx:896", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/conference/ConferenceProgramEditor.tsx:896"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5c6f90157c86b0f4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/conference/ConferenceProgramStats.tsx:134", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/conference/ConferenceProgramStats.tsx:134"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4376ed9c206f830c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/insights/MemberReportView.tsx:289", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/insights/MemberReportView.tsx:289"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9dd2da9309c73427", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/insights/OperationalKpiSection.tsx:126", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/insights/OperationalKpiSection.tsx:126"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ba1385c891e6e756", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/insights/WeeklyOperationsSummary.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/insights/WeeklyOperationsSummary.tsx:92"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-18a8d24795d53fdf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/insights/UserActivityLogView.tsx:213", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/insights/UserActivityLogView.tsx:213"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a4d02d5aaf7b21ef", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/admin/AdminNewsletterTab.tsx:946", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/admin/AdminNewsletterTab.tsx:946"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d41cbc424a29929c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/admin/HandoverSection.tsx:203", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/admin/HandoverSection.tsx:203"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b28147b21675fdae", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/admin/AdminInquiryTab.tsx:213", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/admin/AdminInquiryTab.tsx:213"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4f2500d96c964da0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/admin/AdminPostTab.tsx:260", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/admin/AdminPostTab.tsx:260"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5ca3ed2051f77d6d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/admin/AdminAgentTab.tsx:77", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/admin/AdminAgentTab.tsx:77"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c2a511e8072dc1f0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/admin/settings/OrgChartEditor.tsx:258", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/admin/settings/OrgChartEditor.tsx:258"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8339cccb116e75f4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/seminar/SeminarLMS.tsx:205", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/seminar/SeminarLMS.tsx:205"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c7e02ff40d737a16", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/seminar/MaterialsSection.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/seminar/MaterialsSection.tsx:149"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9a39165536c2e33f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/seminar/SeminarList.tsx:150", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/seminar/SeminarList.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-eaff338693bf7c39", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/defense/DefensePracticeRunner.tsx:1359", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/defense/DefensePracticeRunner.tsx:1359"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b4f3a48b56f44bb5", "name": "Stray `console.log` in TS/JS \u2014 src/features/defense/DefensePracticeRunner.tsx:630", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/features/defense/DefensePracticeRunner.tsx:630"}, "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-9e3dbbe3c563fea7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/activities/ActivityDetail.tsx:1525", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/activities/ActivityDetail.tsx:1525"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0e132d3207ac3e1e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/activities/StudySessionPreClassCard.tsx:304", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/activities/StudySessionPreClassCard.tsx:304"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-313a41fd9efd8f13", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/activities/ActivityWeekDetailPage.tsx:303", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/activities/ActivityWeekDetailPage.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-2763198e5a6e87fe", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/activities/StudyMaterialArchive.tsx:174", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/activities/StudyMaterialArchive.tsx:174"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df9b4d05caa0067a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/comm-board/CommBoardSection.tsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/comm-board/CommBoardSection.tsx:78"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8589494e3f6e332c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/comm-board/WallBoard.tsx:408", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/comm-board/WallBoard.tsx:408"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6aea282b0ab4f179", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/popup/PopupListView.tsx:116", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/popup/PopupListView.tsx:116"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b1d7b9eb94a2fb29", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/academic-admin/Dashboard.tsx:168", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/academic-admin/Dashboard.tsx:168"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f37399e10dcf83a8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/courses/ScheduleEditor.tsx:266", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/courses/ScheduleEditor.tsx:266"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0ad486bb05684ef3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/card/ReceivedCardsSection.tsx:303", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/card/ReceivedCardsSection.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-0b70614d74931c49", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/card/BusinessCard.tsx:104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/card/BusinessCard.tsx:104"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-90bcd9024bfd4889", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/card-news/CardNewsEditor.tsx:402", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/card-news/CardNewsEditor.tsx:402"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9f8c0dd1d28d9ac5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/mypage/HabitTracker.tsx:556", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/mypage/HabitTracker.tsx:556"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3064204df1751fd9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/mypage/ResearchTimerCompact.tsx:83", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/mypage/ResearchTimerCompact.tsx:83"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d4c9ce85826397b6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/board/InterviewBuilder.tsx:747", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/board/InterviewBuilder.tsx:747"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8374d4df302c4e60", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/board/PostList.tsx:50", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/board/PostList.tsx:50"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-93647f6e479a784b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/board/InterviewPlayer.tsx:366", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/board/InterviewPlayer.tsx:366"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ea9a337545b6b0d5", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/features/board/PostForm.tsx:266", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/features/board/PostForm.tsx:266"}, "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-b03546d82e1d16e2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/research-analytics/TitleNgramTrend.tsx:215", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research-analytics/TitleNgramTrend.tsx:215"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b9e37ef9f6c98105", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/research-analytics/MultiAxisTrend.tsx:172", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research-analytics/MultiAxisTrend.tsx:172"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-54fb4ef65997dc2d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/research-analytics/ResearchSearch.tsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research-analytics/ResearchSearch.tsx:78"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5fb640e6f0bd14a5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/research-analytics/SubjectDistribution.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research-analytics/SubjectDistribution.tsx:171"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6a1243fc14a66623", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/research-analytics/ResearchTypeChart.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research-analytics/ResearchTypeChart.tsx:109"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4320b0228fbe837a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/features/research-analytics/MethodProfile.tsx:63", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research-analytics/MethodProfile.tsx:63"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-06ca3dd7a15f54eb", "name": "Possible secret in scripts/seed-newsletter-issue-1.mjs", "shortDescription": {"text": "Possible secret in scripts/seed-newsletter-issue-1.mjs"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-06171bf77374bd26", "name": "Possible secret in scripts/rollback-press-migration.mjs", "shortDescription": {"text": "Possible secret in scripts/rollback-press-migration.mjs"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-f907f991d48a4c77", "name": "Possible secret in scripts/reset-admin.mjs", "shortDescription": {"text": "Possible secret in scripts/reset-admin.mjs"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-342eb35d7a332e2d", "name": "Insecure pattern 'node_child_process' in scripts/deploy-vercel.js:28", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/deploy-vercel.js:28"}, "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-705f0d1aa02a8488", "name": "Possible secret in scripts/migrate-press-to-promotion.mjs", "shortDescription": {"text": "Possible secret in scripts/migrate-press-to-promotion.mjs"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-015952032f09c501", "name": "Possible secret in scripts/check-alumni-theses-count.mjs", "shortDescription": {"text": "Possible secret in scripts/check-alumni-theses-count.mjs"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-8ba8fa082c70cf8f", "name": "Possible secret in scripts/create-admin.mjs", "shortDescription": {"text": "Possible secret in scripts/create-admin.mjs"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-e694198a0aa9d0b8", "name": "Insecure pattern 'cors_wildcard' in agent-server/main.py:42", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in agent-server/main.py:42"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-09a2568293c38aa8", "name": "Possible secret in public/firebase-messaging-sw.js", "shortDescription": {"text": "Possible secret in public/firebase-messaging-sw.js"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-84507cbd22516b57", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/diagnosis/DiagnosisRunner.tsx:316", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/diagnosis/DiagnosisRunner.tsx:316"}, "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-5af5c23137958525", "name": "Possible secret in src/components/mypage/MyPageView.tsx", "shortDescription": {"text": "Possible secret in src/components/mypage/MyPageView.tsx"}, "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-f45019270621c124", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/JsonLd.tsx:52", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/JsonLd.tsx:52"}, "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-48f0aa29dc48dbf5", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:138", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:138"}, "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-82b6e13a157643a8", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/board/[id]/page.tsx:306", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/board/[id]/page.tsx:306"}, "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-b7ff64d4d338ed2c", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/features/seminar-admin/NametagGenerator.tsx:542", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/features/seminar-admin/NametagGenerator.tsx:542"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6e865ca034188bc2", "name": "Insecure pattern 'document_write' in src/features/seminar-admin/ReportTab.tsx:116", "shortDescription": {"text": "Insecure pattern 'document_write' in src/features/seminar-admin/ReportTab.tsx:116"}, "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-bbb203d415f4cea4", "name": "Insecure pattern 'document_write' in src/features/seminar-admin/RegistrationsTab.tsx:202", "shortDescription": {"text": "Insecure pattern 'document_write' in src/features/seminar-admin/RegistrationsTab.tsx:202"}, "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-f914c864614420ff", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/features/seminar-admin/CertificateGenerator.tsx:1595", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/features/seminar-admin/CertificateGenerator.tsx:1595"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-39baf21e2155b688", "name": "Insecure pattern 'dangerous_innerhtml' in src/features/board/PostForm.tsx:266", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/features/board/PostForm.tsx:266"}, "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-28c4a04bd807da0c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-node@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-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-node@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-8ec2dc0f4dac26c9", "name": "Very large file: src/components/mypage/MyPageView.tsx (1671 lines)", "shortDescription": {"text": "Very large file: src/components/mypage/MyPageView.tsx (1671 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-6a57f746093c70fc", "name": "Very large file: src/app/console/courses/page.tsx (2024 lines)", "shortDescription": {"text": "Very large file: src/app/console/courses/page.tsx (2024 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-08b3fe14265d26ba", "name": "Very large file: src/app/courses/page.tsx (1595 lines)", "shortDescription": {"text": "Very large file: src/app/courses/page.tsx (1595 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-5c825dae50d7e1ab", "name": "Very large file: src/app/courses/[id]/schedule/page.tsx (1635 lines)", "shortDescription": {"text": "Very large file: src/app/courses/[id]/schedule/page.tsx (1635 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-c8ccc1e858ed5761", "name": "Very large file: src/lib/diagnostic-seed.ts (2048 lines)", "shortDescription": {"text": "Very large file: src/lib/diagnostic-seed.ts (2048 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-b28b081c27329926", "name": "Very large file: src/lib/bkend.ts (3812 lines)", "shortDescription": {"text": "Very large file: src/lib/bkend.ts (3812 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-cba1926c7b915693", "name": "Very large file: src/lib/archive-seed.ts (1310 lines)", "shortDescription": {"text": "Very large file: src/lib/archive-seed.ts (1310 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-d7d81cfa84bc3d02", "name": "Very large file: src/features/seminar-admin/RegistrationsTab.tsx (1547 lines)", "shortDescription": {"text": "Very large file: src/features/seminar-admin/RegistrationsTab.tsx (1547 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-e64791268a8fa2d6", "name": "Very large file: src/features/seminar-admin/CertificateGenerator.tsx (2385 lines)", "shortDescription": {"text": "Very large file: src/features/seminar-admin/CertificateGenerator.tsx (2385 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-05e081aac7bc7fb7", "name": "Very large file: src/features/research/ResearchReportInterview.tsx (2217 lines)", "shortDescription": {"text": "Very large file: src/features/research/ResearchReportInterview.tsx (2217 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-757520f6b91658f8", "name": "Very large file: src/features/research/WritingPaperEditor.tsx (2531 lines)", "shortDescription": {"text": "Very large file: src/features/research/WritingPaperEditor.tsx (2531 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-a196e1519948acae", "name": "Very large file: src/features/research/ResearchReportEditor.tsx (2075 lines)", "shortDescription": {"text": "Very large file: src/features/research/ResearchReportEditor.tsx (2075 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-9bbb2c59024997be", "name": "Very large file: src/features/conference/ConferenceProgramEditor.tsx (1707 lines)", "shortDescription": {"text": "Very large file: src/features/conference/ConferenceProgramEditor.tsx (1707 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-9115420c7b0a5449", "name": "Very large file: src/features/conference/ConferenceProgramView.tsx (1148 lines)", "shortDescription": {"text": "Very large file: src/features/conference/ConferenceProgramView.tsx (1148 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-f58664eaf5d8b6c8", "name": "Very large file: src/features/admin/AdminMemberTab.tsx (1135 lines)", "shortDescription": {"text": "Very large file: src/features/admin/AdminMemberTab.tsx (1135 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-00e1e3285b2b9144", "name": "Very large file: src/features/defense/DefensePracticeRunner.tsx (2673 lines)", "shortDescription": {"text": "Very large file: src/features/defense/DefensePracticeRunner.tsx (2673 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-e4ae60068abf12d8", "name": "Very large file: src/features/activities/ActivityDetail.tsx (3530 lines)", "shortDescription": {"text": "Very large file: src/features/activities/ActivityDetail.tsx (3530 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "43 test file(s) for 1118 source file(s) (ratio 0.04). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 411 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 951 placeholder/mock markers across 217 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-eb17730cdb0455f9", "name": "Commented-code block (6 lines) in scripts/sync-archive-crosslinks.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/sync-archive-crosslinks.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-22fd54d64b5ee38d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/poc-research-review.mjs:96", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/poc-research-review.mjs:96"}, "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-fdba8494a623bed3", "name": "Commented-code block (14 lines) in scripts/enrich-measurement-tools.ts:1", "shortDescription": {"text": "Commented-code block (14 lines) in scripts/enrich-measurement-tools.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3a688844c2ce9b5d", "name": "Commented-code block (6 lines) in scripts/extract-thesis-analysis.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/extract-thesis-analysis.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6ee987d8d136c084", "name": "Commented-code block (6 lines) in scripts/seed-concept-scholars.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/seed-concept-scholars.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e0f1a17b0e61a472", "name": "Commented-code block (5 lines) in scripts/seed-measurement-scales.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/seed-measurement-scales.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-62c1579eb5bd326e", "name": "Commented-code block (9 lines) in scripts/seed-learning-theories.ts:1", "shortDescription": {"text": "Commented-code block (9 lines) in scripts/seed-learning-theories.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-413d6bb839384a30", "name": "Commented-code block (5 lines) in scripts/link-theses-concepts.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/link-theses-concepts.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-de48fd5c2e421c1f", "name": "Commented-code block (6 lines) in scripts/rebuild-thesis-method-links.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/rebuild-thesis-method-links.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f385f8a63ec5b6f5", "name": "Commented-code block (6 lines) in scripts/seed-assumption-remedies.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/seed-assumption-remedies.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c7192d29495c800b", "name": "Commented-code block (6 lines) in scripts/seed-tf-values.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/seed-tf-values.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ac45228de4e86e5b", "name": "Commented-code block (7 lines) in scripts/seed-variable-domains.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/seed-variable-domains.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e2a851a341f21a3d", "name": "Commented-code block (6 lines) in scripts/seed-writing-cvi.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/seed-writing-cvi.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0f343321eaae2b77", "name": "Commented-code block (5 lines) in scripts/reclassify-concepts.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/reclassify-concepts.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-efb9937f95d2139b", "name": "Commented-code block (6 lines) in scripts/seed-scale-development.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/seed-scale-development.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-99dce57f3ace56dc", "name": "Commented-code block (5 lines) in scripts/seed-jamovi-guides.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/seed-jamovi-guides.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-33bcfe865d096ac4", "name": "Commented-code block (5 lines) in scripts/seed-cognitive-measurements.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/seed-cognitive-measurements.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0660fbe98b0be0e5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:51", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js: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-ef17792a63ba86a0", "name": "Commented-code block (5 lines) in src/types/user.ts:134", "shortDescription": {"text": "Commented-code block (5 lines) in src/types/user.ts:134"}, "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-22db83837fb0399b", "name": "Commented-code block (5 lines) in src/types/flashcard.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/types/flashcard.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1b16df7111fdaa59", "name": "Commented-code block (5 lines) in src/types/operations.ts:230", "shortDescription": {"text": "Commented-code block (5 lines) in src/types/operations.ts:230"}, "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-e6199d1e8f31440c", "name": "Legacy-named symbol `yonsei_whats_new_dismissed_v2` in src/components/mypage/MyPageView.tsx:111", "shortDescription": {"text": "Legacy-named symbol `yonsei_whats_new_dismissed_v2` in src/components/mypage/MyPageView.tsx:111"}, "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-6ec5e0cc29ea6e7b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mypage/MyPageView.tsx:184", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mypage/MyPageView.tsx:184"}, "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-e4cab354a6726bc4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mypage/MyActivitiesView.tsx:104", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mypage/MyActivitiesView.tsx:104"}, "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-d67fc577de8997a7", "name": "Legacy-named symbol `yedu_dashboard_diet_notice_v1` in src/app/dashboard/page.tsx:200", "shortDescription": {"text": "Legacy-named symbol `yedu_dashboard_diet_notice_v1` in src/app/dashboard/page.tsx:200"}, "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-500bb2e7b2592e86", "name": "Legacy-named symbol `yonsei_whats_new_dismissed_v2` in src/app/whats-new/page.tsx:24", "shortDescription": {"text": "Legacy-named symbol `yonsei_whats_new_dismissed_v2` in src/app/whats-new/page.tsx:24"}, "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-c33c1cd5dcaf56c0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/certificates/page.tsx:104", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/certificates/page.tsx:104"}, "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-3b07ebd965782d23", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/seminars/[id]/page.tsx:94", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/seminars/[id]/page.tsx:94"}, "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-736b87167ce47192", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/seminars/[id]/review/page.tsx:168", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/seminars/[id]/review/page.tsx:168"}, "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-43239a215d1b7853", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/seminars/[id]/speaker-review/page.tsx:349", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/seminars/[id]/speaker-review/page.tsx:349"}, "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-402e84b4f9e70d0a", "name": "Legacy-named symbol `yedu_content_seed_done_v1` in src/app/console/page.tsx:64", "shortDescription": {"text": "Legacy-named symbol `yedu_content_seed_done_v1` in src/app/console/page.tsx:64"}, "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-0c0ae449eea2150b", "name": "Legacy-named symbol `deleteOld` in src/app/mypage/notifications/page.tsx:231", "shortDescription": {"text": "Legacy-named symbol `deleteOld` in src/app/mypage/notifications/page.tsx:231"}, "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-b85c175394aee73e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/board/[id]/page.tsx:83", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/board/[id]/page.tsx:83"}, "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-fd26f67baaabe7d8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/guestLinker.ts:70", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/guestLinker.ts:70"}, "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-c9b25c6af5ec664c", "name": "Commented-code block (14 lines) in src/lib/diagnostic-seed.ts:3", "shortDescription": {"text": "Commented-code block (14 lines) in src/lib/diagnostic-seed.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dcac9b9cae59bb62", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/storage.ts:52", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/storage.ts:52"}, "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-6eb7bfbc1eb46e3d", "name": "Commented-code block (6 lines) in src/lib/writing-tips-seed.ts:6", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/writing-tips-seed.ts:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9052ddacf1851d86", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/push.ts:103", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/push.ts:103"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-01cdd1ce93d50faf", "name": "Commented-code block (5 lines) in src/lib/bkend.ts:2748", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/bkend.ts:2748"}, "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-2b52caa6753c9d01", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/bkend.ts:2427", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/bkend.ts:2427"}, "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-1380b04bc7c05ef8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/research-paper-source.ts:103", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/research-paper-source.ts:103"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7173a28e9ba0ea2b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/seminar-admin/RegistrationsTab.tsx:815", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/seminar-admin/RegistrationsTab.tsx:815"}, "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-58af3610fadc8fed", "name": "Commented-code block (5 lines) in src/features/auth/AuthProvider.tsx:53", "shortDescription": {"text": "Commented-code block (5 lines) in src/features/auth/AuthProvider.tsx:53"}, "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-e47c2fddaab14dfe", "name": "Commented-code block (14 lines) in src/features/research/ResearchReportInterview.tsx:415", "shortDescription": {"text": "Commented-code block (14 lines) in src/features/research/ResearchReportInterview.tsx:415"}, "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-110d891582392fdb", "name": "Legacy-named symbol `yedu_welcome_banner_dismissed_v1` in src/features/dashboard/NewMemberWelcomeBanner.tsx:14", "shortDescription": {"text": "Legacy-named symbol `yedu_welcome_banner_dismissed_v1` in src/features/dashboard/NewMemberWelcomeBanner.tsx:14"}, "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-d15e8ecf0023ad6a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/dashboard/NewMemberChecklistWidget.tsx:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/dashboard/NewMemberChecklistWidget.tsx:7"}, "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-0589b152d4ca0f2b", "name": "Commented-code block (6 lines) in src/features/dashboard/widget-visibility.ts:47", "shortDescription": {"text": "Commented-code block (6 lines) in src/features/dashboard/widget-visibility.ts:47"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f2df04701de57fee", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/agent/useAgentServer.ts:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/agent/useAgentServer.ts:60"}, "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-f4a8f1b68e77e7db", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/seminar/SeminarReviews.tsx:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/seminar/SeminarReviews.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-18b9d926155560b4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/activities/StudySessionAssignmentsCard.tsx:146", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/activities/StudySessionAssignmentsCard.tsx:146"}, "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-8bcfc89e9f64d2bd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/activities/ActivityPage.tsx:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/activities/ActivityPage.tsx:45"}, "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-b2431f2254f13a12", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/activities/ActivityDetail.tsx:274", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/activities/ActivityDetail.tsx:274"}, "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-4f3023f2d7293a1d", "name": "Commented-code block (5 lines) in src/features/activities/FormBuilder.tsx:62", "shortDescription": {"text": "Commented-code block (5 lines) in src/features/activities/FormBuilder.tsx:62"}, "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-08919dff68ba37bd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/activities/StudySessionReflectionCard.tsx:97", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/activities/StudySessionReflectionCard.tsx:97"}, "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-3a4eb7f365b72c08", "name": "Legacy-named symbol `yedu_comm_guest_name_v1` in src/features/comm-board/guest-name.ts:9", "shortDescription": {"text": "Legacy-named symbol `yedu_comm_guest_name_v1` in src/features/comm-board/guest-name.ts:9"}, "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-835a2355a3836354", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/board/InterviewBuilder.tsx:515", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/board/InterviewBuilder.tsx:515"}, "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-dff5749bd2fabf46", "name": "Legacy-named symbol `yedu_post_draft_v1` in src/features/board/PostForm.tsx:73", "shortDescription": {"text": "Legacy-named symbol `yedu_post_draft_v1` in src/features/board/PostForm.tsx:73"}, "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-ade92878d4c6d72d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/yonsei-agents/useAgentJobs.ts:69", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/yonsei-agents/useAgentJobs.ts:69"}, "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-2d6ffa20a9f1093b", "name": "24 env vars used in code but missing from .env.example", "shortDescription": {"text": "24 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AUTH_TOKEN`, `BASE_URL`, `CHROME_PATH`, `CRON_SECRET`, `FIREBASE_SERVICE_ACCOUNT_KEY`, `GOOGLE_GENERATIVE_AI_API_KEY`, `HOST`, `NEXT_PUBLIC_FIREBASE_API_KEY` + 16 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}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nagent-server/store.py:get_agents, agent-server/store.py:get_agent\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c635a4715a4e2102", "name": "Dangling fetch: GET https://api.crossref.org/works/${encodeURIComponent(doi)} (scripts/poc-research-review.mjs:119)", "shortDescription": {"text": "Dangling fetch: GET https://api.crossref.org/works/${encodeURIComponent(doi)} (scripts/poc-research-review.mjs:119)"}, "fullDescription": {"text": "`scripts/poc-research-review.mjs:119` calls `GET https://api.crossref.org/works/${encodeURIComponent(doi)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.crossref.org/works/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5691bc754efd4be0", "name": "Dangling fetch: POST https://api.semanticscholar.org/graph/v1/paper/DOI:${encodeURIComponent(doi)}?fields=abstract,tldr ", "shortDescription": {"text": "Dangling fetch: POST https://api.semanticscholar.org/graph/v1/paper/DOI:${encodeURIComponent(doi)}?fields=abstract,tldr (scripts/poc-research-review.mjs:137)"}, "fullDescription": {"text": "`scripts/poc-research-review.mjs:137` calls `POST https://api.semanticscholar.org/graph/v1/paper/DOI:${encodeURIComponent(doi)}?fields=abstract,tldr` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.semanticscholar.org/graph/v1/paper/doi:/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f35c95c353c65548", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (scripts/poc-research-review.mjs:216)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (scripts/poc-research-review.mjs:216)"}, "fullDescription": {"text": "`scripts/poc-research-review.mjs:216` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7cf69fec28628942", "name": "Dangling fetch: POST /api/admin/impersonate/revert (src/components/layout/ImpersonationBanner.tsx:47)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/impersonate/revert (src/components/layout/ImpersonationBanner.tsx:47)"}, "fullDescription": {"text": "`src/components/layout/ImpersonationBanner.tsx:47` calls `POST /api/admin/impersonate/revert` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/impersonate/revert`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3878f944f974792c", "name": "Dangling fetch: GET /api/me/applications (src/components/mypage/MyPageView.tsx:184)", "shortDescription": {"text": "Dangling fetch: GET /api/me/applications (src/components/mypage/MyPageView.tsx:184)"}, "fullDescription": {"text": "`src/components/mypage/MyPageView.tsx:184` calls `GET /api/me/applications` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/me/applications`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-307ff6282a471ec0", "name": "Dangling fetch: GET /api/me/applications (src/components/mypage/MyActivitiesView.tsx:104)", "shortDescription": {"text": "Dangling fetch: GET /api/me/applications (src/components/mypage/MyActivitiesView.tsx:104)"}, "fullDescription": {"text": "`src/components/mypage/MyActivitiesView.tsx:104` calls `GET /api/me/applications` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/me/applications`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f109595d31ea3645", "name": "Dangling fetch: GET https://fonts.gstatic.com/s/nanumgothic/v23/PN_3Rfu-cuLQmEsRPRm90Q.woff2 (src/app/archive/[type]/[id", "shortDescription": {"text": "Dangling fetch: GET https://fonts.gstatic.com/s/nanumgothic/v23/PN_3Rfu-cuLQmEsRPRm90Q.woff2 (src/app/archive/[type]/[id]/opengraph-image.tsx:77)"}, "fullDescription": {"text": "`src/app/archive/[type]/[id]/opengraph-image.tsx:77` calls `GET https://fonts.gstatic.com/s/nanumgothic/v23/PN_3Rfu-cuLQmEsRPRm90Q.woff2` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/fonts.gstatic.com/s/nanumgothic/v23/pn_3rfu-culqmesrprm90q.woff2`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-52da7678014737ef", "name": "Dangling fetch: POST /api/auth/forgot-password/verify (src/app/forgot-password/page.tsx:51)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/forgot-password/verify (src/app/forgot-password/page.tsx:51)"}, "fullDescription": {"text": "`src/app/forgot-password/page.tsx:51` calls `POST /api/auth/forgot-password/verify` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/forgot-password/verify`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5ecdea3690364a65", "name": "Dangling fetch: POST /api/auth/forgot-password/answer (src/app/forgot-password/page.tsx:74)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/forgot-password/answer (src/app/forgot-password/page.tsx:74)"}, "fullDescription": {"text": "`src/app/forgot-password/page.tsx:74` calls `POST /api/auth/forgot-password/answer` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/forgot-password/answer`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ab19496105bfe896", "name": "Dangling fetch: GET https://fonts.gstatic.com/s/nanumgothic/v23/PN_3Rfu-cuLQmEsRPRm90Q.woff2 (src/app/alumni/thesis/[id]", "shortDescription": {"text": "Dangling fetch: GET https://fonts.gstatic.com/s/nanumgothic/v23/PN_3Rfu-cuLQmEsRPRm90Q.woff2 (src/app/alumni/thesis/[id]/opengraph-image.tsx:60)"}, "fullDescription": {"text": "`src/app/alumni/thesis/[id]/opengraph-image.tsx:60` calls `GET https://fonts.gstatic.com/s/nanumgothic/v23/PN_3Rfu-cuLQmEsRPRm90Q.woff2` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/fonts.gstatic.com/s/nanumgothic/v23/pn_3rfu-culqmesrprm90q.woff2`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bc0f8bc31527274e", "name": "Dangling fetch: POST /api/certificates/batch (src/app/admin/certificates/page.tsx:104)", "shortDescription": {"text": "Dangling fetch: POST /api/certificates/batch (src/app/admin/certificates/page.tsx:104)"}, "fullDescription": {"text": "`src/app/admin/certificates/page.tsx:104` calls `POST /api/certificates/batch` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/certificates/batch`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-17803ba8d92fa8be", "name": "Dangling fetch: POST /api/certificates/email (src/app/admin/certificates/page.tsx:168)", "shortDescription": {"text": "Dangling fetch: POST /api/certificates/email (src/app/admin/certificates/page.tsx:168)"}, "fullDescription": {"text": "`src/app/admin/certificates/page.tsx:168` calls `POST /api/certificates/email` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/certificates/email`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fe4f9312a5b42a42", "name": "Dangling fetch: POST /api/certificates/pdf (src/app/admin/certificates/page.tsx:358)", "shortDescription": {"text": "Dangling fetch: POST /api/certificates/pdf (src/app/admin/certificates/page.tsx:358)"}, "fullDescription": {"text": "`src/app/admin/certificates/page.tsx:358` calls `POST /api/certificates/pdf` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/certificates/pdf`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e837ddfc64cefb36", "name": "Dangling fetch: GET /api/admin/audit-users (src/app/admin/user-audit/page.tsx:49)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/audit-users (src/app/admin/user-audit/page.tsx:49)"}, "fullDescription": {"text": "`src/app/admin/user-audit/page.tsx:49` calls `GET /api/admin/audit-users` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/audit-users`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ba9bea5dd1b58463", "name": "Dangling fetch: POST /api/ai/semester-report (src/app/admin/semester-report/page.tsx:31)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/semester-report (src/app/admin/semester-report/page.tsx:31)"}, "fullDescription": {"text": "`src/app/admin/semester-report/page.tsx:31` calls `POST /api/ai/semester-report` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/semester-report`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-510a709a27afbb61", "name": "Dangling fetch: GET https://fonts.gstatic.com/s/nanumgothic/v23/PN_3Rfu-cuLQmEsRPRm90Q.woff2 (src/app/seminars/[id]/open", "shortDescription": {"text": "Dangling fetch: GET https://fonts.gstatic.com/s/nanumgothic/v23/PN_3Rfu-cuLQmEsRPRm90Q.woff2 (src/app/seminars/[id]/opengraph-image.tsx:63)"}, "fullDescription": {"text": "`src/app/seminars/[id]/opengraph-image.tsx:63` calls `GET https://fonts.gstatic.com/s/nanumgothic/v23/PN_3Rfu-cuLQmEsRPRm90Q.woff2` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/fonts.gstatic.com/s/nanumgothic/v23/pn_3rfu-culqmesrprm90q.woff2`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1047acb1ca7f0d67", "name": "Dangling fetch: GET /api/reviews?seminarId=${seminarId}&mode=list (src/app/seminars/[id]/page.tsx:94)", "shortDescription": {"text": "Dangling fetch: GET /api/reviews?seminarId=${seminarId}&mode=list (src/app/seminars/[id]/page.tsx:94)"}, "fullDescription": {"text": "`src/app/seminars/[id]/page.tsx:94` calls `GET /api/reviews?seminarId=${seminarId}&mode=list` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/reviews`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5ece71718f2d1270", "name": "Dangling fetch: GET /api/reviews?${params} (src/app/seminars/[id]/review/page.tsx:84)", "shortDescription": {"text": "Dangling fetch: GET /api/reviews?${params} (src/app/seminars/[id]/review/page.tsx:84)"}, "fullDescription": {"text": "`src/app/seminars/[id]/review/page.tsx:84` calls `GET /api/reviews?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/reviews`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7cbf403d157c85a4", "name": "Dangling fetch: PATCH /api/reviews (src/app/seminars/[id]/review/page.tsx:151)", "shortDescription": {"text": "Dangling fetch: PATCH /api/reviews (src/app/seminars/[id]/review/page.tsx:151)"}, "fullDescription": {"text": "`src/app/seminars/[id]/review/page.tsx:151` calls `PATCH /api/reviews` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/reviews`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2339c08e29adc5a9", "name": "Dangling fetch: POST /api/reviews (src/app/seminars/[id]/review/page.tsx:168)", "shortDescription": {"text": "Dangling fetch: POST /api/reviews (src/app/seminars/[id]/review/page.tsx:168)"}, "fullDescription": {"text": "`src/app/seminars/[id]/review/page.tsx:168` calls `POST /api/reviews` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/reviews`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-329d74cb78b41355", "name": "Dangling fetch: GET /api/reviews/cert-no?seminarId=${seminarId}&speakerName=${encodeURIComponent(speakerName)} (src/app/", "shortDescription": {"text": "Dangling fetch: GET /api/reviews/cert-no?seminarId=${seminarId}&speakerName=${encodeURIComponent(speakerName)} (src/app/seminars/[id]/speaker-review/page.tsx:219)"}, "fullDescription": {"text": "`src/app/seminars/[id]/speaker-review/page.tsx:219` calls `GET /api/reviews/cert-no?seminarId=${seminarId}&speakerName=${encodeURIComponent(speakerName)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/reviews/cert-no`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ee41ab99b4cd5f5d", "name": "Dangling fetch: GET /api/reviews?${params} (src/app/seminars/[id]/speaker-review/page.tsx:281)", "shortDescription": {"text": "Dangling fetch: GET /api/reviews?${params} (src/app/seminars/[id]/speaker-review/page.tsx:281)"}, "fullDescription": {"text": "`src/app/seminars/[id]/speaker-review/page.tsx:281` calls `GET /api/reviews?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/reviews`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1f8a3da0fc922733", "name": "Dangling fetch: PATCH /api/reviews (src/app/seminars/[id]/speaker-review/page.tsx:331)", "shortDescription": {"text": "Dangling fetch: PATCH /api/reviews (src/app/seminars/[id]/speaker-review/page.tsx:331)"}, "fullDescription": {"text": "`src/app/seminars/[id]/speaker-review/page.tsx:331` calls `PATCH /api/reviews` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/reviews`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6344c719f192abcc", "name": "Dangling fetch: POST /api/reviews (src/app/seminars/[id]/speaker-review/page.tsx:349)", "shortDescription": {"text": "Dangling fetch: POST /api/reviews (src/app/seminars/[id]/speaker-review/page.tsx:349)"}, "fullDescription": {"text": "`src/app/seminars/[id]/speaker-review/page.tsx:349` calls `POST /api/reviews` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/reviews`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-21ffaf2a4ebaa3bf", "name": "Dangling fetch: POST /api/admin/seed-board-content (src/app/console/page.tsx:78)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/seed-board-content (src/app/console/page.tsx:78)"}, "fullDescription": {"text": "`src/app/console/page.tsx:78` calls `POST /api/admin/seed-board-content` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/seed-board-content`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-18bd99621b49aaab", "name": "Dangling fetch: POST /api/admin/ai-forum/advance (src/app/console/ai-forum/page.tsx:139)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/ai-forum/advance (src/app/console/ai-forum/page.tsx:139)"}, "fullDescription": {"text": "`src/app/console/ai-forum/page.tsx:139` calls `POST /api/admin/ai-forum/advance` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/ai-forum/advance`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8ade07e228dad50b", "name": "Dangling fetch: GET /api/console/potential-members (src/app/console/potential-members/page.tsx:50)", "shortDescription": {"text": "Dangling fetch: GET /api/console/potential-members (src/app/console/potential-members/page.tsx:50)"}, "fullDescription": {"text": "`src/app/console/potential-members/page.tsx:50` calls `GET /api/console/potential-members` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/console/potential-members`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-98da703e96f5fcf5", "name": "Dangling fetch: POST /api/ai/agent-workflow (src/app/console/agent-workflows/page.tsx:45)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/agent-workflow (src/app/console/agent-workflows/page.tsx:45)"}, "fullDescription": {"text": "`src/app/console/agent-workflows/page.tsx:45` calls `POST /api/ai/agent-workflow` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/agent-workflow`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-363d7cbcb4de63b8", "name": "Dangling fetch: POST /api/admin/impersonate (src/app/console/members/[id]/page.tsx:59)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/impersonate (src/app/console/members/[id]/page.tsx:59)"}, "fullDescription": {"text": "`src/app/console/members/[id]/page.tsx:59` calls `POST /api/admin/impersonate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/impersonate`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1095be5379e6d056", "name": "Dangling fetch: POST /api/admin/reset-password (src/app/console/members/[id]/page.tsx:174)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/reset-password (src/app/console/members/[id]/page.tsx:174)"}, "fullDescription": {"text": "`src/app/console/members/[id]/page.tsx:174` calls `POST /api/admin/reset-password` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/reset-password`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-476853b85147e467", "name": "Dangling fetch: POST /api/admin/migrate-applicants?mode=${mode} (src/app/console/migrate-applicants/page.tsx:38)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/migrate-applicants?mode=${mode} (src/app/console/migrate-applicants/page.tsx:38)"}, "fullDescription": {"text": "`src/app/console/migrate-applicants/page.tsx:38` calls `POST /api/admin/migrate-applicants?mode=${mode}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/migrate-applicants`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c723739ed8cff33d", "name": "Dangling fetch: POST /api/admin/roadmap/seed (src/app/console/roadmap/page.tsx:194)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/roadmap/seed (src/app/console/roadmap/page.tsx:194)"}, "fullDescription": {"text": "`src/app/console/roadmap/page.tsx:194` calls `POST /api/admin/roadmap/seed` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/roadmap/seed`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b85ffbbdb0c973c5", "name": "Dangling fetch: GET https://fonts.gstatic.com/s/nanumgothic/v23/PN_3Rfu-cuLQmEsRPRm90Q.woff2 (src/app/card-news/[id]/ope", "shortDescription": {"text": "Dangling fetch: GET https://fonts.gstatic.com/s/nanumgothic/v23/PN_3Rfu-cuLQmEsRPRm90Q.woff2 (src/app/card-news/[id]/opengraph-image.tsx:11)"}, "fullDescription": {"text": "`src/app/card-news/[id]/opengraph-image.tsx:11` calls `GET https://fonts.gstatic.com/s/nanumgothic/v23/PN_3Rfu-cuLQmEsRPRm90Q.woff2` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/fonts.gstatic.com/s/nanumgothic/v23/pn_3rfu-culqmesrprm90q.woff2`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-65ffc4f044aa3ee0", "name": "Dangling fetch: GET /api/me/export (src/app/mypage/data-export/page.tsx:48)", "shortDescription": {"text": "Dangling fetch: GET /api/me/export (src/app/mypage/data-export/page.tsx:48)"}, "fullDescription": {"text": "`src/app/mypage/data-export/page.tsx:48` calls `GET /api/me/export` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/me/export`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-99a78bba3ed2d71f", "name": "Dangling fetch: GET /api/posts/${id}/vote (src/app/board/[id]/page.tsx:83)", "shortDescription": {"text": "Dangling fetch: GET /api/posts/${id}/vote (src/app/board/[id]/page.tsx:83)"}, "fullDescription": {"text": "`src/app/board/[id]/page.tsx:83` calls `GET /api/posts/${id}/vote` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts/<p>/vote`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3f6077ffa164ced4", "name": "Dangling fetch: POST /api/posts/${id}/vote (src/app/board/[id]/page.tsx:95)", "shortDescription": {"text": "Dangling fetch: POST /api/posts/${id}/vote (src/app/board/[id]/page.tsx:95)"}, "fullDescription": {"text": "`src/app/board/[id]/page.tsx:95` calls `POST /api/posts/${id}/vote` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/posts/<p>/vote`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9f35919f3a0f21f1", "name": "Dangling fetch: POST /api/auth/link-guest-applicants (src/lib/guestLinker.ts:70)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/link-guest-applicants (src/lib/guestLinker.ts:70)"}, "fullDescription": {"text": "`src/lib/guestLinker.ts:70` calls `POST /api/auth/link-guest-applicants` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/link-guest-applicants`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-30990205b6237740", "name": "Dangling fetch: POST /api/push/register (src/lib/push.ts:103)", "shortDescription": {"text": "Dangling fetch: POST /api/push/register (src/lib/push.ts:103)"}, "fullDescription": {"text": "`src/lib/push.ts:103` calls `POST /api/push/register` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/push/register`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f5560a9ca878bdb1", "name": "Dangling fetch: POST /api/push/unregister (src/lib/push.ts:129)", "shortDescription": {"text": "Dangling fetch: POST /api/push/unregister (src/lib/push.ts:129)"}, "fullDescription": {"text": "`src/lib/push.ts:129` calls `POST /api/push/unregister` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/push/unregister`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-384b29e5ab1bc5aa", "name": "Dangling fetch: GET https://api.crossref.org/works/${encodeURIComponent(doi)} (src/lib/crossref.ts:97)", "shortDescription": {"text": "Dangling fetch: GET https://api.crossref.org/works/${encodeURIComponent(doi)} (src/lib/crossref.ts:97)"}, "fullDescription": {"text": "`src/lib/crossref.ts:97` calls `GET https://api.crossref.org/works/${encodeURIComponent(doi)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.crossref.org/works/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2b8287f060036f11", "name": "Dangling fetch: GET /api/diagnosis/peer-stats (src/lib/bkend.ts:2427)", "shortDescription": {"text": "Dangling fetch: GET /api/diagnosis/peer-stats (src/lib/bkend.ts:2427)"}, "fullDescription": {"text": "`src/lib/bkend.ts:2427` calls `GET /api/diagnosis/peer-stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/diagnosis/peer-stats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8c9775618e46599f", "name": "Dangling fetch: GET /api/chatbot (src/lib/use-orchestra-chat.ts:71)", "shortDescription": {"text": "Dangling fetch: GET /api/chatbot (src/lib/use-orchestra-chat.ts:71)"}, "fullDescription": {"text": "`src/lib/use-orchestra-chat.ts:71` calls `GET /api/chatbot` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/chatbot`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e36a9b877efa915f", "name": "Dangling fetch: GET /api/sheets?url=${encodeURIComponent(csvUrl)} (src/features/seminar-admin/NametagGenerator.tsx:488)", "shortDescription": {"text": "Dangling fetch: GET /api/sheets?url=${encodeURIComponent(csvUrl)} (src/features/seminar-admin/NametagGenerator.tsx:488)"}, "fullDescription": {"text": "`src/features/seminar-admin/NametagGenerator.tsx:488` calls `GET /api/sheets?url=${encodeURIComponent(csvUrl)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sheets`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e74e65e5e0e5f3d3", "name": "Dangling fetch: GET /api/sheets?url=${encodeURIComponent(csvUrl)} (src/features/seminar-admin/ReportTab.tsx:539)", "shortDescription": {"text": "Dangling fetch: GET /api/sheets?url=${encodeURIComponent(csvUrl)} (src/features/seminar-admin/ReportTab.tsx:539)"}, "fullDescription": {"text": "`src/features/seminar-admin/ReportTab.tsx:539` calls `GET /api/sheets?url=${encodeURIComponent(csvUrl)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sheets`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7b8cb8b83f2c56ee", "name": "Dangling fetch: POST /api/parse-excel (src/features/seminar-admin/RegistrationsTab.tsx:815)", "shortDescription": {"text": "Dangling fetch: POST /api/parse-excel (src/features/seminar-admin/RegistrationsTab.tsx:815)"}, "fullDescription": {"text": "`src/features/seminar-admin/RegistrationsTab.tsx:815` calls `POST /api/parse-excel` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/parse-excel`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bfaba02554c2a1d1", "name": "Dangling fetch: GET /api/sheets?url=${encodeURIComponent(getSheetCsvUrl(sheetId))} (src/features/seminar-admin/Registrat", "shortDescription": {"text": "Dangling fetch: GET /api/sheets?url=${encodeURIComponent(getSheetCsvUrl(sheetId))} (src/features/seminar-admin/RegistrationsTab.tsx:865)"}, "fullDescription": {"text": "`src/features/seminar-admin/RegistrationsTab.tsx:865` calls `GET /api/sheets?url=${encodeURIComponent(getSheetCsvUrl(sheetId))}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sheets`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aa9a2ac508bf0ffd", "name": "Dangling fetch: POST /api/seminars/${seminar.id}/speaker-token (src/features/seminar-admin/ReviewManagement.tsx:179)", "shortDescription": {"text": "Dangling fetch: POST /api/seminars/${seminar.id}/speaker-token (src/features/seminar-admin/ReviewManagement.tsx:179)"}, "fullDescription": {"text": "`src/features/seminar-admin/ReviewManagement.tsx:179` calls `POST /api/seminars/${seminar.id}/speaker-token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/seminars/<p>/speaker-token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-52e6178f9b9cdeaa", "name": "Dangling fetch: POST /api/ai/poster (src/features/seminar-admin/PosterGenerator.tsx:53)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/poster (src/features/seminar-admin/PosterGenerator.tsx:53)"}, "fullDescription": {"text": "`src/features/seminar-admin/PosterGenerator.tsx:53` calls `POST /api/ai/poster` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/poster`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-026c9c4f41203149", "name": "Dangling fetch: POST /api/certificates/pdf (src/features/seminar-admin/CertificateGenerator.tsx:1490)", "shortDescription": {"text": "Dangling fetch: POST /api/certificates/pdf (src/features/seminar-admin/CertificateGenerator.tsx:1490)"}, "fullDescription": {"text": "`src/features/seminar-admin/CertificateGenerator.tsx:1490` calls `POST /api/certificates/pdf` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/certificates/pdf`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-389a514bac7aafb7", "name": "Dangling fetch: GET /api/auth/check-username?username=${encodeURIComponent(watchedUsername)} (src/features/auth/SignupFo", "shortDescription": {"text": "Dangling fetch: GET /api/auth/check-username?username=${encodeURIComponent(watchedUsername)} (src/features/auth/SignupForm.tsx:173)"}, "fullDescription": {"text": "`src/features/auth/SignupForm.tsx:173` calls `GET /api/auth/check-username?username=${encodeURIComponent(watchedUsername)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/check-username`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a086b325ebc33136", "name": "Dangling fetch: POST /api/auth/auto-approve (src/features/auth/SignupForm.tsx:345)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/auto-approve (src/features/auth/SignupForm.tsx:345)"}, "fullDescription": {"text": "`src/features/auth/SignupForm.tsx:345` calls `POST /api/auth/auto-approve` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/auto-approve`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-55e48d04ab029503", "name": "Dangling fetch: GET /api/auth/resolve-email?username=${encodeURIComponent(username)} (src/features/auth/useAuth.ts:27)", "shortDescription": {"text": "Dangling fetch: GET /api/auth/resolve-email?username=${encodeURIComponent(username)} (src/features/auth/useAuth.ts:27)"}, "fullDescription": {"text": "`src/features/auth/useAuth.ts:27` calls `GET /api/auth/resolve-email?username=${encodeURIComponent(username)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/resolve-email`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ed54606c21a23cd4", "name": "Dangling fetch: GET /api/auth/guest-history-preview?${params} (src/features/auth/SignupMultiStep.tsx:69)", "shortDescription": {"text": "Dangling fetch: GET /api/auth/guest-history-preview?${params} (src/features/auth/SignupMultiStep.tsx:69)"}, "fullDescription": {"text": "`src/features/auth/SignupMultiStep.tsx:69` calls `GET /api/auth/guest-history-preview?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/guest-history-preview`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e74b36b10804cc32", "name": "Dangling fetch: GET /api/auth/check-username?username=${encodeURIComponent(watchedUsername)} (src/features/auth/signup-s", "shortDescription": {"text": "Dangling fetch: GET /api/auth/check-username?username=${encodeURIComponent(watchedUsername)} (src/features/auth/signup-steps/Step1AccountInfo.tsx:76)"}, "fullDescription": {"text": "`src/features/auth/signup-steps/Step1AccountInfo.tsx:76` calls `GET /api/auth/check-username?username=${encodeURIComponent(watchedUsername)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/check-username`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-462b9b7caefdcee1", "name": "Dangling fetch: POST /api/auth/auto-approve (src/features/auth/signup-steps/runSignupFlow.ts:187)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/auto-approve (src/features/auth/signup-steps/runSignupFlow.ts:187)"}, "fullDescription": {"text": "`src/features/auth/signup-steps/runSignupFlow.ts:187` calls `POST /api/auth/auto-approve` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/auto-approve`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-06c73b40c7ff3688", "name": "Dangling fetch: POST /api/ai/conference-extract (src/features/conference/ConferenceProgramEditor.tsx:463)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/conference-extract (src/features/conference/ConferenceProgramEditor.tsx:463)"}, "fullDescription": {"text": "`src/features/conference/ConferenceProgramEditor.tsx:463` calls `POST /api/ai/conference-extract` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/conference-extract`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-00466f2fdad1c28f", "name": "Dangling fetch: POST /api/cron/loyalty-snapshot (src/features/insights/LoyaltyTrendSection.tsx:79)", "shortDescription": {"text": "Dangling fetch: POST /api/cron/loyalty-snapshot (src/features/insights/LoyaltyTrendSection.tsx:79)"}, "fullDescription": {"text": "`src/features/insights/LoyaltyTrendSection.tsx:79` calls `POST /api/cron/loyalty-snapshot` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cron/loyalty-snapshot`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4674ae9f4e69cd7e", "name": "Dangling fetch: POST /api/email/approval (src/features/admin/AdminUserList.tsx:20)", "shortDescription": {"text": "Dangling fetch: POST /api/email/approval (src/features/admin/AdminUserList.tsx:20)"}, "fullDescription": {"text": "`src/features/admin/AdminUserList.tsx:20` calls `POST /api/email/approval` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/approval`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a5d9e6690ad84534", "name": "Dangling fetch: POST /api/email/newsletter (src/features/admin/AdminNewsletterTab.tsx:112)", "shortDescription": {"text": "Dangling fetch: POST /api/email/newsletter (src/features/admin/AdminNewsletterTab.tsx:112)"}, "fullDescription": {"text": "`src/features/admin/AdminNewsletterTab.tsx:112` calls `POST /api/email/newsletter` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/newsletter`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-daf39578f7faa9ef", "name": "Dangling fetch: POST /api/email/inquiry-reply (src/features/admin/AdminInquiryTab.tsx:76)", "shortDescription": {"text": "Dangling fetch: POST /api/email/inquiry-reply (src/features/admin/AdminInquiryTab.tsx:76)"}, "fullDescription": {"text": "`src/features/admin/AdminInquiryTab.tsx:76` calls `POST /api/email/inquiry-reply` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/inquiry-reply`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-43d7b46a8956393b", "name": "Dangling fetch: POST /api/seminars/${seminar.id}/speaker-token (src/features/seminar/SeminarLMS.tsx:132)", "shortDescription": {"text": "Dangling fetch: POST /api/seminars/${seminar.id}/speaker-token (src/features/seminar/SeminarLMS.tsx:132)"}, "fullDescription": {"text": "`src/features/seminar/SeminarLMS.tsx:132` calls `POST /api/seminars/${seminar.id}/speaker-token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/seminars/<p>/speaker-token`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aa7838943bf41a1c", "name": "Dangling fetch: GET /api/reviews?seminarId=${seminar.id}&mode=list (src/features/seminar/SeminarReviews.tsx:73)", "shortDescription": {"text": "Dangling fetch: GET /api/reviews?seminarId=${seminar.id}&mode=list (src/features/seminar/SeminarReviews.tsx:73)"}, "fullDescription": {"text": "`src/features/seminar/SeminarReviews.tsx:73` calls `GET /api/reviews?seminarId=${seminar.id}&mode=list` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/reviews`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-21c54831602e1254", "name": "Dangling fetch: GET /api/activities?type=${type} (src/features/activities/ActivityPage.tsx:128)", "shortDescription": {"text": "Dangling fetch: GET /api/activities?type=${type} (src/features/activities/ActivityPage.tsx:128)"}, "fullDescription": {"text": "`src/features/activities/ActivityPage.tsx:128` calls `GET /api/activities?type=${type}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/activities`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7e899d7f30c16dad", "name": "Dangling fetch: GET /api/activities/${activityId}/my-application (src/features/activities/ActivityDetail.tsx:274)", "shortDescription": {"text": "Dangling fetch: GET /api/activities/${activityId}/my-application (src/features/activities/ActivityDetail.tsx:274)"}, "fullDescription": {"text": "`src/features/activities/ActivityDetail.tsx:274` calls `GET /api/activities/${activityId}/my-application` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/activities/<p>/my-application`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3bdcbb2d7ff26e16", "name": "Dangling fetch: POST /api/activities/${activityId}/apply (src/features/activities/ActivityDetail.tsx:394)", "shortDescription": {"text": "Dangling fetch: POST /api/activities/${activityId}/apply (src/features/activities/ActivityDetail.tsx:394)"}, "fullDescription": {"text": "`src/features/activities/ActivityDetail.tsx:394` calls `POST /api/activities/${activityId}/apply` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/activities/<p>/apply`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-391929f355315d16", "name": "Dangling fetch: POST /api/activities/${activityId}/apply (src/features/activities/ActivityDetail.tsx:423)", "shortDescription": {"text": "Dangling fetch: POST /api/activities/${activityId}/apply (src/features/activities/ActivityDetail.tsx:423)"}, "fullDescription": {"text": "`src/features/activities/ActivityDetail.tsx:423` calls `POST /api/activities/${activityId}/apply` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/activities/<p>/apply`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0718fb15be49b459", "name": "Dangling fetch: POST /api/activities/${activityId}/application-lookup (src/features/activities/ActivityDetail.tsx:3384)", "shortDescription": {"text": "Dangling fetch: POST /api/activities/${activityId}/application-lookup (src/features/activities/ActivityDetail.tsx:3384)"}, "fullDescription": {"text": "`src/features/activities/ActivityDetail.tsx:3384` calls `POST /api/activities/${activityId}/application-lookup` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/activities/<p>/application-lookup`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f4cb6562f86cffe9", "name": "Dangling fetch: POST /api/comm/notify-answer (src/features/comm-board/AnswerThread.tsx:95)", "shortDescription": {"text": "Dangling fetch: POST /api/comm/notify-answer (src/features/comm-board/AnswerThread.tsx:95)"}, "fullDescription": {"text": "`src/features/comm-board/AnswerThread.tsx:95` calls `POST /api/comm/notify-answer` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/comm/notify-answer`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-134f988dc49b268b", "name": "Dangling fetch: POST /api/ai/yonsei-agent (src/features/yonsei-agents/useAgentJobs.ts:69)", "shortDescription": {"text": "Dangling fetch: POST /api/ai/yonsei-agent (src/features/yonsei-agents/useAgentJobs.ts:69)"}, "fullDescription": {"text": "`src/features/yonsei-agents/useAgentJobs.ts:69` calls `POST /api/ai/yonsei-agent` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ai/yonsei-agent`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3140e61d7cac5091", "name": "Unused endpoint: GET /agents", "shortDescription": {"text": "Unused endpoint: GET /agents"}, "fullDescription": {"text": "`agent-server/main.py` declares `GET /agents` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b30cbdd177c13681", "name": "Unused endpoint: GET /agents/{agent_id}", "shortDescription": {"text": "Unused endpoint: GET /agents/{agent_id}"}, "fullDescription": {"text": "`agent-server/main.py` declares `GET /agents/{agent_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2f3fa31f1e9b1b90", "name": "Unused endpoint: POST /agents", "shortDescription": {"text": "Unused endpoint: POST /agents"}, "fullDescription": {"text": "`agent-server/main.py` declares `POST /agents` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5f76b22c5641fd05", "name": "Unused endpoint: PUT /agents/{agent_id}", "shortDescription": {"text": "Unused endpoint: PUT /agents/{agent_id}"}, "fullDescription": {"text": "`agent-server/main.py` declares `PUT /agents/{agent_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c3b90085b95f0071", "name": "Unused endpoint: DELETE /agents/{agent_id}", "shortDescription": {"text": "Unused endpoint: DELETE /agents/{agent_id}"}, "fullDescription": {"text": "`agent-server/main.py` declares `DELETE /agents/{agent_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd0e06afbaab19b3", "name": "Unused endpoint: GET /tasks", "shortDescription": {"text": "Unused endpoint: GET /tasks"}, "fullDescription": {"text": "`agent-server/main.py` declares `GET /tasks` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e30433c1fac6e869", "name": "Unused endpoint: GET /tasks/{task_id}", "shortDescription": {"text": "Unused endpoint: GET /tasks/{task_id}"}, "fullDescription": {"text": "`agent-server/main.py` declares `GET /tasks/{task_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8b3eb3012ac06c04", "name": "Unused endpoint: POST /tasks", "shortDescription": {"text": "Unused endpoint: POST /tasks"}, "fullDescription": {"text": "`agent-server/main.py` declares `POST /tasks` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-237e4c4c366a98dd", "name": "Unused endpoint: GET /tasks/{task_id}/stream", "shortDescription": {"text": "Unused endpoint: GET /tasks/{task_id}/stream"}, "fullDescription": {"text": "`agent-server/main.py` declares `GET /tasks/{task_id}/stream` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/23319"}, "properties": {"repository": "yonseiedtech/yonsei-edtech", "repoUrl": "https://github.com/yonseiedtech/yonsei-edtech", "branch": "main"}, "results": [{"ruleId": "scanner-9abc323adfaf6441", "level": "note", "message": {"text": "Possibly dead Python function: verify_token"}, "properties": {"repobilityId": "6a5c4adccfca0a15", "scanner": "scanner-primary", "fingerprint": "9abc323adfaf6441", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "agent-server/main.py:51"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d572ae10804bfa76", "level": "note", "message": {"text": "Possibly dead Python function: decorator"}, "properties": {"repobilityId": "ffbcbc9bc189af1c", "scanner": "scanner-primary", "fingerprint": "d572ae10804bfa76", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "agent-server/tools/registry.py:9"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-02052f27dbbecb22", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/analyze-abstract-sentences.ts:78"}, "properties": {"repobilityId": "d4f9f6edafb6828a", "scanner": "scanner-primary", "fingerprint": "02052f27dbbecb22", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4c5523b8b2851321", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-measurement-subcategories.ts:66"}, "properties": {"repobilityId": "409508275b38faf4", "scanner": "scanner-primary", "fingerprint": "4c5523b8b2851321", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-31d8fc9dd8bf8643", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-confused-with.ts:42"}, "properties": {"repobilityId": "b677a24b33eedc96", "scanner": "scanner-primary", "fingerprint": "31d8fc9dd8bf8643", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2ebbe5d8452dd56c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sync-archive-crosslinks.ts:48"}, "properties": {"repobilityId": "c511566062493b24", "scanner": "scanner-primary", "fingerprint": "2ebbe5d8452dd56c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2c00e46bc4fbd414", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/apply-measurement-seeds.ts:16"}, "properties": {"repobilityId": "d36ca3c25363ebb0", "scanner": "scanner-primary", "fingerprint": "2c00e46bc4fbd414", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3b31f1aa6ea56f62", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/link-thesis-methods.ts:76"}, "properties": {"repobilityId": "db4cc122e975b39a", "scanner": "scanner-primary", "fingerprint": "3b31f1aa6ea56f62", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a44cfb3caf5e9d51", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-rm-stat-links.ts:39"}, "properties": {"repobilityId": "21b8a955bab2b5f5", "scanner": "scanner-primary", "fingerprint": "a44cfb3caf5e9d51", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-00b0db44df46f034", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/analyze-alumni-abstracts.ts:79"}, "properties": {"repobilityId": "04b9c6fb82cb1ab5", "scanner": "scanner-primary", "fingerprint": "00b0db44df46f034", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6db228456cdd918c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/enrich-measurement-tools.ts:96"}, "properties": {"repobilityId": "5a0b0b677d4f5149", "scanner": "scanner-primary", "fingerprint": "6db228456cdd918c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-35a34d52e9e15b2c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/extract-thesis-analysis.ts:172"}, "properties": {"repobilityId": "2f306613e0e53360", "scanner": "scanner-primary", "fingerprint": "35a34d52e9e15b2c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5eefbd4cd5e31577", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-concept-scholars.ts:323"}, "properties": {"repobilityId": "3dbf58f311858a9d", "scanner": "scanner-primary", "fingerprint": "5eefbd4cd5e31577", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a9c42069b4e4ba3e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/apply-archive-links.ts:33"}, "properties": {"repobilityId": "444d421cc9b08fdf", "scanner": "scanner-primary", "fingerprint": "a9c42069b4e4ba3e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c7fdad2a6dc2b340", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-confused-with-2.ts:23"}, "properties": {"repobilityId": "b32c82014cdc607c", "scanner": "scanner-primary", "fingerprint": "c7fdad2a6dc2b340", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0a509ad8cfa673a9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-measurement-scales.ts:131"}, "properties": {"repobilityId": "d52552ded8d49ae0", "scanner": "scanner-primary", "fingerprint": "0a509ad8cfa673a9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-70dc14f3d7d13cbf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/deploy-vercel.js:82"}, "properties": {"repobilityId": "27e1343ad933e876", "scanner": "scanner-primary", "fingerprint": "70dc14f3d7d13cbf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6c57c147a5516052", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-stat-symbols.ts:100"}, "properties": {"repobilityId": "508fb77857b64e6f", "scanner": "scanner-primary", "fingerprint": "6c57c147a5516052", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bb74c4fa09f0c60b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-learning-theories.ts:275"}, "properties": {"repobilityId": "af51bed4264611e9", "scanner": "scanner-primary", "fingerprint": "bb74c4fa09f0c60b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5a82f0e4cf89dcc9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/link-theses-concepts.ts:117"}, "properties": {"repobilityId": "c9432638cc2732e0", "scanner": "scanner-primary", "fingerprint": "5a82f0e4cf89dcc9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fa164f5ffbef4602", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/rebuild-thesis-method-links.ts:35"}, "properties": {"repobilityId": "79ef087cb1ccf38e", "scanner": "scanner-primary", "fingerprint": "fa164f5ffbef4602", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3d59312967c9f41d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-assumption-remedies.ts:189"}, "properties": {"repobilityId": "1a73697d1196b0fd", "scanner": "scanner-primary", "fingerprint": "3d59312967c9f41d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-15f908529089d7a8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-tf-values.ts:54"}, "properties": {"repobilityId": "385e0693e314d21d", "scanner": "scanner-primary", "fingerprint": "15f908529089d7a8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-55df83e7c4b6bf69", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-variable-domains.ts:123"}, "properties": {"repobilityId": "d5c118a26a2b67d7", "scanner": "scanner-primary", "fingerprint": "55df83e7c4b6bf69", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d8237d679024406d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-writing-cvi.ts:92"}, "properties": {"repobilityId": "691db7d50e03fed5", "scanner": "scanner-primary", "fingerprint": "d8237d679024406d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-91bd977651de2a08", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/reclassify-concepts.ts:141"}, "properties": {"repobilityId": "54f5483f85c15353", "scanner": "scanner-primary", "fingerprint": "91bd977651de2a08", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-69e4e7b28e6b456f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-scale-development.ts:110"}, "properties": {"repobilityId": "7f4aeb6561cb8e9a", "scanner": "scanner-primary", "fingerprint": "69e4e7b28e6b456f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4990b7e0af2e90ee", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-purified-names.ts:100"}, "properties": {"repobilityId": "f412e30a5cf75361", "scanner": "scanner-primary", "fingerprint": "4990b7e0af2e90ee", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4adea976875c4691", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-jamovi-guides.ts:86"}, "properties": {"repobilityId": "bdd324431d57aeb6", "scanner": "scanner-primary", "fingerprint": "4adea976875c4691", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7c7248f053964085", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-cognitive-measurements.ts:76"}, "properties": {"repobilityId": "65af6c39fdfca326", "scanner": "scanner-primary", "fingerprint": "7c7248f053964085", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-904d5a98ea19a055", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-cognitive-measurements-2.ts:55"}, "properties": {"repobilityId": "c6b93a4e5421d7b0", "scanner": "scanner-primary", "fingerprint": "904d5a98ea19a055", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f63f37d4dc84fb54", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-spss-guides.ts:82"}, "properties": {"repobilityId": "d3aeffbfd9629460", "scanner": "scanner-primary", "fingerprint": "f63f37d4dc84fb54", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2691b4c8023f84df", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/types/diagnostic.ts:488"}, "properties": {"repobilityId": "175d066c55c1b8a5", "scanner": "scanner-primary", "fingerprint": "2691b4c8023f84df", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-5b8ec6e9e73c3529", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/types/diagnostic.ts:119"}, "properties": {"repobilityId": "6bf98d27481f80d7", "scanner": "scanner-primary", "fingerprint": "5b8ec6e9e73c3529", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9f1f5052926516a9", "level": "note", "message": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/types/research-model.ts:210"}, "properties": {"repobilityId": "7b12dea3aa489e87", "scanner": "scanner-primary", "fingerprint": "9f1f5052926516a9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.edge-label.no-bg"]}}, {"ruleId": "scanner-23fb65cf89865e27", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/GlobalSearch.tsx:376"}, "properties": {"repobilityId": "48405c6b5e7e950e", "scanner": "scanner-primary", "fingerprint": "23fb65cf89865e27", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c124b5b730945dd4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Header.tsx:557"}, "properties": {"repobilityId": "c848c722ce61f0cc", "scanner": "scanner-primary", "fingerprint": "c124b5b730945dd4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a04f00a408998f32", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/archive/ConsoleSimpleArchiveList.tsx:176"}, "properties": {"repobilityId": "a93e4005341180ca", "scanner": "scanner-primary", "fingerprint": "a04f00a408998f32", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ac3a77184d0c1b3f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/archive/ThesisLinker.tsx:91"}, "properties": {"repobilityId": "d287e10f34fdea9e", "scanner": "scanner-primary", "fingerprint": "ac3a77184d0c1b3f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-35323f2c10cacc3f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/file-uploader.tsx:97"}, "properties": {"repobilityId": "365f19f1a19d3121", "scanner": "scanner-primary", "fingerprint": "35323f2c10cacc3f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-940d983e1b5a5014", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/chat/ChatWidget.tsx:249"}, "properties": {"repobilityId": "63352de1149e2591", "scanner": "scanner-primary", "fingerprint": "940d983e1b5a5014", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ca6bd03ce5621ae8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/NewsletterPreview.tsx:52"}, "properties": {"repobilityId": "9fda6be315ce8f83", "scanner": "scanner-primary", "fingerprint": "ca6bd03ce5621ae8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b68124f7e82d1534", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/PromotionPreview.tsx:54"}, "properties": {"repobilityId": "b86ce5100617cede", "scanner": "scanner-primary", "fingerprint": "b68124f7e82d1534", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-06b015293f439510", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/NoticePreview.tsx:48"}, "properties": {"repobilityId": "5a3e31a7f2c717be", "scanner": "scanner-primary", "fingerprint": "06b015293f439510", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e5d53e3349b297fb", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/diagnosis/DiagnosisRunner.tsx:316"}, "properties": {"repobilityId": "b9b627452f9b40d9", "scanner": "scanner-primary", "fingerprint": "e5d53e3349b297fb", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-097e36b8e1f2559e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/profile/ProfileCertificates.tsx:53"}, "properties": {"repobilityId": "57cb7280987dd8e3", "scanner": "scanner-primary", "fingerprint": "097e36b8e1f2559e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-389b51a5b665fc5f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/profile/ProfileContactInfo.tsx:54"}, "properties": {"repobilityId": "ae40a1687895f536", "scanner": "scanner-primary", "fingerprint": "389b51a5b665fc5f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cbef37fa8134b14e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/profile/ProfileAcademicActivities.tsx:442"}, "properties": {"repobilityId": "63e0e657d5df8c38", "scanner": "scanner-primary", "fingerprint": "cbef37fa8134b14e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cfafb2adfa8b6b9b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mypage/DiagnosticWeakConceptPath.tsx:155"}, "properties": {"repobilityId": "fabf7c0c7cbe3df3", "scanner": "scanner-primary", "fingerprint": "cfafb2adfa8b6b9b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-987045614008b9ee", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mypage/MyResearchView.tsx:543"}, "properties": {"repobilityId": "e65f19d96795f4f2", "scanner": "scanner-primary", "fingerprint": "987045614008b9ee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-815172856162260b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mypage/MyPageView.tsx:682"}, "properties": {"repobilityId": "7c255c1875435811", "scanner": "scanner-primary", "fingerprint": "815172856162260b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0eb4e1f96918e4c9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mypage/MyActivitiesView.tsx:238"}, "properties": {"repobilityId": "b8a15345d700cd87", "scanner": "scanner-primary", "fingerprint": "0eb4e1f96918e4c9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6e5946c92bbfba64", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mypage/MyActivityHub.tsx:382"}, "properties": {"repobilityId": "20178f457b12ebb6", "scanner": "scanner-primary", "fingerprint": "6e5946c92bbfba64", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b0d3f920f6e3bc65", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/JsonLd.tsx:52"}, "properties": {"repobilityId": "f07cf3d2a261ff34", "scanner": "scanner-primary", "fingerprint": "b0d3f920f6e3bc65", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b97de1a91db2cdbf", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:138"}, "properties": {"repobilityId": "0d72350965068f5b", "scanner": "scanner-primary", "fingerprint": "b97de1a91db2cdbf", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-48fa731c33213539", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/archive/[type]/page.tsx:501"}, "properties": {"repobilityId": "fb38cad7da801ca5", "scanner": "scanner-primary", "fingerprint": "48fa731c33213539", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ffb0bd4b87b7f643", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/ai/conference-extract/route.ts:137"}, "properties": {"repobilityId": "de638bc1173e410e", "scanner": "scanner-primary", "fingerprint": "ffb0bd4b87b7f643", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fee37264a2c2e9f1", "level": "note", "message": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/app/research/page.tsx:220"}, "properties": {"repobilityId": "25da17f38d075523", "scanner": "scanner-primary", "fingerprint": "fee37264a2c2e9f1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.edge-label.no-bg"]}}, {"ruleId": "scanner-c05ac40b916a5109", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/page.tsx:126"}, "properties": {"repobilityId": "4ba209c1bd3eacfd", "scanner": "scanner-primary", "fingerprint": "c05ac40b916a5109", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cfd3380f320ec2b3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/labs/page.tsx:146"}, "properties": {"repobilityId": "4e55f0e8962f6fb0", "scanner": "scanner-primary", "fingerprint": "cfd3380f320ec2b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5541b4b686f9d3c7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/labs/[id]/page.tsx:152"}, "properties": {"repobilityId": "bd2321b8bd5fed42", "scanner": "scanner-primary", "fingerprint": "5541b4b686f9d3c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-081eff60c3781cc6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/labs/qa-wall/page.tsx:256"}, "properties": {"repobilityId": "1024b9b46afbe162", "scanner": "scanner-primary", "fingerprint": "081eff60c3781cc6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8c5b66cdce40131e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/progress-meetings/page.tsx:65"}, "properties": {"repobilityId": "5e14e6dd3a0ce546", "scanner": "scanner-primary", "fingerprint": "8c5b66cdce40131e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3911718b1bd8ea9b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/leaderboard/page.tsx:288"}, "properties": {"repobilityId": "cc38b7123001dc00", "scanner": "scanner-primary", "fingerprint": "3911718b1bd8ea9b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7239e7871c80fe3f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/analytics/page.tsx:59"}, "properties": {"repobilityId": "5939d47e340e9f68", "scanner": "scanner-primary", "fingerprint": "7239e7871c80fe3f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fdb8f34d9a67e1dc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/audit-log/page.tsx:120"}, "properties": {"repobilityId": "028fbfdfb88aa7e1", "scanner": "scanner-primary", "fingerprint": "fdb8f34d9a67e1dc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8a95b1793cc80566", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/exam-schedule-admin/page.tsx:204"}, "properties": {"repobilityId": "ce8209d6c7285f9a", "scanner": "scanner-primary", "fingerprint": "8a95b1793cc80566", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bd7504d091a6ac42", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/agents/page.tsx:183"}, "properties": {"repobilityId": "06569f6aa3b7c87a", "scanner": "scanner-primary", "fingerprint": "bd7504d091a6ac42", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9243bb46a1f9fefb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/seminars/[id]/host/page.tsx:323"}, "properties": {"repobilityId": "3da82a6602fd27fc", "scanner": "scanner-primary", "fingerprint": "9243bb46a1f9fefb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-83d084ea97053649", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/archive/page.tsx:481"}, "properties": {"repobilityId": "e2b3d1901a9f4264", "scanner": "scanner-primary", "fingerprint": "83d084ea97053649", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-00dc802d9340a794", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/archive/writing-tips/page.tsx:251"}, "properties": {"repobilityId": "73d88723d796a345", "scanner": "scanner-primary", "fingerprint": "00dc802d9340a794", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f3aad33be08f3796", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/archive/foundation-terms/page.tsx:252"}, "properties": {"repobilityId": "617b12cc5d6542d1", "scanner": "scanner-primary", "fingerprint": "f3aad33be08f3796", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-04f73f68b328a142", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/archive/statistical-methods/page.tsx:250"}, "properties": {"repobilityId": "deb45b6bd266ddd0", "scanner": "scanner-primary", "fingerprint": "04f73f68b328a142", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-536336bd7869fc5b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/archive/research-methods/page.tsx:222"}, "properties": {"repobilityId": "3fd99b2cf5b00ae3", "scanner": "scanner-primary", "fingerprint": "536336bd7869fc5b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d29333b0cec0a421", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/networking/page.tsx:149"}, "properties": {"repobilityId": "8686fa1c1c0e894e", "scanner": "scanner-primary", "fingerprint": "d29333b0cec0a421", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ae52ddc20f00c94e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/potential-members/page.tsx:72"}, "properties": {"repobilityId": "cf06a977bbcef2f3", "scanner": "scanner-primary", "fingerprint": "ae52ddc20f00c94e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c9e516a07396b26e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/research/page.tsx:453"}, "properties": {"repobilityId": "1daf1d7de231a03b", "scanner": "scanner-primary", "fingerprint": "c9e516a07396b26e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3fa47f2ca7fc97e6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/research/[userId]/page.tsx:190"}, "properties": {"repobilityId": "87a6716235ed9e7d", "scanner": "scanner-primary", "fingerprint": "3fa47f2ca7fc97e6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-71512f5a822ebbcf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/agent-workflows/page.tsx:206"}, "properties": {"repobilityId": "5609f66b580d7ca0", "scanner": "scanner-primary", "fingerprint": "71512f5a822ebbcf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-12e326e71e0deca7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/labs/page.tsx:128"}, "properties": {"repobilityId": "bde85af603925fb3", "scanner": "scanner-primary", "fingerprint": "12e326e71e0deca7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b060ca0d30c5d0fc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/labs/[id]/page.tsx:151"}, "properties": {"repobilityId": "afc2ab19674ab907", "scanner": "scanner-primary", "fingerprint": "b060ca0d30c5d0fc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7c501e07bb74bd50", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/agent-board/page.tsx:164"}, "properties": {"repobilityId": "79ff2efa718f9991", "scanner": "scanner-primary", "fingerprint": "7c501e07bb74bd50", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c546bcf79844b630", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/academic/external/[id]/speakers/page.tsx:569"}, "properties": {"repobilityId": "d8d968cc5864eaa2", "scanner": "scanner-primary", "fingerprint": "c546bcf79844b630", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-36c9cd77ac132e26", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/academic/external/[id]/session-analytics/page.tsx:282"}, "properties": {"repobilityId": "22797cc50ca05b25", "scanner": "scanner-primary", "fingerprint": "36c9cd77ac132e26", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3bde221898868b0a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/academic/external/[id]/reviews/page.tsx:220"}, "properties": {"repobilityId": "c285d42202d09aad", "scanner": "scanner-primary", "fingerprint": "3bde221898868b0a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7af149e044a0e93e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/academic/external/[id]/volunteers/page.tsx:542"}, "properties": {"repobilityId": "73d509294d6bb7df", "scanner": "scanner-primary", "fingerprint": "7af149e044a0e93e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-88d41f943d612f19", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/academic/seminars/[id]/page.tsx:212"}, "properties": {"repobilityId": "4ab0dd1b66dab5e5", "scanner": "scanner-primary", "fingerprint": "88d41f943d612f19", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8b7df0e391680cb7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/academic/applications/page.tsx:158"}, "properties": {"repobilityId": "38002030c0282676", "scanner": "scanner-primary", "fingerprint": "8b7df0e391680cb7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-11940ceae06ad5d0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/onboarding-checklist/page.tsx:300"}, "properties": {"repobilityId": "215a743bf18f63f2", "scanner": "scanner-primary", "fingerprint": "11940ceae06ad5d0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1eb426647062f38c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/console/members/[id]/page.tsx:469"}, "properties": {"repobilityId": "fd6f91a292923516", "scanner": "scanner-primary", "fingerprint": "1eb426647062f38c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f3af9205f3056de2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/newsletter/page.tsx:86"}, "properties": {"repobilityId": "19de63075ea09fb0", "scanner": "scanner-primary", "fingerprint": "f3af9205f3056de2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-34f5cd9a645236f2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/newsletter/[id]/page.tsx:175"}, "properties": {"repobilityId": "873b858e19b0d815", "scanner": "scanner-primary", "fingerprint": "34f5cd9a645236f2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-97c9c79b3cfc3eea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/mypage/messages/page.tsx:194"}, "properties": {"repobilityId": "082288d5d39c1f44", "scanner": "scanner-primary", "fingerprint": "97c9c79b3cfc3eea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b72c34b922ddbc34", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/mypage/calendar-sync/page.tsx:117"}, "properties": {"repobilityId": "82f2eef303b75821", "scanner": "scanner-primary", "fingerprint": "b72c34b922ddbc34", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-beee31665bc373f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/calendar/page.tsx:820"}, "properties": {"repobilityId": "d6180767415e1e29", "scanner": "scanner-primary", "fingerprint": "beee31665bc373f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-99a1135df72010ce", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/board/[id]/page.tsx:306"}, "properties": {"repobilityId": "0656cc97735bed26", "scanner": "scanner-primary", "fingerprint": "99a1135df72010ce", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f1bbf6d5930b8bbd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/seminar-admin/RegistrationsTab.tsx:1437"}, "properties": {"repobilityId": "20a0ce43223e425a", "scanner": "scanner-primary", "fingerprint": "f1bbf6d5930b8bbd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-32ee085bc83785bb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/seminar-admin/ReviewManagement.tsx:241"}, "properties": {"repobilityId": "2f3465773dd9538b", "scanner": "scanner-primary", "fingerprint": "32ee085bc83785bb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d6ab2a6f74b3b928", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/notifications/NotificationBell.tsx:114"}, "properties": {"repobilityId": "322c65f39d0dd1a0", "scanner": "scanner-primary", "fingerprint": "d6ab2a6f74b3b928", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c3eee01701bbfee8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/archive/ArchiveStartHere.tsx:87"}, "properties": {"repobilityId": "1f3136079c9696ca", "scanner": "scanner-primary", "fingerprint": "c3eee01701bbfee8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-db0e0bfe765c40b9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/archive/ArchiveGlobalSearch.tsx:187"}, "properties": {"repobilityId": "9888d26c2e8a545d", "scanner": "scanner-primary", "fingerprint": "db0e0bfe765c40b9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4343e66f59f7b573", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/archive/ArchiveConceptRecommend.tsx:258"}, "properties": {"repobilityId": "8add1f5449800b88", "scanner": "scanner-primary", "fingerprint": "4343e66f59f7b573", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-052bc4ed727b6040", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/auth/MyPostList.tsx:32"}, "properties": {"repobilityId": "26a488d90fe9e029", "scanner": "scanner-primary", "fingerprint": "052bc4ed727b6040", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d7516540d37bcd22", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/auth/signup-steps/GuestHistoryPreviewDialog.tsx:70"}, "properties": {"repobilityId": "6b3113d5711f57a8", "scanner": "scanner-primary", "fingerprint": "d7516540d37bcd22", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b11ec7d88e8ee4a0", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/features/journal/components/JournalArticleView.tsx:67"}, "properties": {"repobilityId": "239c0e9ba87d3a5e", "scanner": "scanner-primary", "fingerprint": "b11ec7d88e8ee4a0", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-2ff5b0d33b30be1b", "level": "note", "message": {"text": "React Flow <MiniMap> without dark background \u2014 src/features/network/NetworkGraph.tsx:228"}, "properties": {"repobilityId": "6e4b0c3d59caa842", "scanner": "scanner-primary", "fingerprint": "2ff5b0d33b30be1b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.minimap.no-bg"]}}, {"ruleId": "scanner-1ef990595d242de0", "level": "note", "message": {"text": "React Flow <Controls> without dark theming \u2014 src/features/network/NetworkGraph.tsx:227"}, "properties": {"repobilityId": "20f517261f4a70d6", "scanner": "scanner-primary", "fingerprint": "1ef990595d242de0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.controls.no-bg"]}}, {"ruleId": "scanner-900ba7237cff210a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/ResearchReportInterview.tsx:1790"}, "properties": {"repobilityId": "c103f94911853d75", "scanner": "scanner-primary", "fingerprint": "900ba7237cff210a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-89e20144e3aab371", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/WritingPaperEditor.tsx:1889"}, "properties": {"repobilityId": "65219d643c54e5a3", "scanner": "scanner-primary", "fingerprint": "89e20144e3aab371", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8bde67de035ec83c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/ResearchPaperList.tsx:407"}, "properties": {"repobilityId": "7c0ee4f6240f60e1", "scanner": "scanner-primary", "fingerprint": "8bde67de035ec83c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b4da030a45487196", "level": "note", "message": {"text": "React Flow <MiniMap> without dark background \u2014 src/features/research/ResearchModelEditor.tsx:490"}, "properties": {"repobilityId": "60b3600db6666f87", "scanner": "scanner-primary", "fingerprint": "b4da030a45487196", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.minimap.no-bg"]}}, {"ruleId": "scanner-0c3bd65f890190da", "level": "note", "message": {"text": "React Flow <Controls> without dark theming \u2014 src/features/research/ResearchModelEditor.tsx:489"}, "properties": {"repobilityId": "1e320dc31593171f", "scanner": "scanner-primary", "fingerprint": "0c3bd65f890190da", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.controls.no-bg"]}}, {"ruleId": "scanner-1b13d8f79d1a38d4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/WritingHistoryList.tsx:64"}, "properties": {"repobilityId": "d35ddebb711fe9a6", "scanner": "scanner-primary", "fingerprint": "1b13d8f79d1a38d4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-247dd52d205512a5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/ResearchPaperDialog.tsx:393"}, "properties": {"repobilityId": "8c648c8ea467bc08", "scanner": "scanner-primary", "fingerprint": "247dd52d205512a5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4393350fa3e91b0d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/RisImporter.tsx:278"}, "properties": {"repobilityId": "643ee0f29ed10934", "scanner": "scanner-primary", "fingerprint": "4393350fa3e91b0d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e5caaa7bcf003570", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/study-timer/PaperReadingSection.tsx:131"}, "properties": {"repobilityId": "c1f104e48a746bbf", "scanner": "scanner-primary", "fingerprint": "e5caaa7bcf003570", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-18ac9ade3afda2c6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/study-timer/FloatingReadingTimer.tsx:286"}, "properties": {"repobilityId": "f130ea90c0c36a73", "scanner": "scanner-primary", "fingerprint": "18ac9ade3afda2c6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ad12c71ded3c8568", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research/study-timer/StudyTimerStats.tsx:202"}, "properties": {"repobilityId": "94ff971282c2fcbf", "scanner": "scanner-primary", "fingerprint": "ad12c71ded3c8568", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6045c04cb41d30df", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/ActivityFeed.tsx:100"}, "properties": {"repobilityId": "d112af05f2b81cfa", "scanner": "scanner-primary", "fingerprint": "6045c04cb41d30df", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec64a22985710521", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/NewMemberOnboardingCard.tsx:244"}, "properties": {"repobilityId": "e00cd77dd85685e6", "scanner": "scanner-primary", "fingerprint": "ec64a22985710521", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-34c651bf48f4a43c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/ProfileSummaryCard.tsx:143"}, "properties": {"repobilityId": "b3c09dd36890e918", "scanner": "scanner-primary", "fingerprint": "34c651bf48f4a43c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4f293e8aef66f61d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/ProfileSideWidget.tsx:62"}, "properties": {"repobilityId": "c6e98817043d7c6f", "scanner": "scanner-primary", "fingerprint": "4f293e8aef66f61d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-37d2dd5f09e012b0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/DailyClassTimelineWidget.tsx:1021"}, "properties": {"repobilityId": "7038a35b03736a38", "scanner": "scanner-primary", "fingerprint": "37d2dd5f09e012b0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-af01bf5b93968f0c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/AlumniHomeWidgets.tsx:203"}, "properties": {"repobilityId": "b2899196b0986653", "scanner": "scanner-primary", "fingerprint": "af01bf5b93968f0c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-12900aeba63bded9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/NextActionBanner.tsx:358"}, "properties": {"repobilityId": "ab3573a2945471d0", "scanner": "scanner-primary", "fingerprint": "12900aeba63bded9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ff138a18fa89e293", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/PeerActivityFeed.tsx:228"}, "properties": {"repobilityId": "ac81c008e7b8eb8e", "scanner": "scanner-primary", "fingerprint": "ff138a18fa89e293", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c8de6358dbc0b2d1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/TodayTodosPopup.tsx:330"}, "properties": {"repobilityId": "ca19ef4146b187ce", "scanner": "scanner-primary", "fingerprint": "c8de6358dbc0b2d1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-73d75180cdefb61f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/StaffPriorityPanel.tsx:129"}, "properties": {"repobilityId": "466e99fd377271ee", "scanner": "scanner-primary", "fingerprint": "73d75180cdefb61f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4f7851fdd6d0bc05", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/RecentPostsWidget.tsx:90"}, "properties": {"repobilityId": "0d909f9e0f3d04e1", "scanner": "scanner-primary", "fingerprint": "4f7851fdd6d0bc05", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-73d3907fc10361ec", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/DashboardCommandCenter.tsx:170"}, "properties": {"repobilityId": "927986aed5814b82", "scanner": "scanner-primary", "fingerprint": "73d3907fc10361ec", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-10732882eecafdd9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/SpacedRepetitionWidget.tsx:190"}, "properties": {"repobilityId": "9d029dc686a99b40", "scanner": "scanner-primary", "fingerprint": "10732882eecafdd9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d58f45f19c2a1e2b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/TodaySummaryCard.tsx:224"}, "properties": {"repobilityId": "378b2610e1ac2314", "scanner": "scanner-primary", "fingerprint": "d58f45f19c2a1e2b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-26ede0898eb4b953", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/MyAcademicActivitiesWidget.tsx:109"}, "properties": {"repobilityId": "4ff6047dc3c83980", "scanner": "scanner-primary", "fingerprint": "26ede0898eb4b953", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1fa580ef1b13ab4a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/timeline/WeeklyGrid.tsx:147"}, "properties": {"repobilityId": "7914f091908c29a0", "scanner": "scanner-primary", "fingerprint": "1fa580ef1b13ab4a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-98d63e5a5db66e33", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/timeline/DailyGrid.tsx:120"}, "properties": {"repobilityId": "ec940e4d94dd3a25", "scanner": "scanner-primary", "fingerprint": "98d63e5a5db66e33", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c4305526d62ad64d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/todos/LectureReviewItem.tsx:131"}, "properties": {"repobilityId": "df7fedf4c5c11800", "scanner": "scanner-primary", "fingerprint": "c4305526d62ad64d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9ddc632b37726b13", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/todos/ResearchItem.tsx:20"}, "properties": {"repobilityId": "e8e94a7738989cbe", "scanner": "scanner-primary", "fingerprint": "9ddc632b37726b13", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b94d1ce80e359fc6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/dashboard/todos/ActivityItem.tsx:37"}, "properties": {"repobilityId": "dec2798eb6823e23", "scanner": "scanner-primary", "fingerprint": "b94d1ce80e359fc6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0c8769d2d8268461", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/agent/TaskListItem.tsx:40"}, "properties": {"repobilityId": "9834a8c6800086a2", "scanner": "scanner-primary", "fingerprint": "0c8769d2d8268461", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1f86df90b4960dca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/conference/ConferenceProgramEditor.tsx:896"}, "properties": {"repobilityId": "46c1bda7417eabc2", "scanner": "scanner-primary", "fingerprint": "1f86df90b4960dca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5c6f90157c86b0f4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/conference/ConferenceProgramStats.tsx:134"}, "properties": {"repobilityId": "b2baec443720a05f", "scanner": "scanner-primary", "fingerprint": "5c6f90157c86b0f4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4376ed9c206f830c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/insights/MemberReportView.tsx:289"}, "properties": {"repobilityId": "d8057d9deb20f850", "scanner": "scanner-primary", "fingerprint": "4376ed9c206f830c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9dd2da9309c73427", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/insights/OperationalKpiSection.tsx:126"}, "properties": {"repobilityId": "b0ddc68f9264c793", "scanner": "scanner-primary", "fingerprint": "9dd2da9309c73427", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ba1385c891e6e756", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/insights/WeeklyOperationsSummary.tsx:92"}, "properties": {"repobilityId": "f65e8e6d5cd4eccb", "scanner": "scanner-primary", "fingerprint": "ba1385c891e6e756", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-18a8d24795d53fdf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/insights/UserActivityLogView.tsx:213"}, "properties": {"repobilityId": "3157e395aff21097", "scanner": "scanner-primary", "fingerprint": "18a8d24795d53fdf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a4d02d5aaf7b21ef", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/admin/AdminNewsletterTab.tsx:946"}, "properties": {"repobilityId": "04ab1b9883b26d48", "scanner": "scanner-primary", "fingerprint": "a4d02d5aaf7b21ef", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d41cbc424a29929c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/admin/HandoverSection.tsx:203"}, "properties": {"repobilityId": "bf57f7ba984bb60f", "scanner": "scanner-primary", "fingerprint": "d41cbc424a29929c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b28147b21675fdae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/admin/AdminInquiryTab.tsx:213"}, "properties": {"repobilityId": "f8d6a18999db4186", "scanner": "scanner-primary", "fingerprint": "b28147b21675fdae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4f2500d96c964da0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/admin/AdminPostTab.tsx:260"}, "properties": {"repobilityId": "3553c1212c6d2e3e", "scanner": "scanner-primary", "fingerprint": "4f2500d96c964da0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5ca3ed2051f77d6d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/admin/AdminAgentTab.tsx:77"}, "properties": {"repobilityId": "e3618c1bab3f3732", "scanner": "scanner-primary", "fingerprint": "5ca3ed2051f77d6d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c2a511e8072dc1f0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/admin/settings/OrgChartEditor.tsx:258"}, "properties": {"repobilityId": "8e8d24327737a835", "scanner": "scanner-primary", "fingerprint": "c2a511e8072dc1f0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8339cccb116e75f4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/seminar/SeminarLMS.tsx:205"}, "properties": {"repobilityId": "fd0c5eb51c480258", "scanner": "scanner-primary", "fingerprint": "8339cccb116e75f4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c7e02ff40d737a16", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/seminar/MaterialsSection.tsx:149"}, "properties": {"repobilityId": "7ae0b686cee89adb", "scanner": "scanner-primary", "fingerprint": "c7e02ff40d737a16", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9a39165536c2e33f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/seminar/SeminarList.tsx:150"}, "properties": {"repobilityId": "84c6eb1715082acd", "scanner": "scanner-primary", "fingerprint": "9a39165536c2e33f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eaff338693bf7c39", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/defense/DefensePracticeRunner.tsx:1359"}, "properties": {"repobilityId": "3a648c406db900c0", "scanner": "scanner-primary", "fingerprint": "eaff338693bf7c39", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b4f3a48b56f44bb5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/features/defense/DefensePracticeRunner.tsx:630"}, "properties": {"repobilityId": "625f14a35fd661d1", "scanner": "scanner-primary", "fingerprint": "b4f3a48b56f44bb5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9e3dbbe3c563fea7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/activities/ActivityDetail.tsx:1525"}, "properties": {"repobilityId": "7a218d463699bccf", "scanner": "scanner-primary", "fingerprint": "9e3dbbe3c563fea7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0e132d3207ac3e1e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/activities/StudySessionPreClassCard.tsx:304"}, "properties": {"repobilityId": "2f7a0e70aed28cfa", "scanner": "scanner-primary", "fingerprint": "0e132d3207ac3e1e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-313a41fd9efd8f13", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/activities/ActivityWeekDetailPage.tsx:303"}, "properties": {"repobilityId": "a145ddf55b639d5d", "scanner": "scanner-primary", "fingerprint": "313a41fd9efd8f13", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2763198e5a6e87fe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/activities/StudyMaterialArchive.tsx:174"}, "properties": {"repobilityId": "6885dfac99d89043", "scanner": "scanner-primary", "fingerprint": "2763198e5a6e87fe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-df9b4d05caa0067a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/comm-board/CommBoardSection.tsx:78"}, "properties": {"repobilityId": "79b2a288c28baa82", "scanner": "scanner-primary", "fingerprint": "df9b4d05caa0067a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8589494e3f6e332c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/comm-board/WallBoard.tsx:408"}, "properties": {"repobilityId": "322670295c03bc2f", "scanner": "scanner-primary", "fingerprint": "8589494e3f6e332c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6aea282b0ab4f179", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/popup/PopupListView.tsx:116"}, "properties": {"repobilityId": "1caf73383e9f12fc", "scanner": "scanner-primary", "fingerprint": "6aea282b0ab4f179", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b1d7b9eb94a2fb29", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/academic-admin/Dashboard.tsx:168"}, "properties": {"repobilityId": "dcc90cf6decc7562", "scanner": "scanner-primary", "fingerprint": "b1d7b9eb94a2fb29", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f37399e10dcf83a8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/courses/ScheduleEditor.tsx:266"}, "properties": {"repobilityId": "436fa887f6c1d9e6", "scanner": "scanner-primary", "fingerprint": "f37399e10dcf83a8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0ad486bb05684ef3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/card/ReceivedCardsSection.tsx:303"}, "properties": {"repobilityId": "b7b4daf6644398be", "scanner": "scanner-primary", "fingerprint": "0ad486bb05684ef3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0b70614d74931c49", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/card/BusinessCard.tsx:104"}, "properties": {"repobilityId": "b742ac18e36130be", "scanner": "scanner-primary", "fingerprint": "0b70614d74931c49", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-90bcd9024bfd4889", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/card-news/CardNewsEditor.tsx:402"}, "properties": {"repobilityId": "64b1ed694c425da0", "scanner": "scanner-primary", "fingerprint": "90bcd9024bfd4889", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9f8c0dd1d28d9ac5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/mypage/HabitTracker.tsx:556"}, "properties": {"repobilityId": "c2e22fbe107d2a34", "scanner": "scanner-primary", "fingerprint": "9f8c0dd1d28d9ac5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3064204df1751fd9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/mypage/ResearchTimerCompact.tsx:83"}, "properties": {"repobilityId": "c447f0108990d4c0", "scanner": "scanner-primary", "fingerprint": "3064204df1751fd9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4c9ce85826397b6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/board/InterviewBuilder.tsx:747"}, "properties": {"repobilityId": "d0dd339c8a2d5c54", "scanner": "scanner-primary", "fingerprint": "d4c9ce85826397b6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8374d4df302c4e60", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/board/PostList.tsx:50"}, "properties": {"repobilityId": "96c05ce6aa09db5c", "scanner": "scanner-primary", "fingerprint": "8374d4df302c4e60", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-93647f6e479a784b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/board/InterviewPlayer.tsx:366"}, "properties": {"repobilityId": "e06869f3e6cf8d47", "scanner": "scanner-primary", "fingerprint": "93647f6e479a784b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ea9a337545b6b0d5", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/features/board/PostForm.tsx:266"}, "properties": {"repobilityId": "d2169e7a7c731da7", "scanner": "scanner-primary", "fingerprint": "ea9a337545b6b0d5", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b03546d82e1d16e2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research-analytics/TitleNgramTrend.tsx:215"}, "properties": {"repobilityId": "5d0bcf5c6ffbf841", "scanner": "scanner-primary", "fingerprint": "b03546d82e1d16e2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b9e37ef9f6c98105", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research-analytics/MultiAxisTrend.tsx:172"}, "properties": {"repobilityId": "23670775bb5834f2", "scanner": "scanner-primary", "fingerprint": "b9e37ef9f6c98105", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-54fb4ef65997dc2d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research-analytics/ResearchSearch.tsx:78"}, "properties": {"repobilityId": "20d5aa0070be33ff", "scanner": "scanner-primary", "fingerprint": "54fb4ef65997dc2d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5fb640e6f0bd14a5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research-analytics/SubjectDistribution.tsx:171"}, "properties": {"repobilityId": "b8fda1fe6ec56b6b", "scanner": "scanner-primary", "fingerprint": "5fb640e6f0bd14a5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6a1243fc14a66623", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research-analytics/ResearchTypeChart.tsx:109"}, "properties": {"repobilityId": "498636825d10fda9", "scanner": "scanner-primary", "fingerprint": "6a1243fc14a66623", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4320b0228fbe837a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/features/research-analytics/MethodProfile.tsx:63"}, "properties": {"repobilityId": "086da4a307270319", "scanner": "scanner-primary", "fingerprint": "4320b0228fbe837a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-06ca3dd7a15f54eb", "level": "error", "message": {"text": "Possible secret in scripts/seed-newsletter-issue-1.mjs"}, "properties": {"repobilityId": "31932fd164f9c808", "scanner": "scanner-primary", "fingerprint": "06ca3dd7a15f54eb", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/seed-newsletter-issue-1.mjs"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-06ca3dd7a15f54eb", "level": "error", "message": {"text": "Possible secret in scripts/seed-newsletter-issue-1.mjs"}, "properties": {"repobilityId": "ea4261b6f4ae1972", "scanner": "scanner-primary", "fingerprint": "06ca3dd7a15f54eb", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/seed-newsletter-issue-1.mjs"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-06171bf77374bd26", "level": "error", "message": {"text": "Possible secret in scripts/rollback-press-migration.mjs"}, "properties": {"repobilityId": "8989c68fa44c8304", "scanner": "scanner-primary", "fingerprint": "06171bf77374bd26", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/rollback-press-migration.mjs"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-f907f991d48a4c77", "level": "error", "message": {"text": "Possible secret in scripts/reset-admin.mjs"}, "properties": {"repobilityId": "6bfca9137e85be02", "scanner": "scanner-primary", "fingerprint": "f907f991d48a4c77", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/reset-admin.mjs"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-f907f991d48a4c77", "level": "error", "message": {"text": "Possible secret in scripts/reset-admin.mjs"}, "properties": {"repobilityId": "92956a256eceb25a", "scanner": "scanner-primary", "fingerprint": "f907f991d48a4c77", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/reset-admin.mjs"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-342eb35d7a332e2d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/deploy-vercel.js:28"}, "properties": {"repobilityId": "2c9b709e76e759a3", "scanner": "scanner-primary", "fingerprint": "342eb35d7a332e2d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/deploy-vercel.js"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-705f0d1aa02a8488", "level": "error", "message": {"text": "Possible secret in scripts/migrate-press-to-promotion.mjs"}, "properties": {"repobilityId": "6daefec9482e1b89", "scanner": "scanner-primary", "fingerprint": "705f0d1aa02a8488", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/migrate-press-to-promotion.mjs"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-015952032f09c501", "level": "error", "message": {"text": "Possible secret in scripts/check-alumni-theses-count.mjs"}, "properties": {"repobilityId": "7a595a8dede00f8c", "scanner": "scanner-primary", "fingerprint": "015952032f09c501", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/check-alumni-theses-count.mjs"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-8ba8fa082c70cf8f", "level": "error", "message": {"text": "Possible secret in scripts/create-admin.mjs"}, "properties": {"repobilityId": "3185e198b15bf6e4", "scanner": "scanner-primary", "fingerprint": "8ba8fa082c70cf8f", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/create-admin.mjs"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-8ba8fa082c70cf8f", "level": "error", "message": {"text": "Possible secret in scripts/create-admin.mjs"}, "properties": {"repobilityId": "f68938d75c3ab4ce", "scanner": "scanner-primary", "fingerprint": "8ba8fa082c70cf8f", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/create-admin.mjs"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-e694198a0aa9d0b8", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in agent-server/main.py:42"}, "properties": {"repobilityId": "1e0ec4e9b20b666d", "scanner": "scanner-primary", "fingerprint": "e694198a0aa9d0b8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "agent-server/main.py"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-09a2568293c38aa8", "level": "error", "message": {"text": "Possible secret in public/firebase-messaging-sw.js"}, "properties": {"repobilityId": "7f8d326dce3b5ab3", "scanner": "scanner-primary", "fingerprint": "09a2568293c38aa8", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/firebase-messaging-sw.js"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-84507cbd22516b57", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/diagnosis/DiagnosisRunner.tsx:316"}, "properties": {"repobilityId": "be444c2f8af3461c", "scanner": "scanner-primary", "fingerprint": "84507cbd22516b57", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/diagnosis/DiagnosisRunner.tsx"}, "region": {"startLine": 316}}}]}, {"ruleId": "scanner-5af5c23137958525", "level": "error", "message": {"text": "Possible secret in src/components/mypage/MyPageView.tsx"}, "properties": {"repobilityId": "99c2971c4de41526", "scanner": "scanner-primary", "fingerprint": "5af5c23137958525", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/mypage/MyPageView.tsx"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-f45019270621c124", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/JsonLd.tsx:52"}, "properties": {"repobilityId": "fed4538264d6fd2d", "scanner": "scanner-primary", "fingerprint": "f45019270621c124", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/seo/JsonLd.tsx"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-48f0aa29dc48dbf5", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:138"}, "properties": {"repobilityId": "0bca654fa2052eb0", "scanner": "scanner-primary", "fingerprint": "48f0aa29dc48dbf5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/layout.tsx"}, "region": {"startLine": 138}}}]}, {"ruleId": "scanner-82b6e13a157643a8", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/board/[id]/page.tsx:306"}, "properties": {"repobilityId": "b5467ba87ce2867b", "scanner": "scanner-primary", "fingerprint": "82b6e13a157643a8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/board/[id]/page.tsx"}, "region": {"startLine": 306}}}]}, {"ruleId": "scanner-b7ff64d4d338ed2c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/features/seminar-admin/NametagGenerator.tsx:542"}, "properties": {"repobilityId": "ac06ad80f2e5cebf", "scanner": "scanner-primary", "fingerprint": "b7ff64d4d338ed2c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/features/seminar-admin/NametagGenerator.tsx"}, "region": {"startLine": 542}}}]}, {"ruleId": "scanner-6e865ca034188bc2", "level": "note", "message": {"text": "Insecure pattern 'document_write' in src/features/seminar-admin/ReportTab.tsx:116"}, "properties": {"repobilityId": "03eba258e7798eec", "scanner": "scanner-primary", "fingerprint": "6e865ca034188bc2", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/features/seminar-admin/ReportTab.tsx"}, "region": {"startLine": 116}}}]}, {"ruleId": "scanner-bbb203d415f4cea4", "level": "note", "message": {"text": "Insecure pattern 'document_write' in src/features/seminar-admin/RegistrationsTab.tsx:202"}, "properties": {"repobilityId": "a4297b059d32e580", "scanner": "scanner-primary", "fingerprint": "bbb203d415f4cea4", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/features/seminar-admin/RegistrationsTab.tsx"}, "region": {"startLine": 202}}}]}, {"ruleId": "scanner-f914c864614420ff", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/features/seminar-admin/CertificateGenerator.tsx:1595"}, "properties": {"repobilityId": "f87e2a62668c5e0c", "scanner": "scanner-primary", "fingerprint": "f914c864614420ff", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/features/seminar-admin/CertificateGenerator.tsx"}, "region": {"startLine": 1595}}}]}, {"ruleId": "scanner-39baf21e2155b688", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/features/board/PostForm.tsx:266"}, "properties": {"repobilityId": "fc86085b05dbaf68", "scanner": "scanner-primary", "fingerprint": "39baf21e2155b688", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/features/board/PostForm.tsx"}, "region": {"startLine": 266}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bee6b8956e03198c", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-8ec2dc0f4dac26c9", "level": "note", "message": {"text": "Very large file: src/components/mypage/MyPageView.tsx (1671 lines)"}, "properties": {"repobilityId": "da119bf60a358702", "scanner": "scanner-primary", "fingerprint": "8ec2dc0f4dac26c9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6a57f746093c70fc", "level": "note", "message": {"text": "Very large file: src/app/console/courses/page.tsx (2024 lines)"}, "properties": {"repobilityId": "b035172ea7b9ab1f", "scanner": "scanner-primary", "fingerprint": "6a57f746093c70fc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-08b3fe14265d26ba", "level": "note", "message": {"text": "Very large file: src/app/courses/page.tsx (1595 lines)"}, "properties": {"repobilityId": "a086b85928cce0fa", "scanner": "scanner-primary", "fingerprint": "08b3fe14265d26ba", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5c825dae50d7e1ab", "level": "note", "message": {"text": "Very large file: src/app/courses/[id]/schedule/page.tsx (1635 lines)"}, "properties": {"repobilityId": "d066e5206a83314e", "scanner": "scanner-primary", "fingerprint": "5c825dae50d7e1ab", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c8ccc1e858ed5761", "level": "note", "message": {"text": "Very large file: src/lib/diagnostic-seed.ts (2048 lines)"}, "properties": {"repobilityId": "1079e67c940834c5", "scanner": "scanner-primary", "fingerprint": "c8ccc1e858ed5761", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b28b081c27329926", "level": "note", "message": {"text": "Very large file: src/lib/bkend.ts (3812 lines)"}, "properties": {"repobilityId": "86413c01fc184b3f", "scanner": "scanner-primary", "fingerprint": "b28b081c27329926", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cba1926c7b915693", "level": "note", "message": {"text": "Very large file: src/lib/archive-seed.ts (1310 lines)"}, "properties": {"repobilityId": "40de841537afc118", "scanner": "scanner-primary", "fingerprint": "cba1926c7b915693", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d7d81cfa84bc3d02", "level": "note", "message": {"text": "Very large file: src/features/seminar-admin/RegistrationsTab.tsx (1547 lines)"}, "properties": {"repobilityId": "a534c617d0b82a6d", "scanner": "scanner-primary", "fingerprint": "d7d81cfa84bc3d02", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e64791268a8fa2d6", "level": "note", "message": {"text": "Very large file: src/features/seminar-admin/CertificateGenerator.tsx (2385 lines)"}, "properties": {"repobilityId": "5867a261f6bfd8cd", "scanner": "scanner-primary", "fingerprint": "e64791268a8fa2d6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-05e081aac7bc7fb7", "level": "note", "message": {"text": "Very large file: src/features/research/ResearchReportInterview.tsx (2217 lines)"}, "properties": {"repobilityId": "0bc227e8b97152ce", "scanner": "scanner-primary", "fingerprint": "05e081aac7bc7fb7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-757520f6b91658f8", "level": "note", "message": {"text": "Very large file: src/features/research/WritingPaperEditor.tsx (2531 lines)"}, "properties": {"repobilityId": "5229417e08796592", "scanner": "scanner-primary", "fingerprint": "757520f6b91658f8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a196e1519948acae", "level": "note", "message": {"text": "Very large file: src/features/research/ResearchReportEditor.tsx (2075 lines)"}, "properties": {"repobilityId": "e34b9b3cdc66949d", "scanner": "scanner-primary", "fingerprint": "a196e1519948acae", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9bbb2c59024997be", "level": "note", "message": {"text": "Very large file: src/features/conference/ConferenceProgramEditor.tsx (1707 lines)"}, "properties": {"repobilityId": "a255f9e3c28cb238", "scanner": "scanner-primary", "fingerprint": "9bbb2c59024997be", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9115420c7b0a5449", "level": "note", "message": {"text": "Very large file: src/features/conference/ConferenceProgramView.tsx (1148 lines)"}, "properties": {"repobilityId": "eb289574149627fb", "scanner": "scanner-primary", "fingerprint": "9115420c7b0a5449", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f58664eaf5d8b6c8", "level": "note", "message": {"text": "Very large file: src/features/admin/AdminMemberTab.tsx (1135 lines)"}, "properties": {"repobilityId": "a38f1a6fbda7df7f", "scanner": "scanner-primary", "fingerprint": "f58664eaf5d8b6c8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-00e1e3285b2b9144", "level": "note", "message": {"text": "Very large file: src/features/defense/DefensePracticeRunner.tsx (2673 lines)"}, "properties": {"repobilityId": "e35989b05c31a379", "scanner": "scanner-primary", "fingerprint": "00e1e3285b2b9144", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e4ae60068abf12d8", "level": "note", "message": {"text": "Very large file: src/features/activities/ActivityDetail.tsx (3530 lines)"}, "properties": {"repobilityId": "0133c9f56a868f05", "scanner": "scanner-primary", "fingerprint": "e4ae60068abf12d8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "8eb72287c3313910", "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": "30ba8b9723edb902", "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": "932189e28162dac9", "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": "329577e886b53f40", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "26a9db1524091753", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "ae4cf13aa72ac3b0", "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": "0f575c80058dc068", "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-eb17730cdb0455f9", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/sync-archive-crosslinks.ts:1"}, "properties": {"repobilityId": "c8477f8d96b56c42", "scanner": "scanner-primary", "fingerprint": "eb17730cdb0455f9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-22fd54d64b5ee38d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/poc-research-review.mjs:96"}, "properties": {"repobilityId": "b67760f5af5ff2ac", "scanner": "scanner-primary", "fingerprint": "22fd54d64b5ee38d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fdba8494a623bed3", "level": "none", "message": {"text": "Commented-code block (14 lines) in scripts/enrich-measurement-tools.ts:1"}, "properties": {"repobilityId": "2051dccdb74af9b9", "scanner": "scanner-primary", "fingerprint": "fdba8494a623bed3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3a688844c2ce9b5d", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/extract-thesis-analysis.ts:1"}, "properties": {"repobilityId": "d9e15ab6dbe46a3a", "scanner": "scanner-primary", "fingerprint": "3a688844c2ce9b5d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6ee987d8d136c084", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/seed-concept-scholars.ts:1"}, "properties": {"repobilityId": "8f0d2beab898d79e", "scanner": "scanner-primary", "fingerprint": "6ee987d8d136c084", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e0f1a17b0e61a472", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/seed-measurement-scales.ts:1"}, "properties": {"repobilityId": "e50c3dac93a13888", "scanner": "scanner-primary", "fingerprint": "e0f1a17b0e61a472", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-62c1579eb5bd326e", "level": "none", "message": {"text": "Commented-code block (9 lines) in scripts/seed-learning-theories.ts:1"}, "properties": {"repobilityId": "3f308a50da156754", "scanner": "scanner-primary", "fingerprint": "62c1579eb5bd326e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-413d6bb839384a30", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/link-theses-concepts.ts:1"}, "properties": {"repobilityId": "287f4515fa579034", "scanner": "scanner-primary", "fingerprint": "413d6bb839384a30", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-de48fd5c2e421c1f", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/rebuild-thesis-method-links.ts:1"}, "properties": {"repobilityId": "57b5d11aa4bef475", "scanner": "scanner-primary", "fingerprint": "de48fd5c2e421c1f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f385f8a63ec5b6f5", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/seed-assumption-remedies.ts:1"}, "properties": {"repobilityId": "863e315753faf722", "scanner": "scanner-primary", "fingerprint": "f385f8a63ec5b6f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c7192d29495c800b", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/seed-tf-values.ts:1"}, "properties": {"repobilityId": "6e032f5344ad8afe", "scanner": "scanner-primary", "fingerprint": "c7192d29495c800b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ac45228de4e86e5b", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/seed-variable-domains.ts:1"}, "properties": {"repobilityId": "a1f6312117959cff", "scanner": "scanner-primary", "fingerprint": "ac45228de4e86e5b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2a851a341f21a3d", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/seed-writing-cvi.ts:1"}, "properties": {"repobilityId": "cc249e0e29b63b56", "scanner": "scanner-primary", "fingerprint": "e2a851a341f21a3d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f343321eaae2b77", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/reclassify-concepts.ts:1"}, "properties": {"repobilityId": "a1ad8834e4659f6a", "scanner": "scanner-primary", "fingerprint": "0f343321eaae2b77", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-efb9937f95d2139b", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/seed-scale-development.ts:1"}, "properties": {"repobilityId": "3c058668ef817995", "scanner": "scanner-primary", "fingerprint": "efb9937f95d2139b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-99dce57f3ace56dc", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/seed-jamovi-guides.ts:1"}, "properties": {"repobilityId": "5b432c17692ea707", "scanner": "scanner-primary", "fingerprint": "99dce57f3ace56dc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-33bcfe865d096ac4", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/seed-cognitive-measurements.ts:1"}, "properties": {"repobilityId": "9524147b303f5688", "scanner": "scanner-primary", "fingerprint": "33bcfe865d096ac4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0660fbe98b0be0e5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:51"}, "properties": {"repobilityId": "af74d718eb1683cd", "scanner": "scanner-primary", "fingerprint": "0660fbe98b0be0e5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ef17792a63ba86a0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/types/user.ts:134"}, "properties": {"repobilityId": "e3ef806a48244ee3", "scanner": "scanner-primary", "fingerprint": "ef17792a63ba86a0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-22db83837fb0399b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/types/flashcard.ts:6"}, "properties": {"repobilityId": "f951a1e0ba5a6bba", "scanner": "scanner-primary", "fingerprint": "22db83837fb0399b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b16df7111fdaa59", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/types/operations.ts:230"}, "properties": {"repobilityId": "44cdfbf8998852c6", "scanner": "scanner-primary", "fingerprint": "1b16df7111fdaa59", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e6199d1e8f31440c", "level": "note", "message": {"text": "Legacy-named symbol `yonsei_whats_new_dismissed_v2` in src/components/mypage/MyPageView.tsx:111"}, "properties": {"repobilityId": "fb1abd73b506b955", "scanner": "scanner-primary", "fingerprint": "e6199d1e8f31440c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6ec5e0cc29ea6e7b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mypage/MyPageView.tsx:184"}, "properties": {"repobilityId": "a6d375ddef1cd15a", "scanner": "scanner-primary", "fingerprint": "6ec5e0cc29ea6e7b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e4cab354a6726bc4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/mypage/MyActivitiesView.tsx:104"}, "properties": {"repobilityId": "17f1d302eb00ca3a", "scanner": "scanner-primary", "fingerprint": "e4cab354a6726bc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d67fc577de8997a7", "level": "note", "message": {"text": "Legacy-named symbol `yedu_dashboard_diet_notice_v1` in src/app/dashboard/page.tsx:200"}, "properties": {"repobilityId": "d29e79ab429872e9", "scanner": "scanner-primary", "fingerprint": "d67fc577de8997a7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-500bb2e7b2592e86", "level": "note", "message": {"text": "Legacy-named symbol `yonsei_whats_new_dismissed_v2` in src/app/whats-new/page.tsx:24"}, "properties": {"repobilityId": "ba39d7f576d332c5", "scanner": "scanner-primary", "fingerprint": "500bb2e7b2592e86", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c33c1cd5dcaf56c0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/certificates/page.tsx:104"}, "properties": {"repobilityId": "78baf9315a1d9c56", "scanner": "scanner-primary", "fingerprint": "c33c1cd5dcaf56c0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3b07ebd965782d23", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/seminars/[id]/page.tsx:94"}, "properties": {"repobilityId": "36dbb3d3eda44fd6", "scanner": "scanner-primary", "fingerprint": "3b07ebd965782d23", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-736b87167ce47192", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/seminars/[id]/review/page.tsx:168"}, "properties": {"repobilityId": "8f427e57ff2b1cce", "scanner": "scanner-primary", "fingerprint": "736b87167ce47192", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-43239a215d1b7853", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/seminars/[id]/speaker-review/page.tsx:349"}, "properties": {"repobilityId": "b53a7c3b84aa6877", "scanner": "scanner-primary", "fingerprint": "43239a215d1b7853", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-402e84b4f9e70d0a", "level": "note", "message": {"text": "Legacy-named symbol `yedu_content_seed_done_v1` in src/app/console/page.tsx:64"}, "properties": {"repobilityId": "93ba2fcfdf8190e3", "scanner": "scanner-primary", "fingerprint": "402e84b4f9e70d0a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0c0ae449eea2150b", "level": "note", "message": {"text": "Legacy-named symbol `deleteOld` in src/app/mypage/notifications/page.tsx:231"}, "properties": {"repobilityId": "b49fe612400e0098", "scanner": "scanner-primary", "fingerprint": "0c0ae449eea2150b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b85c175394aee73e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/board/[id]/page.tsx:83"}, "properties": {"repobilityId": "253af58d8f9e67f5", "scanner": "scanner-primary", "fingerprint": "b85c175394aee73e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fd26f67baaabe7d8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/guestLinker.ts:70"}, "properties": {"repobilityId": "d954a0d13f7cf987", "scanner": "scanner-primary", "fingerprint": "fd26f67baaabe7d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c9b25c6af5ec664c", "level": "none", "message": {"text": "Commented-code block (14 lines) in src/lib/diagnostic-seed.ts:3"}, "properties": {"repobilityId": "1cb18335306803c3", "scanner": "scanner-primary", "fingerprint": "c9b25c6af5ec664c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dcac9b9cae59bb62", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/storage.ts:52"}, "properties": {"repobilityId": "49759aa5f8d19a9e", "scanner": "scanner-primary", "fingerprint": "dcac9b9cae59bb62", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6eb7bfbc1eb46e3d", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/writing-tips-seed.ts:6"}, "properties": {"repobilityId": "e4043550f32bb39d", "scanner": "scanner-primary", "fingerprint": "6eb7bfbc1eb46e3d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9052ddacf1851d86", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/push.ts:103"}, "properties": {"repobilityId": "1ebf5881b55c19ca", "scanner": "scanner-primary", "fingerprint": "9052ddacf1851d86", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-01cdd1ce93d50faf", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/bkend.ts:2748"}, "properties": {"repobilityId": "dc3f7a559ef1b6f0", "scanner": "scanner-primary", "fingerprint": "01cdd1ce93d50faf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2b52caa6753c9d01", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/bkend.ts:2427"}, "properties": {"repobilityId": "1ca824a767936b47", "scanner": "scanner-primary", "fingerprint": "2b52caa6753c9d01", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1380b04bc7c05ef8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/research-paper-source.ts:103"}, "properties": {"repobilityId": "012c1546e59e212c", "scanner": "scanner-primary", "fingerprint": "1380b04bc7c05ef8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7173a28e9ba0ea2b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/seminar-admin/RegistrationsTab.tsx:815"}, "properties": {"repobilityId": "2da0d709031fb66f", "scanner": "scanner-primary", "fingerprint": "7173a28e9ba0ea2b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-58af3610fadc8fed", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/features/auth/AuthProvider.tsx:53"}, "properties": {"repobilityId": "3f23f5150c0aa4cf", "scanner": "scanner-primary", "fingerprint": "58af3610fadc8fed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e47c2fddaab14dfe", "level": "none", "message": {"text": "Commented-code block (14 lines) in src/features/research/ResearchReportInterview.tsx:415"}, "properties": {"repobilityId": "1ce5f00ea2431412", "scanner": "scanner-primary", "fingerprint": "e47c2fddaab14dfe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-110d891582392fdb", "level": "note", "message": {"text": "Legacy-named symbol `yedu_welcome_banner_dismissed_v1` in src/features/dashboard/NewMemberWelcomeBanner.tsx:14"}, "properties": {"repobilityId": "442db0f4cd218353", "scanner": "scanner-primary", "fingerprint": "110d891582392fdb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d15e8ecf0023ad6a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/dashboard/NewMemberChecklistWidget.tsx:7"}, "properties": {"repobilityId": "68865e89e03ab7d9", "scanner": "scanner-primary", "fingerprint": "d15e8ecf0023ad6a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0589b152d4ca0f2b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/features/dashboard/widget-visibility.ts:47"}, "properties": {"repobilityId": "3d5eb83f57213090", "scanner": "scanner-primary", "fingerprint": "0589b152d4ca0f2b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2df04701de57fee", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/agent/useAgentServer.ts:60"}, "properties": {"repobilityId": "6d3beeab93c44771", "scanner": "scanner-primary", "fingerprint": "f2df04701de57fee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f4a8f1b68e77e7db", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/seminar/SeminarReviews.tsx:73"}, "properties": {"repobilityId": "c5bc3fadd276b2e7", "scanner": "scanner-primary", "fingerprint": "f4a8f1b68e77e7db", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-18b9d926155560b4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/activities/StudySessionAssignmentsCard.tsx:146"}, "properties": {"repobilityId": "7adf23c515fff188", "scanner": "scanner-primary", "fingerprint": "18b9d926155560b4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8bcfc89e9f64d2bd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/activities/ActivityPage.tsx:45"}, "properties": {"repobilityId": "7640ced904d770ed", "scanner": "scanner-primary", "fingerprint": "8bcfc89e9f64d2bd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b2431f2254f13a12", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/activities/ActivityDetail.tsx:274"}, "properties": {"repobilityId": "ff2e4aa31dec2205", "scanner": "scanner-primary", "fingerprint": "b2431f2254f13a12", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4f3023f2d7293a1d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/features/activities/FormBuilder.tsx:62"}, "properties": {"repobilityId": "f81fe4f6ff164081", "scanner": "scanner-primary", "fingerprint": "4f3023f2d7293a1d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-08919dff68ba37bd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/activities/StudySessionReflectionCard.tsx:97"}, "properties": {"repobilityId": "065a796d7a36f5ce", "scanner": "scanner-primary", "fingerprint": "08919dff68ba37bd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3a4eb7f365b72c08", "level": "note", "message": {"text": "Legacy-named symbol `yedu_comm_guest_name_v1` in src/features/comm-board/guest-name.ts:9"}, "properties": {"repobilityId": "c0fedf7e65a45074", "scanner": "scanner-primary", "fingerprint": "3a4eb7f365b72c08", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-835a2355a3836354", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/board/InterviewBuilder.tsx:515"}, "properties": {"repobilityId": "e1681a8a9bd733e6", "scanner": "scanner-primary", "fingerprint": "835a2355a3836354", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dff5749bd2fabf46", "level": "note", "message": {"text": "Legacy-named symbol `yedu_post_draft_v1` in src/features/board/PostForm.tsx:73"}, "properties": {"repobilityId": "9171142d50e7083d", "scanner": "scanner-primary", "fingerprint": "dff5749bd2fabf46", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ade92878d4c6d72d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/features/yonsei-agents/useAgentJobs.ts:69"}, "properties": {"repobilityId": "b9f4ff9775530bcf", "scanner": "scanner-primary", "fingerprint": "ade92878d4c6d72d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2d6ffa20a9f1093b", "level": "note", "message": {"text": "24 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "880bbf29bf1f87e1", "scanner": "scanner-primary", "fingerprint": "2d6ffa20a9f1093b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "6d73a8f5446bdc85", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "3cbc2ac02ff3d007", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-c635a4715a4e2102", "level": "error", "message": {"text": "Dangling fetch: GET https://api.crossref.org/works/${encodeURIComponent(doi)} (scripts/poc-research-review.mjs:119)"}, "properties": {"repobilityId": "8029c8cd05f17ff8", "scanner": "scanner-primary", "fingerprint": "c635a4715a4e2102", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5691bc754efd4be0", "level": "error", "message": {"text": "Dangling fetch: POST https://api.semanticscholar.org/graph/v1/paper/DOI:${encodeURIComponent(doi)}?fields=abstract,tldr (scripts/poc-research-review.mjs:137)"}, "properties": {"repobilityId": "ccea4d0b16e2f212", "scanner": "scanner-primary", "fingerprint": "5691bc754efd4be0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f35c95c353c65548", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (scripts/poc-research-review.mjs:216)"}, "properties": {"repobilityId": "df86d027d753edfe", "scanner": "scanner-primary", "fingerprint": "f35c95c353c65548", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7cf69fec28628942", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/impersonate/revert (src/components/layout/ImpersonationBanner.tsx:47)"}, "properties": {"repobilityId": "57f7d8de5d199334", "scanner": "scanner-primary", "fingerprint": "7cf69fec28628942", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3878f944f974792c", "level": "error", "message": {"text": "Dangling fetch: GET /api/me/applications (src/components/mypage/MyPageView.tsx:184)"}, "properties": {"repobilityId": "00cac13b242cd69e", "scanner": "scanner-primary", "fingerprint": "3878f944f974792c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-307ff6282a471ec0", "level": "error", "message": {"text": "Dangling fetch: GET /api/me/applications (src/components/mypage/MyActivitiesView.tsx:104)"}, "properties": {"repobilityId": "35da51cc6c70fd97", "scanner": "scanner-primary", "fingerprint": "307ff6282a471ec0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f109595d31ea3645", "level": "error", "message": {"text": "Dangling fetch: GET https://fonts.gstatic.com/s/nanumgothic/v23/PN_3Rfu-cuLQmEsRPRm90Q.woff2 (src/app/archive/[type]/[id]/opengraph-image.tsx:77)"}, "properties": {"repobilityId": "f5cfd33c9ecd6da5", "scanner": "scanner-primary", "fingerprint": "f109595d31ea3645", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-52da7678014737ef", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/forgot-password/verify (src/app/forgot-password/page.tsx:51)"}, "properties": {"repobilityId": "00ad8593714ae549", "scanner": "scanner-primary", "fingerprint": "52da7678014737ef", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5ecdea3690364a65", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/forgot-password/answer (src/app/forgot-password/page.tsx:74)"}, "properties": {"repobilityId": "d4d3391590a74fb2", "scanner": "scanner-primary", "fingerprint": "5ecdea3690364a65", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ab19496105bfe896", "level": "error", "message": {"text": "Dangling fetch: GET https://fonts.gstatic.com/s/nanumgothic/v23/PN_3Rfu-cuLQmEsRPRm90Q.woff2 (src/app/alumni/thesis/[id]/opengraph-image.tsx:60)"}, "properties": {"repobilityId": "148ae6c3445b6918", "scanner": "scanner-primary", "fingerprint": "ab19496105bfe896", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bc0f8bc31527274e", "level": "error", "message": {"text": "Dangling fetch: POST /api/certificates/batch (src/app/admin/certificates/page.tsx:104)"}, "properties": {"repobilityId": "a44c839784a3302d", "scanner": "scanner-primary", "fingerprint": "bc0f8bc31527274e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-17803ba8d92fa8be", "level": "error", "message": {"text": "Dangling fetch: POST /api/certificates/email (src/app/admin/certificates/page.tsx:168)"}, "properties": {"repobilityId": "359bed48ebc20cfc", "scanner": "scanner-primary", "fingerprint": "17803ba8d92fa8be", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fe4f9312a5b42a42", "level": "error", "message": {"text": "Dangling fetch: POST /api/certificates/pdf (src/app/admin/certificates/page.tsx:358)"}, "properties": {"repobilityId": "24328c4ce684e3d4", "scanner": "scanner-primary", "fingerprint": "fe4f9312a5b42a42", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e837ddfc64cefb36", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/audit-users (src/app/admin/user-audit/page.tsx:49)"}, "properties": {"repobilityId": "2a5312028fbde970", "scanner": "scanner-primary", "fingerprint": "e837ddfc64cefb36", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ba9bea5dd1b58463", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/semester-report (src/app/admin/semester-report/page.tsx:31)"}, "properties": {"repobilityId": "cd3189dd644637c0", "scanner": "scanner-primary", "fingerprint": "ba9bea5dd1b58463", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-510a709a27afbb61", "level": "error", "message": {"text": "Dangling fetch: GET https://fonts.gstatic.com/s/nanumgothic/v23/PN_3Rfu-cuLQmEsRPRm90Q.woff2 (src/app/seminars/[id]/opengraph-image.tsx:63)"}, "properties": {"repobilityId": "9f7c81a312d44264", "scanner": "scanner-primary", "fingerprint": "510a709a27afbb61", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1047acb1ca7f0d67", "level": "error", "message": {"text": "Dangling fetch: GET /api/reviews?seminarId=${seminarId}&mode=list (src/app/seminars/[id]/page.tsx:94)"}, "properties": {"repobilityId": "f7855fc5e807b90c", "scanner": "scanner-primary", "fingerprint": "1047acb1ca7f0d67", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5ece71718f2d1270", "level": "error", "message": {"text": "Dangling fetch: GET /api/reviews?${params} (src/app/seminars/[id]/review/page.tsx:84)"}, "properties": {"repobilityId": "db6eb87d81d685f0", "scanner": "scanner-primary", "fingerprint": "5ece71718f2d1270", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7cbf403d157c85a4", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/reviews (src/app/seminars/[id]/review/page.tsx:151)"}, "properties": {"repobilityId": "78ac702f8702f342", "scanner": "scanner-primary", "fingerprint": "7cbf403d157c85a4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2339c08e29adc5a9", "level": "error", "message": {"text": "Dangling fetch: POST /api/reviews (src/app/seminars/[id]/review/page.tsx:168)"}, "properties": {"repobilityId": "7ef0f687b0b47a1d", "scanner": "scanner-primary", "fingerprint": "2339c08e29adc5a9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-329d74cb78b41355", "level": "error", "message": {"text": "Dangling fetch: GET /api/reviews/cert-no?seminarId=${seminarId}&speakerName=${encodeURIComponent(speakerName)} (src/app/seminars/[id]/speaker-review/page.tsx:219)"}, "properties": {"repobilityId": "07668c0dde8c416b", "scanner": "scanner-primary", "fingerprint": "329d74cb78b41355", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ee41ab99b4cd5f5d", "level": "error", "message": {"text": "Dangling fetch: GET /api/reviews?${params} (src/app/seminars/[id]/speaker-review/page.tsx:281)"}, "properties": {"repobilityId": "8d2775a48f579b6e", "scanner": "scanner-primary", "fingerprint": "ee41ab99b4cd5f5d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1f8a3da0fc922733", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/reviews (src/app/seminars/[id]/speaker-review/page.tsx:331)"}, "properties": {"repobilityId": "9547f151e4889ca9", "scanner": "scanner-primary", "fingerprint": "1f8a3da0fc922733", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6344c719f192abcc", "level": "error", "message": {"text": "Dangling fetch: POST /api/reviews (src/app/seminars/[id]/speaker-review/page.tsx:349)"}, "properties": {"repobilityId": "03ec68ccca693a1d", "scanner": "scanner-primary", "fingerprint": "6344c719f192abcc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-21ffaf2a4ebaa3bf", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/seed-board-content (src/app/console/page.tsx:78)"}, "properties": {"repobilityId": "17e9d93b3a4d6a58", "scanner": "scanner-primary", "fingerprint": "21ffaf2a4ebaa3bf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-18bd99621b49aaab", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/ai-forum/advance (src/app/console/ai-forum/page.tsx:139)"}, "properties": {"repobilityId": "c51f19b0846d9ce8", "scanner": "scanner-primary", "fingerprint": "18bd99621b49aaab", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8ade07e228dad50b", "level": "error", "message": {"text": "Dangling fetch: GET /api/console/potential-members (src/app/console/potential-members/page.tsx:50)"}, "properties": {"repobilityId": "1f8c4166276496fb", "scanner": "scanner-primary", "fingerprint": "8ade07e228dad50b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-98da703e96f5fcf5", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/agent-workflow (src/app/console/agent-workflows/page.tsx:45)"}, "properties": {"repobilityId": "d12293a460a18aff", "scanner": "scanner-primary", "fingerprint": "98da703e96f5fcf5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-363d7cbcb4de63b8", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/impersonate (src/app/console/members/[id]/page.tsx:59)"}, "properties": {"repobilityId": "0b009e25edf654bd", "scanner": "scanner-primary", "fingerprint": "363d7cbcb4de63b8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1095be5379e6d056", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/reset-password (src/app/console/members/[id]/page.tsx:174)"}, "properties": {"repobilityId": "bb9c49d4e6a34df0", "scanner": "scanner-primary", "fingerprint": "1095be5379e6d056", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-476853b85147e467", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/migrate-applicants?mode=${mode} (src/app/console/migrate-applicants/page.tsx:38)"}, "properties": {"repobilityId": "6e6097257b011b95", "scanner": "scanner-primary", "fingerprint": "476853b85147e467", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c723739ed8cff33d", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/roadmap/seed (src/app/console/roadmap/page.tsx:194)"}, "properties": {"repobilityId": "6d825203ca089299", "scanner": "scanner-primary", "fingerprint": "c723739ed8cff33d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b85ffbbdb0c973c5", "level": "error", "message": {"text": "Dangling fetch: GET https://fonts.gstatic.com/s/nanumgothic/v23/PN_3Rfu-cuLQmEsRPRm90Q.woff2 (src/app/card-news/[id]/opengraph-image.tsx:11)"}, "properties": {"repobilityId": "8e6eff4e1447fc42", "scanner": "scanner-primary", "fingerprint": "b85ffbbdb0c973c5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-65ffc4f044aa3ee0", "level": "error", "message": {"text": "Dangling fetch: GET /api/me/export (src/app/mypage/data-export/page.tsx:48)"}, "properties": {"repobilityId": "3149cb07d219a70e", "scanner": "scanner-primary", "fingerprint": "65ffc4f044aa3ee0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-99a78bba3ed2d71f", "level": "error", "message": {"text": "Dangling fetch: GET /api/posts/${id}/vote (src/app/board/[id]/page.tsx:83)"}, "properties": {"repobilityId": "379e01b60326eb5f", "scanner": "scanner-primary", "fingerprint": "99a78bba3ed2d71f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3f6077ffa164ced4", "level": "error", "message": {"text": "Dangling fetch: POST /api/posts/${id}/vote (src/app/board/[id]/page.tsx:95)"}, "properties": {"repobilityId": "29a1b925f5ab13dc", "scanner": "scanner-primary", "fingerprint": "3f6077ffa164ced4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9f35919f3a0f21f1", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/link-guest-applicants (src/lib/guestLinker.ts:70)"}, "properties": {"repobilityId": "b15a0cd52ea8b1e0", "scanner": "scanner-primary", "fingerprint": "9f35919f3a0f21f1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-30990205b6237740", "level": "error", "message": {"text": "Dangling fetch: POST /api/push/register (src/lib/push.ts:103)"}, "properties": {"repobilityId": "006c70ca392d5777", "scanner": "scanner-primary", "fingerprint": "30990205b6237740", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f5560a9ca878bdb1", "level": "error", "message": {"text": "Dangling fetch: POST /api/push/unregister (src/lib/push.ts:129)"}, "properties": {"repobilityId": "a31b6821d7c76a5b", "scanner": "scanner-primary", "fingerprint": "f5560a9ca878bdb1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-384b29e5ab1bc5aa", "level": "error", "message": {"text": "Dangling fetch: GET https://api.crossref.org/works/${encodeURIComponent(doi)} (src/lib/crossref.ts:97)"}, "properties": {"repobilityId": "ce583eda8956e08b", "scanner": "scanner-primary", "fingerprint": "384b29e5ab1bc5aa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2b8287f060036f11", "level": "error", "message": {"text": "Dangling fetch: GET /api/diagnosis/peer-stats (src/lib/bkend.ts:2427)"}, "properties": {"repobilityId": "33625dffc1d06afb", "scanner": "scanner-primary", "fingerprint": "2b8287f060036f11", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8c9775618e46599f", "level": "error", "message": {"text": "Dangling fetch: GET /api/chatbot (src/lib/use-orchestra-chat.ts:71)"}, "properties": {"repobilityId": "b89e02a035602212", "scanner": "scanner-primary", "fingerprint": "8c9775618e46599f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e36a9b877efa915f", "level": "error", "message": {"text": "Dangling fetch: GET /api/sheets?url=${encodeURIComponent(csvUrl)} (src/features/seminar-admin/NametagGenerator.tsx:488)"}, "properties": {"repobilityId": "1fca6602c9ae0372", "scanner": "scanner-primary", "fingerprint": "e36a9b877efa915f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e74e65e5e0e5f3d3", "level": "error", "message": {"text": "Dangling fetch: GET /api/sheets?url=${encodeURIComponent(csvUrl)} (src/features/seminar-admin/ReportTab.tsx:539)"}, "properties": {"repobilityId": "7a666e1760032900", "scanner": "scanner-primary", "fingerprint": "e74e65e5e0e5f3d3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7b8cb8b83f2c56ee", "level": "error", "message": {"text": "Dangling fetch: POST /api/parse-excel (src/features/seminar-admin/RegistrationsTab.tsx:815)"}, "properties": {"repobilityId": "1e47c5d98bee3553", "scanner": "scanner-primary", "fingerprint": "7b8cb8b83f2c56ee", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bfaba02554c2a1d1", "level": "error", "message": {"text": "Dangling fetch: GET /api/sheets?url=${encodeURIComponent(getSheetCsvUrl(sheetId))} (src/features/seminar-admin/RegistrationsTab.tsx:865)"}, "properties": {"repobilityId": "cb4b512e60d5fe93", "scanner": "scanner-primary", "fingerprint": "bfaba02554c2a1d1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-aa9a2ac508bf0ffd", "level": "error", "message": {"text": "Dangling fetch: POST /api/seminars/${seminar.id}/speaker-token (src/features/seminar-admin/ReviewManagement.tsx:179)"}, "properties": {"repobilityId": "29d3802605c67fec", "scanner": "scanner-primary", "fingerprint": "aa9a2ac508bf0ffd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-52e6178f9b9cdeaa", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/poster (src/features/seminar-admin/PosterGenerator.tsx:53)"}, "properties": {"repobilityId": "53e6fcd8795b0693", "scanner": "scanner-primary", "fingerprint": "52e6178f9b9cdeaa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-026c9c4f41203149", "level": "error", "message": {"text": "Dangling fetch: POST /api/certificates/pdf (src/features/seminar-admin/CertificateGenerator.tsx:1490)"}, "properties": {"repobilityId": "6021e4cef006ca73", "scanner": "scanner-primary", "fingerprint": "026c9c4f41203149", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-389a514bac7aafb7", "level": "error", "message": {"text": "Dangling fetch: GET /api/auth/check-username?username=${encodeURIComponent(watchedUsername)} (src/features/auth/SignupForm.tsx:173)"}, "properties": {"repobilityId": "f732bbafe70ea367", "scanner": "scanner-primary", "fingerprint": "389a514bac7aafb7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a086b325ebc33136", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/auto-approve (src/features/auth/SignupForm.tsx:345)"}, "properties": {"repobilityId": "9eac09e1bff788ff", "scanner": "scanner-primary", "fingerprint": "a086b325ebc33136", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-55e48d04ab029503", "level": "error", "message": {"text": "Dangling fetch: GET /api/auth/resolve-email?username=${encodeURIComponent(username)} (src/features/auth/useAuth.ts:27)"}, "properties": {"repobilityId": "216e2c5d7ed86d05", "scanner": "scanner-primary", "fingerprint": "55e48d04ab029503", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ed54606c21a23cd4", "level": "error", "message": {"text": "Dangling fetch: GET /api/auth/guest-history-preview?${params} (src/features/auth/SignupMultiStep.tsx:69)"}, "properties": {"repobilityId": "5445f5511d79b230", "scanner": "scanner-primary", "fingerprint": "ed54606c21a23cd4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e74b36b10804cc32", "level": "error", "message": {"text": "Dangling fetch: GET /api/auth/check-username?username=${encodeURIComponent(watchedUsername)} (src/features/auth/signup-steps/Step1AccountInfo.tsx:76)"}, "properties": {"repobilityId": "152261b414fa91cb", "scanner": "scanner-primary", "fingerprint": "e74b36b10804cc32", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-462b9b7caefdcee1", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/auto-approve (src/features/auth/signup-steps/runSignupFlow.ts:187)"}, "properties": {"repobilityId": "6688cf4e06cf998a", "scanner": "scanner-primary", "fingerprint": "462b9b7caefdcee1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-06c73b40c7ff3688", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/conference-extract (src/features/conference/ConferenceProgramEditor.tsx:463)"}, "properties": {"repobilityId": "f1cfa610c77db312", "scanner": "scanner-primary", "fingerprint": "06c73b40c7ff3688", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-00466f2fdad1c28f", "level": "error", "message": {"text": "Dangling fetch: POST /api/cron/loyalty-snapshot (src/features/insights/LoyaltyTrendSection.tsx:79)"}, "properties": {"repobilityId": "39cf72f13dcb8602", "scanner": "scanner-primary", "fingerprint": "00466f2fdad1c28f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4674ae9f4e69cd7e", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/approval (src/features/admin/AdminUserList.tsx:20)"}, "properties": {"repobilityId": "e917bbbbecc60d3f", "scanner": "scanner-primary", "fingerprint": "4674ae9f4e69cd7e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a5d9e6690ad84534", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/newsletter (src/features/admin/AdminNewsletterTab.tsx:112)"}, "properties": {"repobilityId": "17fdacd691c42933", "scanner": "scanner-primary", "fingerprint": "a5d9e6690ad84534", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-daf39578f7faa9ef", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/inquiry-reply (src/features/admin/AdminInquiryTab.tsx:76)"}, "properties": {"repobilityId": "95baad698c1cd1d2", "scanner": "scanner-primary", "fingerprint": "daf39578f7faa9ef", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-43d7b46a8956393b", "level": "error", "message": {"text": "Dangling fetch: POST /api/seminars/${seminar.id}/speaker-token (src/features/seminar/SeminarLMS.tsx:132)"}, "properties": {"repobilityId": "5173b5fe11201101", "scanner": "scanner-primary", "fingerprint": "43d7b46a8956393b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-aa7838943bf41a1c", "level": "error", "message": {"text": "Dangling fetch: GET /api/reviews?seminarId=${seminar.id}&mode=list (src/features/seminar/SeminarReviews.tsx:73)"}, "properties": {"repobilityId": "18feb05ab00932fb", "scanner": "scanner-primary", "fingerprint": "aa7838943bf41a1c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-21c54831602e1254", "level": "error", "message": {"text": "Dangling fetch: GET /api/activities?type=${type} (src/features/activities/ActivityPage.tsx:128)"}, "properties": {"repobilityId": "1ff9d26d61733e49", "scanner": "scanner-primary", "fingerprint": "21c54831602e1254", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7e899d7f30c16dad", "level": "error", "message": {"text": "Dangling fetch: GET /api/activities/${activityId}/my-application (src/features/activities/ActivityDetail.tsx:274)"}, "properties": {"repobilityId": "d5cc9842751ee027", "scanner": "scanner-primary", "fingerprint": "7e899d7f30c16dad", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3bdcbb2d7ff26e16", "level": "error", "message": {"text": "Dangling fetch: POST /api/activities/${activityId}/apply (src/features/activities/ActivityDetail.tsx:394)"}, "properties": {"repobilityId": "6f94901429494bc3", "scanner": "scanner-primary", "fingerprint": "3bdcbb2d7ff26e16", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-391929f355315d16", "level": "error", "message": {"text": "Dangling fetch: POST /api/activities/${activityId}/apply (src/features/activities/ActivityDetail.tsx:423)"}, "properties": {"repobilityId": "07910c7ab02d7e91", "scanner": "scanner-primary", "fingerprint": "391929f355315d16", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0718fb15be49b459", "level": "error", "message": {"text": "Dangling fetch: POST /api/activities/${activityId}/application-lookup (src/features/activities/ActivityDetail.tsx:3384)"}, "properties": {"repobilityId": "bab6cf420e8d2884", "scanner": "scanner-primary", "fingerprint": "0718fb15be49b459", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f4cb6562f86cffe9", "level": "error", "message": {"text": "Dangling fetch: POST /api/comm/notify-answer (src/features/comm-board/AnswerThread.tsx:95)"}, "properties": {"repobilityId": "fecc764244be6e57", "scanner": "scanner-primary", "fingerprint": "f4cb6562f86cffe9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-134f988dc49b268b", "level": "error", "message": {"text": "Dangling fetch: POST /api/ai/yonsei-agent (src/features/yonsei-agents/useAgentJobs.ts:69)"}, "properties": {"repobilityId": "bbb561c932690ff3", "scanner": "scanner-primary", "fingerprint": "134f988dc49b268b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3140e61d7cac5091", "level": "note", "message": {"text": "Unused endpoint: GET /agents"}, "properties": {"repobilityId": "20241f34b5a050b1", "scanner": "scanner-primary", "fingerprint": "3140e61d7cac5091", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b30cbdd177c13681", "level": "note", "message": {"text": "Unused endpoint: GET /agents/{agent_id}"}, "properties": {"repobilityId": "986642e40e4889e2", "scanner": "scanner-primary", "fingerprint": "b30cbdd177c13681", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2f3fa31f1e9b1b90", "level": "note", "message": {"text": "Unused endpoint: POST /agents"}, "properties": {"repobilityId": "90b869725776405c", "scanner": "scanner-primary", "fingerprint": "2f3fa31f1e9b1b90", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5f76b22c5641fd05", "level": "note", "message": {"text": "Unused endpoint: PUT /agents/{agent_id}"}, "properties": {"repobilityId": "a8a8ea880129680d", "scanner": "scanner-primary", "fingerprint": "5f76b22c5641fd05", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c3b90085b95f0071", "level": "note", "message": {"text": "Unused endpoint: DELETE /agents/{agent_id}"}, "properties": {"repobilityId": "e572a91be6be0181", "scanner": "scanner-primary", "fingerprint": "c3b90085b95f0071", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd0e06afbaab19b3", "level": "note", "message": {"text": "Unused endpoint: GET /tasks"}, "properties": {"repobilityId": "6b4312b67d007202", "scanner": "scanner-primary", "fingerprint": "fd0e06afbaab19b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e30433c1fac6e869", "level": "note", "message": {"text": "Unused endpoint: GET /tasks/{task_id}"}, "properties": {"repobilityId": "29efa6b31afcfb82", "scanner": "scanner-primary", "fingerprint": "e30433c1fac6e869", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8b3eb3012ac06c04", "level": "note", "message": {"text": "Unused endpoint: POST /tasks"}, "properties": {"repobilityId": "76f772cac8c9f9dc", "scanner": "scanner-primary", "fingerprint": "8b3eb3012ac06c04", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-237e4c4c366a98dd", "level": "note", "message": {"text": "Unused endpoint: GET /tasks/{task_id}/stream"}, "properties": {"repobilityId": "a8aeca0b1fdb1b2a", "scanner": "scanner-primary", "fingerprint": "237e4c4c366a98dd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}