{"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-8db097986a05ed67", "name": "Possibly dead Python function: derived_madi", "shortDescription": {"text": "Possibly dead Python function: derived_madi"}, "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-4c2fcf25584683c0", "name": "Possibly dead Python function: derived_mudari", "shortDescription": {"text": "Possibly dead Python function: derived_mudari"}, "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-e085de3259c0b65f", "name": "Possibly dead Python function: madi_out", "shortDescription": {"text": "Possibly dead Python function: madi_out"}, "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-cf13138463c9f553", "name": "Possibly dead Python function: defective_mudari", "shortDescription": {"text": "Possibly dead Python function: defective_mudari"}, "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-230bef03e19e6c0d", "name": "Possibly dead Python function: fill_tense", "shortDescription": {"text": "Possibly dead Python function: fill_tense"}, "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-2473f4d243314b77", "name": "Possibly dead Python function: sort_ref", "shortDescription": {"text": "Possibly dead Python function: sort_ref"}, "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-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dad48678f55075a6", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-learning-units.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-learning-units.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-2d4a09c30d3d7219", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.tsx:126", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.tsx:126"}, "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-45903e2f3a9dd67d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/daily-arabic-words/page.tsx:35", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/daily-arabic-words/page.tsx:35"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c2838bbd98fcd6b9", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/verb-forms-meaning-change/page.tsx:233", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/verb-forms-meaning-change/page.tsx:233"}, "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-ad761689741e7507", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/murakkab/page.tsx:31", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/murakkab/page.tsx:31"}, "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-db5594e701979b91", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/verb-forms/page.tsx:154", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/verb-forms/page.tsx:154"}, "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-f610cc010d0736e7", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/arifa-vs-alima-vs-fahima/page.tsx:279", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/arifa-vs-alima-vs-fahima/page.tsx:279"}, "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-534060d4e6dbfe6e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/adad/page.tsx:31", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/adad/page.tsx:31"}, "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-0e12e13e8599974b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/mufrad-muthanna-jam/page.tsx:31", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/mufrad-muthanna-jam/page.tsx:31"}, "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-1559fce0d8540eba", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/classical-arabic-rebukes/page.tsx:200", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/classical-arabic-rebukes/page.tsx:200"}, "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-048cac9a5f92e24d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/beginner-arabic-islamic-books/page.tsx:157", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/beginner-arabic-islamic-books/page.tsx:157"}, "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-6516536652391eba", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/irab/page.tsx:38", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/irab/page.tsx:38"}, "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-68c15b03201c1f96", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/learn/page.tsx:89", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/learn/page.tsx:89"}, "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-8519720c91cb73a4", "name": "TODO/FIXME marker in shipping code \u2014 app/(main)/quiz/[sessionId]/page.tsx:181", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 app/(main)/quiz/[sessionId]/page.tsx:181"}, "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-4805f64a6ec5b174", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(main)/admin/page.tsx:270", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(main)/admin/page.tsx:270"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-04e1a6901e17504a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/roots/[rootId]/page.tsx:324", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/roots/[rootId]/page.tsx:324"}, "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-65c0f36497c18cff", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(main)/quran/QuranSurahList.tsx:200", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(main)/quran/QuranSurahList.tsx:200"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2a480189db7f2965", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/quran/[surahId]/page.tsx:209", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/quran/[surahId]/page.tsx:209"}, "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-19eb3bc6f46264a5", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(main)/profile/page.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(main)/profile/page.tsx:124"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e3048843b3a6d11f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/learn/LessonPlayer.tsx:257", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/learn/LessonPlayer.tsx:257"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5914c286311c2845", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/Sidebar.tsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/Sidebar.tsx:123"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ea8ca8cc67d872c1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/roots/ConjugationGrid.tsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/roots/ConjugationGrid.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-1efe924ee95934c4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/gamification/LeaderboardRow.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/gamification/LeaderboardRow.tsx:68"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ae134bd319863004", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/quran/TafsirPanel.tsx:215", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/quran/TafsirPanel.tsx:215"}, "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-242db83d7057ff09", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/quran/AudioPlayer.tsx:764", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/quran/AudioPlayer.tsx:764"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fee1f8231e08cc7f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/quran/PersistentMiniPlayer.tsx:139", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/quran/PersistentMiniPlayer.tsx:139"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d4133f9696872a0e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/quran/SurahReaderClient.tsx:587", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/quran/SurahReaderClient.tsx:587"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8e76cbd14c4f9b8c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/quran/audio/QariProfile.tsx:169", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/quran/audio/QariProfile.tsx:169"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c64ac4719c6c93de", "name": "Insecure pattern 'node_child_process' in scripts/watch-data.mjs:9", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/watch-data.mjs:9"}, "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-1ae7bab6aa7c7e01", "name": "Insecure pattern 'dangerous_innerhtml' in app/layout.tsx:126", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/layout.tsx:126"}, "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-7d0c2f221671d1b8", "name": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/daily-arabic-words/page.tsx:35", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/daily-arabic-words/page.tsx:35"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-16b9e7e25c106818", "name": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/verb-forms-meaning-change/page.tsx:233", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/verb-forms-meaning-change/page.tsx:233"}, "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-7b4662e9bfe3802e", "name": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/murakkab/page.tsx:31", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/murakkab/page.tsx:31"}, "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-79de404e56145ce1", "name": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/verb-forms/page.tsx:154", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/verb-forms/page.tsx:154"}, "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-f846079c8944ab36", "name": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/arifa-vs-alima-vs-fahima/page.tsx:279", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/arifa-vs-alima-vs-fahima/page.tsx:279"}, "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-e0b5bdabff3acf16", "name": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/adad/page.tsx:31", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/adad/page.tsx:31"}, "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-50ab781ecc69a84c", "name": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/mufrad-muthanna-jam/page.tsx:31", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/mufrad-muthanna-jam/page.tsx:31"}, "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-e65d3839f0127df2", "name": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/classical-arabic-rebukes/page.tsx:200", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/classical-arabic-rebukes/page.tsx:200"}, "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-1783091c7b07a540", "name": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/beginner-arabic-islamic-books/page.tsx:157", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/beginner-arabic-islamic-books/page.tsx:157"}, "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-17914915cde09704", "name": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/irab/page.tsx:38", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/irab/page.tsx:38"}, "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-5795ab4fe3ffe0a0", "name": "Insecure pattern 'dangerous_innerhtml' in app/(main)/learn/page.tsx:89", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/learn/page.tsx:89"}, "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-d902a766f27303cb", "name": "Insecure pattern 'dangerous_innerhtml' in app/(main)/roots/[rootId]/page.tsx:324", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/roots/[rootId]/page.tsx:324"}, "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-217343771af39920", "name": "Insecure pattern 'dangerous_innerhtml' in app/(main)/quran/[surahId]/page.tsx:209", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/quran/[surahId]/page.tsx:209"}, "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-8fee6cf269c2381d", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/quran/TafsirPanel.tsx:215", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/quran/TafsirPanel.tsx:215"}, "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-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4dfede71bc278574", "name": "Very large file: archive/tools/arabic_conjugation_generator_v2.py (1691 lines)", "shortDescription": {"text": "Very large file: archive/tools/arabic_conjugation_generator_v2.py (1691 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-6b6c936aa47a5905", "name": "Very large file: src/components/quran/AudioPlayer.tsx (1309 lines)", "shortDescription": {"text": "Very large file: src/components/quran/AudioPlayer.tsx (1309 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "1 test file(s) for 189 source file(s) (ratio 0.01). 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 222 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 19 placeholder/mock markers across 10 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-d24d970186a1d88c", "name": "Commented-code block (8 lines) in archive/tools/arabic_conjugation_generator.py:243", "shortDescription": {"text": "Commented-code block (8 lines) in archive/tools/arabic_conjugation_generator.py:243"}, "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-d89e28f4e5c39cfc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/populate-words.mjs:86", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/populate-words.mjs:86"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f98d2f9e41de507c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/populate-kanzul-iman.mjs:43", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/populate-kanzul-iman.mjs:43"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5cdda74901e00956", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/learn/complete/route.ts:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/learn/complete/route.ts:18"}, "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-c72ad638c7a87d0b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/learn/lesson/route.ts:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/learn/lesson/route.ts:16"}, "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-c73cf050f6efcb05", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/learn/path/route.ts:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/learn/path/route.ts:11"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d5ba423934800bc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/audio/timings/[surahNumber]/route.ts:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/audio/timings/[surahNumber]/route.ts:22"}, "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-123d2989d9c2cbdd", "name": "Legacy-named symbol `quranic_srs_v1` in src/utils/srs.ts:11", "shortDescription": {"text": "Legacy-named symbol `quranic_srs_v1` in src/utils/srs.ts:11"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e52051ceb1293455", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/quran/AudioPlayer.tsx:188", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/quran/AudioPlayer.tsx:188"}, "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}}]}}, "automationDetails": {"id": "repobility/21057"}, "properties": {"repository": "the-Indefatigable/Quranic-Roots-3d", "repoUrl": "https://github.com/the-Indefatigable/Quranic-Roots-3d", "branch": "main"}, "results": [{"ruleId": "scanner-8db097986a05ed67", "level": "note", "message": {"text": "Possibly dead Python function: derived_madi"}, "properties": {"repobilityId": "1ed709bcdce30f9f", "scanner": "scanner-primary", "fingerprint": "8db097986a05ed67", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "archive/tools/arabic_conjugation_generator.py:559"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4c2fcf25584683c0", "level": "note", "message": {"text": "Possibly dead Python function: derived_mudari"}, "properties": {"repobilityId": "c6f20c2747c9a2fa", "scanner": "scanner-primary", "fingerprint": "4c2fcf25584683c0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "archive/tools/arabic_conjugation_generator.py:570"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e085de3259c0b65f", "level": "note", "message": {"text": "Possibly dead Python function: madi_out"}, "properties": {"repobilityId": "1bd5d3781ffd7d6c", "scanner": "scanner-primary", "fingerprint": "e085de3259c0b65f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "archive/tools/arabic_conjugation_generator.py:600"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cf13138463c9f553", "level": "note", "message": {"text": "Possibly dead Python function: defective_mudari"}, "properties": {"repobilityId": "6b83adeef533c6bd", "scanner": "scanner-primary", "fingerprint": "cf13138463c9f553", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "archive/tools/arabic_conjugation_generator.py:663"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-230bef03e19e6c0d", "level": "note", "message": {"text": "Possibly dead Python function: fill_tense"}, "properties": {"repobilityId": "c6bbf56c71cd5557", "scanner": "scanner-primary", "fingerprint": "230bef03e19e6c0d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "archive/tools/arabic_conjugation_generator.py:1032"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2473f4d243314b77", "level": "note", "message": {"text": "Possibly dead Python function: sort_ref"}, "properties": {"repobilityId": "475df474bf6e8d25", "scanner": "scanner-primary", "fingerprint": "2473f4d243314b77", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/extract-nouns.py:144"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-dad48678f55075a6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-learning-units.ts:16"}, "properties": {"repobilityId": "ac3da7b27d604d9b", "scanner": "scanner-primary", "fingerprint": "dad48678f55075a6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2d4a09c30d3d7219", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.tsx:126"}, "properties": {"repobilityId": "6f16eb9b82a2dcd6", "scanner": "scanner-primary", "fingerprint": "2d4a09c30d3d7219", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-45903e2f3a9dd67d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/daily-arabic-words/page.tsx:35"}, "properties": {"repobilityId": "fffa640bd03efd65", "scanner": "scanner-primary", "fingerprint": "45903e2f3a9dd67d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c2838bbd98fcd6b9", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/verb-forms-meaning-change/page.tsx:233"}, "properties": {"repobilityId": "ddbfc379806e3395", "scanner": "scanner-primary", "fingerprint": "c2838bbd98fcd6b9", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ad761689741e7507", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/murakkab/page.tsx:31"}, "properties": {"repobilityId": "65ad02895004dd23", "scanner": "scanner-primary", "fingerprint": "ad761689741e7507", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-db5594e701979b91", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/verb-forms/page.tsx:154"}, "properties": {"repobilityId": "c7023a07d631c1f1", "scanner": "scanner-primary", "fingerprint": "db5594e701979b91", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f610cc010d0736e7", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/arifa-vs-alima-vs-fahima/page.tsx:279"}, "properties": {"repobilityId": "af3143f042978ab8", "scanner": "scanner-primary", "fingerprint": "f610cc010d0736e7", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-534060d4e6dbfe6e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/adad/page.tsx:31"}, "properties": {"repobilityId": "4ce9c7fc7f5894cc", "scanner": "scanner-primary", "fingerprint": "534060d4e6dbfe6e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0e12e13e8599974b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/mufrad-muthanna-jam/page.tsx:31"}, "properties": {"repobilityId": "5865098a5d539159", "scanner": "scanner-primary", "fingerprint": "0e12e13e8599974b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-1559fce0d8540eba", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/classical-arabic-rebukes/page.tsx:200"}, "properties": {"repobilityId": "fbf94f4d5f80c417", "scanner": "scanner-primary", "fingerprint": "1559fce0d8540eba", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-048cac9a5f92e24d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/beginner-arabic-islamic-books/page.tsx:157"}, "properties": {"repobilityId": "3f7878113b71a8ae", "scanner": "scanner-primary", "fingerprint": "048cac9a5f92e24d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6516536652391eba", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/blog/irab/page.tsx:38"}, "properties": {"repobilityId": "ee2e67e8949f0311", "scanner": "scanner-primary", "fingerprint": "6516536652391eba", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-68c15b03201c1f96", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/learn/page.tsx:89"}, "properties": {"repobilityId": "f9c0cc53cf03d7fb", "scanner": "scanner-primary", "fingerprint": "68c15b03201c1f96", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8519720c91cb73a4", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 app/(main)/quiz/[sessionId]/page.tsx:181"}, "properties": {"repobilityId": "07c2bdee3313fcfb", "scanner": "scanner-primary", "fingerprint": "8519720c91cb73a4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-4805f64a6ec5b174", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(main)/admin/page.tsx:270"}, "properties": {"repobilityId": "fd2af69f4807aec3", "scanner": "scanner-primary", "fingerprint": "4805f64a6ec5b174", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-04e1a6901e17504a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/roots/[rootId]/page.tsx:324"}, "properties": {"repobilityId": "220c4da4fc0c149b", "scanner": "scanner-primary", "fingerprint": "04e1a6901e17504a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-65c0f36497c18cff", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(main)/quran/QuranSurahList.tsx:200"}, "properties": {"repobilityId": "bd5092d2d8175cc1", "scanner": "scanner-primary", "fingerprint": "65c0f36497c18cff", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2a480189db7f2965", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/quran/[surahId]/page.tsx:209"}, "properties": {"repobilityId": "7b73596027e0e2e4", "scanner": "scanner-primary", "fingerprint": "2a480189db7f2965", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-19eb3bc6f46264a5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(main)/profile/page.tsx:124"}, "properties": {"repobilityId": "8669f1796d037676", "scanner": "scanner-primary", "fingerprint": "19eb3bc6f46264a5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e3048843b3a6d11f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/learn/LessonPlayer.tsx:257"}, "properties": {"repobilityId": "b440c3c20d101994", "scanner": "scanner-primary", "fingerprint": "e3048843b3a6d11f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5914c286311c2845", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/Sidebar.tsx:123"}, "properties": {"repobilityId": "803f00cbc2865099", "scanner": "scanner-primary", "fingerprint": "5914c286311c2845", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ea8ca8cc67d872c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/roots/ConjugationGrid.tsx:78"}, "properties": {"repobilityId": "bceadc556c835944", "scanner": "scanner-primary", "fingerprint": "ea8ca8cc67d872c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1efe924ee95934c4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/gamification/LeaderboardRow.tsx:68"}, "properties": {"repobilityId": "92455de35ffb728f", "scanner": "scanner-primary", "fingerprint": "1efe924ee95934c4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ae134bd319863004", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/quran/TafsirPanel.tsx:215"}, "properties": {"repobilityId": "ffacfac94512e2d1", "scanner": "scanner-primary", "fingerprint": "ae134bd319863004", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-242db83d7057ff09", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/quran/AudioPlayer.tsx:764"}, "properties": {"repobilityId": "d73957ffad3b1f39", "scanner": "scanner-primary", "fingerprint": "242db83d7057ff09", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fee1f8231e08cc7f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/quran/PersistentMiniPlayer.tsx:139"}, "properties": {"repobilityId": "bd2fefcb76af186b", "scanner": "scanner-primary", "fingerprint": "fee1f8231e08cc7f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4133f9696872a0e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/quran/SurahReaderClient.tsx:587"}, "properties": {"repobilityId": "14b31b54a4b2cd0f", "scanner": "scanner-primary", "fingerprint": "d4133f9696872a0e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8e76cbd14c4f9b8c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/quran/audio/QariProfile.tsx:169"}, "properties": {"repobilityId": "d3c45171843505d8", "scanner": "scanner-primary", "fingerprint": "8e76cbd14c4f9b8c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c64ac4719c6c93de", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/watch-data.mjs:9"}, "properties": {"repobilityId": "5bfdec006d5680e5", "scanner": "scanner-primary", "fingerprint": "c64ac4719c6c93de", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/watch-data.mjs"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-1ae7bab6aa7c7e01", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/layout.tsx:126"}, "properties": {"repobilityId": "69d4743587f721a0", "scanner": "scanner-primary", "fingerprint": "1ae7bab6aa7c7e01", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/layout.tsx"}, "region": {"startLine": 126}}}]}, {"ruleId": "scanner-7d0c2f221671d1b8", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/daily-arabic-words/page.tsx:35"}, "properties": {"repobilityId": "67de472d241e4718", "scanner": "scanner-primary", "fingerprint": "7d0c2f221671d1b8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/(main)/blog/daily-arabic-words/page.tsx"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-16b9e7e25c106818", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/verb-forms-meaning-change/page.tsx:233"}, "properties": {"repobilityId": "157cae97dfb92d42", "scanner": "scanner-primary", "fingerprint": "16b9e7e25c106818", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/(main)/blog/verb-forms-meaning-change/page.tsx"}, "region": {"startLine": 233}}}]}, {"ruleId": "scanner-7b4662e9bfe3802e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/murakkab/page.tsx:31"}, "properties": {"repobilityId": "57592b85b3a9bdd6", "scanner": "scanner-primary", "fingerprint": "7b4662e9bfe3802e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/(main)/blog/murakkab/page.tsx"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-79de404e56145ce1", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/verb-forms/page.tsx:154"}, "properties": {"repobilityId": "2fe0b516c5336961", "scanner": "scanner-primary", "fingerprint": "79de404e56145ce1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/(main)/blog/verb-forms/page.tsx"}, "region": {"startLine": 154}}}]}, {"ruleId": "scanner-f846079c8944ab36", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/arifa-vs-alima-vs-fahima/page.tsx:279"}, "properties": {"repobilityId": "3e31d556a8d1c5bc", "scanner": "scanner-primary", "fingerprint": "f846079c8944ab36", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/(main)/blog/arifa-vs-alima-vs-fahima/page.tsx"}, "region": {"startLine": 279}}}]}, {"ruleId": "scanner-e0b5bdabff3acf16", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/adad/page.tsx:31"}, "properties": {"repobilityId": "aca82541564c5fe9", "scanner": "scanner-primary", "fingerprint": "e0b5bdabff3acf16", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/(main)/blog/adad/page.tsx"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-50ab781ecc69a84c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/mufrad-muthanna-jam/page.tsx:31"}, "properties": {"repobilityId": "f4d1d07825786076", "scanner": "scanner-primary", "fingerprint": "50ab781ecc69a84c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/(main)/blog/mufrad-muthanna-jam/page.tsx"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-e65d3839f0127df2", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/classical-arabic-rebukes/page.tsx:200"}, "properties": {"repobilityId": "baae604e8d39cefe", "scanner": "scanner-primary", "fingerprint": "e65d3839f0127df2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/(main)/blog/classical-arabic-rebukes/page.tsx"}, "region": {"startLine": 200}}}]}, {"ruleId": "scanner-1783091c7b07a540", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/beginner-arabic-islamic-books/page.tsx:157"}, "properties": {"repobilityId": "229ac332a4dc6be8", "scanner": "scanner-primary", "fingerprint": "1783091c7b07a540", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/(main)/blog/beginner-arabic-islamic-books/page.tsx"}, "region": {"startLine": 157}}}]}, {"ruleId": "scanner-17914915cde09704", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/blog/irab/page.tsx:38"}, "properties": {"repobilityId": "396286b15bbebbbc", "scanner": "scanner-primary", "fingerprint": "17914915cde09704", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/(main)/blog/irab/page.tsx"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-5795ab4fe3ffe0a0", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/learn/page.tsx:89"}, "properties": {"repobilityId": "298b8c279c268453", "scanner": "scanner-primary", "fingerprint": "5795ab4fe3ffe0a0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/(main)/learn/page.tsx"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-d902a766f27303cb", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/roots/[rootId]/page.tsx:324"}, "properties": {"repobilityId": "a756898ff55a5a4b", "scanner": "scanner-primary", "fingerprint": "d902a766f27303cb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/(main)/roots/[rootId]/page.tsx"}, "region": {"startLine": 324}}}]}, {"ruleId": "scanner-217343771af39920", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/quran/[surahId]/page.tsx:209"}, "properties": {"repobilityId": "3a6381761ef0c25a", "scanner": "scanner-primary", "fingerprint": "217343771af39920", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/(main)/quran/[surahId]/page.tsx"}, "region": {"startLine": 209}}}]}, {"ruleId": "scanner-8fee6cf269c2381d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/quran/TafsirPanel.tsx:215"}, "properties": {"repobilityId": "4a6047f311e976a1", "scanner": "scanner-primary", "fingerprint": "8fee6cf269c2381d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/quran/TafsirPanel.tsx"}, "region": {"startLine": 215}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-4dfede71bc278574", "level": "note", "message": {"text": "Very large file: archive/tools/arabic_conjugation_generator_v2.py (1691 lines)"}, "properties": {"repobilityId": "18ffe31d5b918df2", "scanner": "scanner-primary", "fingerprint": "4dfede71bc278574", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6b6c936aa47a5905", "level": "note", "message": {"text": "Very large file: src/components/quran/AudioPlayer.tsx (1309 lines)"}, "properties": {"repobilityId": "6dfe6162b819b47c", "scanner": "scanner-primary", "fingerprint": "6b6c936aa47a5905", "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": "3bf7e21978aa0d6b", "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": "ff9c27e259555ef7", "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": "2a41d75072394ed4", "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": "5ad3c0fc64deb5de", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "3b65ff36b9397d69", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "692479120bae06f8", "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": "b9f64e544e03aef2", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-d24d970186a1d88c", "level": "none", "message": {"text": "Commented-code block (8 lines) in archive/tools/arabic_conjugation_generator.py:243"}, "properties": {"repobilityId": "b94d20c4ffb4fe7c", "scanner": "scanner-primary", "fingerprint": "d24d970186a1d88c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d89e28f4e5c39cfc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/populate-words.mjs:86"}, "properties": {"repobilityId": "e352cde34c3304fd", "scanner": "scanner-primary", "fingerprint": "d89e28f4e5c39cfc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f98d2f9e41de507c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/populate-kanzul-iman.mjs:43"}, "properties": {"repobilityId": "c6f09591775b63d9", "scanner": "scanner-primary", "fingerprint": "f98d2f9e41de507c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5cdda74901e00956", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/learn/complete/route.ts:18"}, "properties": {"repobilityId": "e7e7a64775b988da", "scanner": "scanner-primary", "fingerprint": "5cdda74901e00956", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c72ad638c7a87d0b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/learn/lesson/route.ts:16"}, "properties": {"repobilityId": "ea960f16132a0475", "scanner": "scanner-primary", "fingerprint": "c72ad638c7a87d0b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c73cf050f6efcb05", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/learn/path/route.ts:11"}, "properties": {"repobilityId": "ddd7e11f640d18df", "scanner": "scanner-primary", "fingerprint": "c73cf050f6efcb05", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2d5ba423934800bc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/audio/timings/[surahNumber]/route.ts:22"}, "properties": {"repobilityId": "207c8505cca979b5", "scanner": "scanner-primary", "fingerprint": "2d5ba423934800bc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-123d2989d9c2cbdd", "level": "note", "message": {"text": "Legacy-named symbol `quranic_srs_v1` in src/utils/srs.ts:11"}, "properties": {"repobilityId": "9e384f4e5227792c", "scanner": "scanner-primary", "fingerprint": "123d2989d9c2cbdd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e52051ceb1293455", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/quran/AudioPlayer.tsx:188"}, "properties": {"repobilityId": "d81d4f7f517ece4e", "scanner": "scanner-primary", "fingerprint": "e52051ceb1293455", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}]}]}