{"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-c56094369f7ee5b8", "name": "Stray `console.log` in TS/JS \u2014 _archive/Back-End/server.js:169", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 _archive/Back-End/server.js:169"}, "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-bb018c9e716297fa", "name": "Stray `console.log` in TS/JS \u2014 _archive/Back-End/db/migrate.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 _archive/Back-End/db/migrate.js:13"}, "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-7746b123f7a7bb3b", "name": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/components/Navbar.jsx:220", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/components/Navbar.jsx: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-5710907fe20ea823", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 _archive/Front-End/src/pages/CertificationHCM.jsx:176", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 _archive/Front-End/src/pages/CertificationHCM.jsx:176"}, "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-284def6f9b0a251a", "name": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/pages/ExamSimulatorHCM.jsx:152", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/pages/ExamSimulatorHCM.jsx: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-7ba3ded689937a66", "name": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/pages/ExamSimulatorPP.jsx:152", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/pages/ExamSimulatorPP.jsx: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-3aca9c58d3f156e0", "name": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/pages/ExamSimulatorSD.jsx:147", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/pages/ExamSimulatorSD.jsx: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-33d9f5758968a3b7", "name": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/pages/ExamSimulator.jsx:168", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/pages/ExamSimulator.jsx: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-a27358730f60e9aa", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 _archive/Front-End/src/pages/CertificationPP.jsx:176", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 _archive/Front-End/src/pages/CertificationPP.jsx:176"}, "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-a733780ab31a1c48", "name": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/pages/ExamSimulatorMM.jsx:150", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/pages/ExamSimulatorMM.jsx: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-94e2587aa9ac684b", "name": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/pages/ExamSimulatorCO.jsx:150", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/pages/ExamSimulatorCO.jsx: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-9526d04db1f95abf", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 hanaflow-next/src/components/ThemeScript.tsx:15", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 hanaflow-next/src/components/ThemeScript.tsx:15"}, "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-f3cbe7f473158de3", "name": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/ExamSimulatorTemplate.tsx:155", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/ExamSimulatorTemplate.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-86cbdf1817402c0f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 hanaflow-next/src/components/JsonLd.tsx:30", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 hanaflow-next/src/components/JsonLd.tsx:30"}, "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-34ba20a1acbab903", "name": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/ImpersonationBanner.tsx:24", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/ImpersonationBanner.tsx:24"}, "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-93b0b4501bd828e2", "name": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/TestimonialsSection.tsx:104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/TestimonialsSection.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-39991db673842b78", "name": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/TutorChat.tsx:210", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/TutorChat.tsx:210"}, "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-56f9fcab5bd152a0", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 hanaflow-next/src/components/TutorChat.tsx:18", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 hanaflow-next/src/components/TutorChat.tsx:18"}, "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-27e63dd93f411d11", "name": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/SiteBanner.tsx:56", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/SiteBanner.tsx:56"}, "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-374393151143c938", "name": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/EmailVerificationBanner.tsx:50", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/EmailVerificationBanner.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-cf5676ea88115386", "name": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/Navbar.tsx:239", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/Navbar.tsx:239"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2e5125dffd2d8840", "name": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/app/admin/page.tsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/app/admin/page.tsx:177"}, "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-1aa7fa86c2d276c5", "name": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/app/admin/layout.tsx:89", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/app/admin/layout.tsx:89"}, "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-c03cca29f3fbab62", "name": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/app/admin/users/[id]/page.tsx:376", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/app/admin/users/[id]/page.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-889261c793cab762", "name": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/app/admin/promo-codes/page.tsx:217", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/app/admin/promo-codes/page.tsx:217"}, "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-4b0e051b09b81875", "name": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/app/entretien/page.tsx:513", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/app/entretien/page.tsx:513"}, "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-f9bb2921f2426dd6", "name": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/app/stats/page.tsx:283", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/app/stats/page.tsx:283"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-638a150cc6b70fa8", "name": "Stray `console.log` in TS/JS \u2014 hanaflow-next/src/lib/email.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 hanaflow-next/src/lib/email.ts:22"}, "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-f38daacbbda5f934", "name": "Stray `console.log` in TS/JS \u2014 hanaflow-next/src/lib/totpCrypto.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 hanaflow-next/src/lib/totpCrypto.ts:22"}, "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-c64f54e3ba650734", "name": "Possible secret in _archive/Back-End/server.js", "shortDescription": {"text": "Possible secret in _archive/Back-End/server.js"}, "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-69b8fefec0cbf822", "name": "Insecure pattern 'dangerous_innerhtml' in _archive/Front-End/src/pages/CertificationHCM.jsx:176", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in _archive/Front-End/src/pages/CertificationHCM.jsx:176"}, "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-0ed89ae450422b71", "name": "Insecure pattern 'dangerous_innerhtml' in _archive/Front-End/src/pages/CertificationPP.jsx:176", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in _archive/Front-End/src/pages/CertificationPP.jsx:176"}, "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-c3836bdaaba02151", "name": "Insecure pattern 'local_storage_auth_token' in _archive/Front-End/src/context/AuthContext.jsx:43", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in _archive/Front-End/src/context/AuthContext.jsx:43"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1c9c773e3a50a011", "name": "Insecure pattern 'node_child_process' in hanaflow-next/package.json:19", "shortDescription": {"text": "Insecure pattern 'node_child_process' in hanaflow-next/package.json:19"}, "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-edb18fff3f7bb6c5", "name": "Insecure pattern 'dangerous_innerhtml' in hanaflow-next/src/components/ThemeScript.tsx:15", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in hanaflow-next/src/components/ThemeScript.tsx:15"}, "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-906f7871ce21224c", "name": "Insecure pattern 'dangerous_innerhtml' in hanaflow-next/src/components/JsonLd.tsx:30", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in hanaflow-next/src/components/JsonLd.tsx:30"}, "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-0dba90fd39a8104e", "name": "Possible secret in hanaflow-next/e2e/password-reset.spec.ts", "shortDescription": {"text": "Possible secret in hanaflow-next/e2e/password-reset.spec.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-adada9a9ef10f6c8", "name": "Possible secret in hanaflow-next/e2e/helpers/user.ts", "shortDescription": {"text": "Possible secret in hanaflow-next/e2e/helpers/user.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-d8b09a67cd6fa419", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@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-547965630a424c69", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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/cache@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-bd33fbed1a313e0e", "name": "Install-time lifecycle script performs network/shell-sensitive actions", "shortDescription": {"text": "Install-time lifecycle script performs network/shell-sensitive actions"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "16 test file(s) for 281 source file(s) (ratio 0.06). 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 16 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 83 placeholder/mock markers across 27 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-04c64ff4d890dd86", "name": "Commented-code block (5 lines) in _archive/Back-End/server.js:68", "shortDescription": {"text": "Commented-code block (5 lines) in _archive/Back-End/server.js:68"}, "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-d2e9297a42a3f0f8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 _archive/Front-End/src/context/AuthContext.jsx:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 _archive/Front-End/src/context/AuthContext.jsx: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-8680bd82a8d3e97f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 _archive/Front-End/src/context/SubscriptionContext.jsx:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 _archive/Front-End/src/context/SubscriptionContext.jsx:17"}, "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-a26dc2e7a6f6d69c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/components/FeedbackWidget.tsx:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/components/FeedbackWidget.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-7bf18588ad4ec78c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/components/CertificateDownloadButton.tsx:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/components/CertificateDownloadButton.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-9820a5c3e082323f", "name": "Commented-code block (5 lines) in hanaflow-next/src/app/api/certificates/issue/route.ts:65", "shortDescription": {"text": "Commented-code block (5 lines) in hanaflow-next/src/app/api/certificates/issue/route.ts:65"}, "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-72b5c1a4d86fead3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/app/admin/settings/page.tsx:107", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/app/admin/settings/page.tsx:107"}, "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-64888730d4465d16", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/app/admin/promo-codes/page.tsx:62", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/app/admin/promo-codes/page.tsx:62"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c76c24973a7c1199", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/app/admin/testimonials/page.tsx:103", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/app/admin/testimonials/page.tsx:103"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ae5a0cea3c1450f3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/app/admin/feedback/page.tsx:62", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/app/admin/feedback/page.tsx:62"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1e0962ef9f4fe70a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/app/cv-builder/page.tsx:184", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/app/cv-builder/page.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-caed1d7241d6af25", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/app/verify-email/page.tsx:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/app/verify-email/page.tsx: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-3b194abb1fe2a123", "name": "Commented-code block (5 lines) in hanaflow-next/src/lib/apiHelpers.ts:182", "shortDescription": {"text": "Commented-code block (5 lines) in hanaflow-next/src/lib/apiHelpers.ts:182"}, "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-a5c6261330285a8c", "name": "Commented-code block (8 lines) in hanaflow-next/src/lib/certAccess.ts:37", "shortDescription": {"text": "Commented-code block (8 lines) in hanaflow-next/src/lib/certAccess.ts:37"}, "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-13184218893a802a", "name": "Legacy-named symbol `hf_admin_backup` in hanaflow-next/src/context/AuthContext.tsx:71", "shortDescription": {"text": "Legacy-named symbol `hf_admin_backup` in hanaflow-next/src/context/AuthContext.tsx:71"}, "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-4365d257eb98766f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/context/AuthContext.tsx:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/context/AuthContext.tsx:25"}, "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-253d27c33b0bbf89", "name": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/context/GamificationContext.tsx:109", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/context/GamificationContext.tsx:109"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-87acb4066071a15a", "name": "19 env vars used in code but missing from .env.example", "shortDescription": {"text": "19 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ADMIN_EMAILS`, `ALLOWED_ORIGINS`, `CI`, `E2E_BASE_URL`, `GEMINI_API_KEY`, `GEMINI_MODEL`, `GROQ_API_KEY`, `GROQ_MODEL` + 11 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-ccd08766cbb3e0d1", "name": "Dangling fetch: POST /api/feedback (hanaflow-next/src/components/FeedbackWidget.tsx:45)", "shortDescription": {"text": "Dangling fetch: POST /api/feedback (hanaflow-next/src/components/FeedbackWidget.tsx:45)"}, "fullDescription": {"text": "`hanaflow-next/src/components/FeedbackWidget.tsx:45` calls `POST /api/feedback` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/feedback`\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-26f7126592160ab9", "name": "Dangling fetch: GET /api/auth/2fa/backup-codes (hanaflow-next/src/components/TwoFactorSection.tsx:24)", "shortDescription": {"text": "Dangling fetch: GET /api/auth/2fa/backup-codes (hanaflow-next/src/components/TwoFactorSection.tsx:24)"}, "fullDescription": {"text": "`hanaflow-next/src/components/TwoFactorSection.tsx:24` calls `GET /api/auth/2fa/backup-codes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/2fa/backup-codes`\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-a49137a5d4ea3718", "name": "Dangling fetch: POST /api/auth/2fa/enroll (hanaflow-next/src/components/TwoFactorSection.tsx:53)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/2fa/enroll (hanaflow-next/src/components/TwoFactorSection.tsx:53)"}, "fullDescription": {"text": "`hanaflow-next/src/components/TwoFactorSection.tsx:53` calls `POST /api/auth/2fa/enroll` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/2fa/enroll`\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-4315612544905bd4", "name": "Dangling fetch: POST /api/auth/2fa/verify-enroll (hanaflow-next/src/components/TwoFactorSection.tsx:74)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/2fa/verify-enroll (hanaflow-next/src/components/TwoFactorSection.tsx:74)"}, "fullDescription": {"text": "`hanaflow-next/src/components/TwoFactorSection.tsx:74` calls `POST /api/auth/2fa/verify-enroll` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/2fa/verify-enroll`\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-35289306d51d4b5a", "name": "Dangling fetch: POST /api/auth/2fa/disable (hanaflow-next/src/components/TwoFactorSection.tsx:99)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/2fa/disable (hanaflow-next/src/components/TwoFactorSection.tsx:99)"}, "fullDescription": {"text": "`hanaflow-next/src/components/TwoFactorSection.tsx:99` calls `POST /api/auth/2fa/disable` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/2fa/disable`\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-4e26b210ac17f1e5", "name": "Dangling fetch: POST /api/auth/2fa/backup-codes (hanaflow-next/src/components/TwoFactorSection.tsx:121)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/2fa/backup-codes (hanaflow-next/src/components/TwoFactorSection.tsx:121)"}, "fullDescription": {"text": "`hanaflow-next/src/components/TwoFactorSection.tsx:121` calls `POST /api/auth/2fa/backup-codes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/2fa/backup-codes`\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-4ca75d1044d047c5", "name": "Dangling fetch: POST /api/certificates/issue (hanaflow-next/src/components/CertificateDownloadButton.tsx:45)", "shortDescription": {"text": "Dangling fetch: POST /api/certificates/issue (hanaflow-next/src/components/CertificateDownloadButton.tsx:45)"}, "fullDescription": {"text": "`hanaflow-next/src/components/CertificateDownloadButton.tsx:45` calls `POST /api/certificates/issue` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/certificates/issue`\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-01edee96bf66b805", "name": "Dangling fetch: GET /api/testimonials (hanaflow-next/src/components/TestimonialsSection.tsx:34)", "shortDescription": {"text": "Dangling fetch: GET /api/testimonials (hanaflow-next/src/components/TestimonialsSection.tsx:34)"}, "fullDescription": {"text": "`hanaflow-next/src/components/TestimonialsSection.tsx:34` calls `GET /api/testimonials` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/testimonials`\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-82c7b63e5e3f34b2", "name": "Dangling fetch: POST /api/tutor/chat (hanaflow-next/src/components/TutorChat.tsx:137)", "shortDescription": {"text": "Dangling fetch: POST /api/tutor/chat (hanaflow-next/src/components/TutorChat.tsx:137)"}, "fullDescription": {"text": "`hanaflow-next/src/components/TutorChat.tsx:137` calls `POST /api/tutor/chat` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tutor/chat`\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-804a09f4d69ef926", "name": "Dangling fetch: GET /api/nps/should-show (hanaflow-next/src/components/NPSPrompt.tsx:57)", "shortDescription": {"text": "Dangling fetch: GET /api/nps/should-show (hanaflow-next/src/components/NPSPrompt.tsx:57)"}, "fullDescription": {"text": "`hanaflow-next/src/components/NPSPrompt.tsx:57` calls `GET /api/nps/should-show` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/nps/should-show`\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-b12360c22733c974", "name": "Dangling fetch: POST /api/nps (hanaflow-next/src/components/NPSPrompt.tsx:97)", "shortDescription": {"text": "Dangling fetch: POST /api/nps (hanaflow-next/src/components/NPSPrompt.tsx:97)"}, "fullDescription": {"text": "`hanaflow-next/src/components/NPSPrompt.tsx:97` calls `POST /api/nps` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/nps`\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-d40ea0325f43497b", "name": "Dangling fetch: POST /api/auth/resend-verification (hanaflow-next/src/components/EmailVerificationBanner.tsx:29)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/resend-verification (hanaflow-next/src/components/EmailVerificationBanner.tsx:29)"}, "fullDescription": {"text": "`hanaflow-next/src/components/EmailVerificationBanner.tsx:29` calls `POST /api/auth/resend-verification` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/resend-verification`\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-4e50f786b848a7c1", "name": "Dangling fetch: GET /api/quiz/attempts?limit=8 (hanaflow-next/src/components/QuizHistorySection.tsx:46)", "shortDescription": {"text": "Dangling fetch: GET /api/quiz/attempts?limit=8 (hanaflow-next/src/components/QuizHistorySection.tsx:46)"}, "fullDescription": {"text": "`hanaflow-next/src/components/QuizHistorySection.tsx:46` calls `GET /api/quiz/attempts?limit=8` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/quiz/attempts`\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-923c831a1bdd1cb1", "name": "Dangling fetch: POST /api/feedback (hanaflow-next/src/app/ecoles/DemoRequestForm.tsx:22)", "shortDescription": {"text": "Dangling fetch: POST /api/feedback (hanaflow-next/src/app/ecoles/DemoRequestForm.tsx:22)"}, "fullDescription": {"text": "`hanaflow-next/src/app/ecoles/DemoRequestForm.tsx:22` calls `POST /api/feedback` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/feedback`\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-c35eeb356bdd47f4", "name": "Dangling fetch: POST /api/auth/reset-password (hanaflow-next/src/app/reset-password/page.tsx:25)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/reset-password (hanaflow-next/src/app/reset-password/page.tsx:25)"}, "fullDescription": {"text": "`hanaflow-next/src/app/reset-password/page.tsx:25` calls `POST /api/auth/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: `/auth/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-325eda19d0a2164d", "name": "Dangling fetch: POST /api/feedback (hanaflow-next/src/app/contact/page.tsx:34)", "shortDescription": {"text": "Dangling fetch: POST /api/feedback (hanaflow-next/src/app/contact/page.tsx:34)"}, "fullDescription": {"text": "`hanaflow-next/src/app/contact/page.tsx:34` calls `POST /api/feedback` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/feedback`\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-f97e16744b426bcc", "name": "Dangling fetch: POST /api/auth/forgot-password (hanaflow-next/src/app/forgot-password/page.tsx:17)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/forgot-password (hanaflow-next/src/app/forgot-password/page.tsx:17)"}, "fullDescription": {"text": "`hanaflow-next/src/app/forgot-password/page.tsx:17` calls `POST /api/auth/forgot-password` 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`\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-b609308bab42e052", "name": "Dangling fetch: GET /api/admin/analytics (hanaflow-next/src/app/admin/page.tsx:94)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/analytics (hanaflow-next/src/app/admin/page.tsx:94)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/page.tsx:94` calls `GET /api/admin/analytics` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/analytics`\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-c83bdde3936aba43", "name": "Dangling fetch: GET /api/admin/settings (hanaflow-next/src/app/admin/settings/page.tsx:65)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/settings (hanaflow-next/src/app/admin/settings/page.tsx:65)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/settings/page.tsx:65` calls `GET /api/admin/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/settings`\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-06c4c2d9204d7298", "name": "Dangling fetch: PATCH /api/admin/settings (hanaflow-next/src/app/admin/settings/page.tsx:107)", "shortDescription": {"text": "Dangling fetch: PATCH /api/admin/settings (hanaflow-next/src/app/admin/settings/page.tsx:107)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/settings/page.tsx:107` calls `PATCH /api/admin/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/settings`\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-5340b1a136cc7b36", "name": "Dangling fetch: GET /api/admin/users?${params} (hanaflow-next/src/app/admin/users/page.tsx:54)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/users?${params} (hanaflow-next/src/app/admin/users/page.tsx:54)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/users/page.tsx:54` calls `GET /api/admin/users?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/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-2e8b0570a2117690", "name": "Dangling fetch: PATCH /api/admin/users/${id} (hanaflow-next/src/app/admin/users/page.tsx:76)", "shortDescription": {"text": "Dangling fetch: PATCH /api/admin/users/${id} (hanaflow-next/src/app/admin/users/page.tsx:76)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/users/page.tsx:76` calls `PATCH /api/admin/users/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/users/<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-8edfab36e0ff6ae4", "name": "Dangling fetch: DELETE /api/admin/users/${id} (hanaflow-next/src/app/admin/users/page.tsx:101)", "shortDescription": {"text": "Dangling fetch: DELETE /api/admin/users/${id} (hanaflow-next/src/app/admin/users/page.tsx:101)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/users/page.tsx:101` calls `DELETE /api/admin/users/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/users/<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-9614032d687e2afb", "name": "Dangling fetch: POST /api/admin/users/bulk (hanaflow-next/src/app/admin/users/page.tsx:144)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/users/bulk (hanaflow-next/src/app/admin/users/page.tsx:144)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/users/page.tsx:144` calls `POST /api/admin/users/bulk` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/users/bulk`\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-643f585cc309caac", "name": "Dangling fetch: GET /api/admin/users/export (hanaflow-next/src/app/admin/users/page.tsx:166)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/users/export (hanaflow-next/src/app/admin/users/page.tsx:166)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/users/page.tsx:166` calls `GET /api/admin/users/export` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/users/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-f6d43bec0399317c", "name": "Dangling fetch: GET /api/admin/users/${id} (hanaflow-next/src/app/admin/users/[id]/page.tsx:47)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/users/${id} (hanaflow-next/src/app/admin/users/[id]/page.tsx:47)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/users/[id]/page.tsx:47` calls `GET /api/admin/users/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/users/<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-bc233a09859e68f9", "name": "Dangling fetch: PATCH /api/admin/users/${data.id} (hanaflow-next/src/app/admin/users/[id]/page.tsx:68)", "shortDescription": {"text": "Dangling fetch: PATCH /api/admin/users/${data.id} (hanaflow-next/src/app/admin/users/[id]/page.tsx:68)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/users/[id]/page.tsx:68` calls `PATCH /api/admin/users/${data.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/users/<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-4bbf6680a39874a1", "name": "Dangling fetch: POST /api/admin/users/${data.id}/impersonate (hanaflow-next/src/app/admin/users/[id]/page.tsx:104)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/users/${data.id}/impersonate (hanaflow-next/src/app/admin/users/[id]/page.tsx:104)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/users/[id]/page.tsx:104` calls `POST /api/admin/users/${data.id}/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/users/<p>/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-05edddb917bdc84b", "name": "Dangling fetch: POST /api/admin/users/${data.id}/revoke-sessions (hanaflow-next/src/app/admin/users/[id]/page.tsx:132)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/users/${data.id}/revoke-sessions (hanaflow-next/src/app/admin/users/[id]/page.tsx:132)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/users/[id]/page.tsx:132` calls `POST /api/admin/users/${data.id}/revoke-sessions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/users/<p>/revoke-sessions`\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-36c35cc4bae6ba6b", "name": "Dangling fetch: DELETE /api/admin/users/${data.id} (hanaflow-next/src/app/admin/users/[id]/page.tsx:153)", "shortDescription": {"text": "Dangling fetch: DELETE /api/admin/users/${data.id} (hanaflow-next/src/app/admin/users/[id]/page.tsx:153)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/users/[id]/page.tsx:153` calls `DELETE /api/admin/users/${data.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/users/<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-32e4a8c99d547e85", "name": "Dangling fetch: GET /api/admin/audit-log?${params} (hanaflow-next/src/app/admin/audit-log/page.tsx:54)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/audit-log?${params} (hanaflow-next/src/app/admin/audit-log/page.tsx:54)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/audit-log/page.tsx:54` calls `GET /api/admin/audit-log?${params}` 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-log`\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-f8eea6921c72a8b7", "name": "Dangling fetch: GET /api/admin/promo-codes (hanaflow-next/src/app/admin/promo-codes/page.tsx:36)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/promo-codes (hanaflow-next/src/app/admin/promo-codes/page.tsx:36)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/promo-codes/page.tsx:36` calls `GET /api/admin/promo-codes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/promo-codes`\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-742f4de10449e78c", "name": "Dangling fetch: POST /api/admin/promo-codes (hanaflow-next/src/app/admin/promo-codes/page.tsx:62)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/promo-codes (hanaflow-next/src/app/admin/promo-codes/page.tsx:62)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/promo-codes/page.tsx:62` calls `POST /api/admin/promo-codes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/promo-codes`\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-19382db4606365e9", "name": "Dangling fetch: PATCH /api/admin/promo-codes/${id} (hanaflow-next/src/app/admin/promo-codes/page.tsx:82)", "shortDescription": {"text": "Dangling fetch: PATCH /api/admin/promo-codes/${id} (hanaflow-next/src/app/admin/promo-codes/page.tsx:82)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/promo-codes/page.tsx:82` calls `PATCH /api/admin/promo-codes/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/promo-codes/<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-b5574503e6b7ff3a", "name": "Dangling fetch: DELETE /api/admin/promo-codes/${id} (hanaflow-next/src/app/admin/promo-codes/page.tsx:103)", "shortDescription": {"text": "Dangling fetch: DELETE /api/admin/promo-codes/${id} (hanaflow-next/src/app/admin/promo-codes/page.tsx:103)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/promo-codes/page.tsx:103` calls `DELETE /api/admin/promo-codes/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/promo-codes/<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-fa3bbac10e09e0d6", "name": "Dangling fetch: GET /api/admin/testimonials (hanaflow-next/src/app/admin/testimonials/page.tsx:47)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/testimonials (hanaflow-next/src/app/admin/testimonials/page.tsx:47)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/testimonials/page.tsx:47` calls `GET /api/admin/testimonials` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/testimonials`\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-8dc05d45bc8fbb58", "name": "Dangling fetch: DELETE /api/admin/testimonials/${id} (hanaflow-next/src/app/admin/testimonials/page.tsx:124)", "shortDescription": {"text": "Dangling fetch: DELETE /api/admin/testimonials/${id} (hanaflow-next/src/app/admin/testimonials/page.tsx:124)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/testimonials/page.tsx:124` calls `DELETE /api/admin/testimonials/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/testimonials/<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-f96f3d42ea47a4e4", "name": "Dangling fetch: PATCH /api/admin/testimonials/${t.id} (hanaflow-next/src/app/admin/testimonials/page.tsx:134)", "shortDescription": {"text": "Dangling fetch: PATCH /api/admin/testimonials/${t.id} (hanaflow-next/src/app/admin/testimonials/page.tsx:134)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/testimonials/page.tsx:134` calls `PATCH /api/admin/testimonials/${t.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/testimonials/<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-dff7448169b04dc6", "name": "Dangling fetch: GET /api/admin/nps (hanaflow-next/src/app/admin/nps/page.tsx:32)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/nps (hanaflow-next/src/app/admin/nps/page.tsx:32)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/nps/page.tsx:32` calls `GET /api/admin/nps` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/nps`\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-3c0ecb0da6496e2f", "name": "Dangling fetch: GET /api/admin/feedback?status=${filter}&page=${page} (hanaflow-next/src/app/admin/feedback/page.tsx:45)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/feedback?status=${filter}&page=${page} (hanaflow-next/src/app/admin/feedback/page.tsx:45)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/feedback/page.tsx:45` calls `GET /api/admin/feedback?status=${filter}&page=${page}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/feedback`\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-1836e87601bc6c79", "name": "Dangling fetch: PATCH /api/admin/feedback/${id} (hanaflow-next/src/app/admin/feedback/page.tsx:62)", "shortDescription": {"text": "Dangling fetch: PATCH /api/admin/feedback/${id} (hanaflow-next/src/app/admin/feedback/page.tsx:62)"}, "fullDescription": {"text": "`hanaflow-next/src/app/admin/feedback/page.tsx:62` calls `PATCH /api/admin/feedback/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/feedback/<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-69fc63e43074421b", "name": "Dangling fetch: POST /api/cv/optimize (hanaflow-next/src/app/cv-builder/page.tsx:184)", "shortDescription": {"text": "Dangling fetch: POST /api/cv/optimize (hanaflow-next/src/app/cv-builder/page.tsx:184)"}, "fullDescription": {"text": "`hanaflow-next/src/app/cv-builder/page.tsx:184` calls `POST /api/cv/optimize` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cv/optimize`\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-be6a5048a98cdf27", "name": "Dangling fetch: POST /api/auth/verify-email (hanaflow-next/src/app/verify-email/page.tsx:18)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/verify-email (hanaflow-next/src/app/verify-email/page.tsx:18)"}, "fullDescription": {"text": "`hanaflow-next/src/app/verify-email/page.tsx:18` calls `POST /api/auth/verify-email` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/verify-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-d49bf370aab229a0", "name": "Dangling fetch: POST /api/promo/redeem (hanaflow-next/src/app/profil/page.tsx:82)", "shortDescription": {"text": "Dangling fetch: POST /api/promo/redeem (hanaflow-next/src/app/profil/page.tsx:82)"}, "fullDescription": {"text": "`hanaflow-next/src/app/profil/page.tsx:82` calls `POST /api/promo/redeem` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/promo/redeem`\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-bda357300486a0c5", "name": "Dangling fetch: POST /api/interview/start (hanaflow-next/src/app/entretien/page.tsx:120)", "shortDescription": {"text": "Dangling fetch: POST /api/interview/start (hanaflow-next/src/app/entretien/page.tsx:120)"}, "fullDescription": {"text": "`hanaflow-next/src/app/entretien/page.tsx:120` calls `POST /api/interview/start` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/interview/start`\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-bc33a23b2b8a7352", "name": "Dangling fetch: POST /api/interview/grade (hanaflow-next/src/app/entretien/page.tsx:153)", "shortDescription": {"text": "Dangling fetch: POST /api/interview/grade (hanaflow-next/src/app/entretien/page.tsx:153)"}, "fullDescription": {"text": "`hanaflow-next/src/app/entretien/page.tsx:153` calls `POST /api/interview/grade` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/interview/grade`\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-600a7d2e11325e1b", "name": "Dangling fetch: GET /api/certificates (hanaflow-next/src/app/stats/page.tsx:72)", "shortDescription": {"text": "Dangling fetch: GET /api/certificates (hanaflow-next/src/app/stats/page.tsx:72)"}, "fullDescription": {"text": "`hanaflow-next/src/app/stats/page.tsx:72` calls `GET /api/certificates` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/certificates`\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-4c6026fa6dd2faa6", "name": "Dangling fetch: POST /api/roadmap/generate (hanaflow-next/src/app/roadmap/page.tsx:84)", "shortDescription": {"text": "Dangling fetch: POST /api/roadmap/generate (hanaflow-next/src/app/roadmap/page.tsx:84)"}, "fullDescription": {"text": "`hanaflow-next/src/app/roadmap/page.tsx:84` calls `POST /api/roadmap/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/roadmap/generate`\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-fdcc1d607c97b2e5", "name": "Dangling fetch: GET /api/certificates (hanaflow-next/src/app/certificats/page.tsx:48)", "shortDescription": {"text": "Dangling fetch: GET /api/certificates (hanaflow-next/src/app/certificats/page.tsx:48)"}, "fullDescription": {"text": "`hanaflow-next/src/app/certificats/page.tsx:48` calls `GET /api/certificates` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/certificates`\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-0b3b3387776b8965", "name": "Dangling fetch: GET https://api.pwnedpasswords.com/range/${prefix} (hanaflow-next/src/lib/passwordBreach.ts:30)", "shortDescription": {"text": "Dangling fetch: GET https://api.pwnedpasswords.com/range/${prefix} (hanaflow-next/src/lib/passwordBreach.ts:30)"}, "fullDescription": {"text": "`hanaflow-next/src/lib/passwordBreach.ts:30` calls `GET https://api.pwnedpasswords.com/range/${prefix}` 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.pwnedpasswords.com/range/<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-51baf1a0e55095fa", "name": "Dangling fetch: GET /api/progress (hanaflow-next/src/hooks/useProgress.ts:24)", "shortDescription": {"text": "Dangling fetch: GET /api/progress (hanaflow-next/src/hooks/useProgress.ts:24)"}, "fullDescription": {"text": "`hanaflow-next/src/hooks/useProgress.ts:24` calls `GET /api/progress` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/progress`\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-eac6ff4d9d9a7dff", "name": "Dangling fetch: POST /api/progress (hanaflow-next/src/hooks/useProgress.ts:43)", "shortDescription": {"text": "Dangling fetch: POST /api/progress (hanaflow-next/src/hooks/useProgress.ts:43)"}, "fullDescription": {"text": "`hanaflow-next/src/hooks/useProgress.ts:43` calls `POST /api/progress` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/progress`\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-98828d6a50f1579f", "name": "Dangling fetch: GET /api/gamification (hanaflow-next/src/context/GamificationContext.tsx:100)", "shortDescription": {"text": "Dangling fetch: GET /api/gamification (hanaflow-next/src/context/GamificationContext.tsx:100)"}, "fullDescription": {"text": "`hanaflow-next/src/context/GamificationContext.tsx:100` calls `GET /api/gamification` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/gamification`\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-75485ab19c8a8b00", "name": "Dangling fetch: POST /api/gamification/migrate (hanaflow-next/src/context/GamificationContext.tsx:109)", "shortDescription": {"text": "Dangling fetch: POST /api/gamification/migrate (hanaflow-next/src/context/GamificationContext.tsx:109)"}, "fullDescription": {"text": "`hanaflow-next/src/context/GamificationContext.tsx:109` calls `POST /api/gamification/migrate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/gamification/migrate`\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-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`_archive/Back-End/server.js` declares `GET /` 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-b28d92215a503990", "name": "Unused endpoint: USE /auth", "shortDescription": {"text": "Unused endpoint: USE /auth"}, "fullDescription": {"text": "`_archive/Back-End/server.js` declares `USE /auth` 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-a59d91aaffa7376d", "name": "Unused endpoint: USE /progress", "shortDescription": {"text": "Unused endpoint: USE /progress"}, "fullDescription": {"text": "`_archive/Back-End/server.js` declares `USE /progress` 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-7874d137c73d03db", "name": "Unused endpoint: USE /gamification", "shortDescription": {"text": "Unused endpoint: USE /gamification"}, "fullDescription": {"text": "`_archive/Back-End/server.js` declares `USE /gamification` 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-60b852ae648b1af6", "name": "Unused endpoint: POST /:module", "shortDescription": {"text": "Unused endpoint: POST /:module"}, "fullDescription": {"text": "`_archive/Back-End/routes/progress.js` declares `POST /:module` 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-304b6f2b403d93f7", "name": "Unused endpoint: POST /register", "shortDescription": {"text": "Unused endpoint: POST /register"}, "fullDescription": {"text": "`_archive/Back-End/routes/auth.js` declares `POST /register` 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-618721b912bad1c2", "name": "Unused endpoint: POST /login", "shortDescription": {"text": "Unused endpoint: POST /login"}, "fullDescription": {"text": "`_archive/Back-End/routes/auth.js` declares `POST /login` 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-7ce17d6b092a81ca", "name": "Unused endpoint: POST /refresh", "shortDescription": {"text": "Unused endpoint: POST /refresh"}, "fullDescription": {"text": "`_archive/Back-End/routes/auth.js` declares `POST /refresh` 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-99fc36db98c134ce", "name": "Unused endpoint: POST /logout", "shortDescription": {"text": "Unused endpoint: POST /logout"}, "fullDescription": {"text": "`_archive/Back-End/routes/auth.js` declares `POST /logout` 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-fd1dc91abf32142d", "name": "Unused endpoint: GET /me", "shortDescription": {"text": "Unused endpoint: GET /me"}, "fullDescription": {"text": "`_archive/Back-End/routes/auth.js` declares `GET /me` 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-fd591ec7a1e77a1c", "name": "Unused endpoint: POST /upgrade", "shortDescription": {"text": "Unused endpoint: POST /upgrade"}, "fullDescription": {"text": "`_archive/Back-End/routes/auth.js` declares `POST /upgrade` 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-f4d655f521f7f2b3", "name": "Unused endpoint: POST /downgrade", "shortDescription": {"text": "Unused endpoint: POST /downgrade"}, "fullDescription": {"text": "`_archive/Back-End/routes/auth.js` declares `POST /downgrade` 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-59a1cc885f47e39f", "name": "Unused endpoint: PATCH /profile", "shortDescription": {"text": "Unused endpoint: PATCH /profile"}, "fullDescription": {"text": "`_archive/Back-End/routes/auth.js` declares `PATCH /profile` 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-e5cea7dddfee804f", "name": "Unused endpoint: POST /event", "shortDescription": {"text": "Unused endpoint: POST /event"}, "fullDescription": {"text": "`_archive/Back-End/routes/gamification.js` declares `POST /event` 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/22802"}, "properties": {"repository": "WissamTahiri/HanaFlow", "repoUrl": "https://github.com/WissamTahiri/HanaFlow", "branch": "main"}, "results": [{"ruleId": "scanner-c56094369f7ee5b8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 _archive/Back-End/server.js:169"}, "properties": {"repobilityId": "5888775e044379d4", "scanner": "scanner-primary", "fingerprint": "c56094369f7ee5b8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bb018c9e716297fa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 _archive/Back-End/db/migrate.js:13"}, "properties": {"repobilityId": "68ea6faebbc1dac1", "scanner": "scanner-primary", "fingerprint": "bb018c9e716297fa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7746b123f7a7bb3b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/components/Navbar.jsx:220"}, "properties": {"repobilityId": "78f0d62be95cd524", "scanner": "scanner-primary", "fingerprint": "7746b123f7a7bb3b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5710907fe20ea823", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 _archive/Front-End/src/pages/CertificationHCM.jsx:176"}, "properties": {"repobilityId": "9031d509f217adf7", "scanner": "scanner-primary", "fingerprint": "5710907fe20ea823", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-284def6f9b0a251a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/pages/ExamSimulatorHCM.jsx:152"}, "properties": {"repobilityId": "f0ca63a7e14c8f7d", "scanner": "scanner-primary", "fingerprint": "284def6f9b0a251a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7ba3ded689937a66", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/pages/ExamSimulatorPP.jsx:152"}, "properties": {"repobilityId": "8793191d5ad39bac", "scanner": "scanner-primary", "fingerprint": "7ba3ded689937a66", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3aca9c58d3f156e0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/pages/ExamSimulatorSD.jsx:147"}, "properties": {"repobilityId": "e4d455809ca0a15b", "scanner": "scanner-primary", "fingerprint": "3aca9c58d3f156e0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-33d9f5758968a3b7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/pages/ExamSimulator.jsx:168"}, "properties": {"repobilityId": "e4ba685c047dc320", "scanner": "scanner-primary", "fingerprint": "33d9f5758968a3b7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a27358730f60e9aa", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 _archive/Front-End/src/pages/CertificationPP.jsx:176"}, "properties": {"repobilityId": "8c4afb5c1f78a719", "scanner": "scanner-primary", "fingerprint": "a27358730f60e9aa", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a733780ab31a1c48", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/pages/ExamSimulatorMM.jsx:150"}, "properties": {"repobilityId": "0770bdfcc0e9764e", "scanner": "scanner-primary", "fingerprint": "a733780ab31a1c48", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-94e2587aa9ac684b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 _archive/Front-End/src/pages/ExamSimulatorCO.jsx:150"}, "properties": {"repobilityId": "19d9807fa4d7c377", "scanner": "scanner-primary", "fingerprint": "94e2587aa9ac684b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9526d04db1f95abf", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 hanaflow-next/src/components/ThemeScript.tsx:15"}, "properties": {"repobilityId": "6de70726e44ca9a5", "scanner": "scanner-primary", "fingerprint": "9526d04db1f95abf", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f3cbe7f473158de3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/ExamSimulatorTemplate.tsx:155"}, "properties": {"repobilityId": "5cd68e7b3bc163d6", "scanner": "scanner-primary", "fingerprint": "f3cbe7f473158de3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-86cbdf1817402c0f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 hanaflow-next/src/components/JsonLd.tsx:30"}, "properties": {"repobilityId": "bec658b9ef5e4988", "scanner": "scanner-primary", "fingerprint": "86cbdf1817402c0f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-34ba20a1acbab903", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/ImpersonationBanner.tsx:24"}, "properties": {"repobilityId": "001c44eedd319b10", "scanner": "scanner-primary", "fingerprint": "34ba20a1acbab903", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-93b0b4501bd828e2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/TestimonialsSection.tsx:104"}, "properties": {"repobilityId": "3fdadc0bfaf8045e", "scanner": "scanner-primary", "fingerprint": "93b0b4501bd828e2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-39991db673842b78", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/TutorChat.tsx:210"}, "properties": {"repobilityId": "05141d89734000e0", "scanner": "scanner-primary", "fingerprint": "39991db673842b78", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-56f9fcab5bd152a0", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 hanaflow-next/src/components/TutorChat.tsx:18"}, "properties": {"repobilityId": "746efdabede97e5f", "scanner": "scanner-primary", "fingerprint": "56f9fcab5bd152a0", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-27e63dd93f411d11", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/SiteBanner.tsx:56"}, "properties": {"repobilityId": "be44cea2aea40461", "scanner": "scanner-primary", "fingerprint": "27e63dd93f411d11", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-374393151143c938", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/EmailVerificationBanner.tsx:50"}, "properties": {"repobilityId": "459e5ff95d842c23", "scanner": "scanner-primary", "fingerprint": "374393151143c938", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cf5676ea88115386", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/components/Navbar.tsx:239"}, "properties": {"repobilityId": "4da8e13f7f9d504e", "scanner": "scanner-primary", "fingerprint": "cf5676ea88115386", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2e5125dffd2d8840", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/app/admin/page.tsx:177"}, "properties": {"repobilityId": "df6c477a87371ab4", "scanner": "scanner-primary", "fingerprint": "2e5125dffd2d8840", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1aa7fa86c2d276c5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/app/admin/layout.tsx:89"}, "properties": {"repobilityId": "26993f6ad1eb157b", "scanner": "scanner-primary", "fingerprint": "1aa7fa86c2d276c5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c03cca29f3fbab62", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/app/admin/users/[id]/page.tsx:376"}, "properties": {"repobilityId": "5ff2b7f793eccb82", "scanner": "scanner-primary", "fingerprint": "c03cca29f3fbab62", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-889261c793cab762", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/app/admin/promo-codes/page.tsx:217"}, "properties": {"repobilityId": "178c00f7a81581d3", "scanner": "scanner-primary", "fingerprint": "889261c793cab762", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4b0e051b09b81875", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/app/entretien/page.tsx:513"}, "properties": {"repobilityId": "41c244d9220a2bbd", "scanner": "scanner-primary", "fingerprint": "4b0e051b09b81875", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f9bb2921f2426dd6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 hanaflow-next/src/app/stats/page.tsx:283"}, "properties": {"repobilityId": "667f4e69fe7eadfb", "scanner": "scanner-primary", "fingerprint": "f9bb2921f2426dd6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-638a150cc6b70fa8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 hanaflow-next/src/lib/email.ts:22"}, "properties": {"repobilityId": "fb5d70eccecf6f3c", "scanner": "scanner-primary", "fingerprint": "638a150cc6b70fa8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f38daacbbda5f934", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 hanaflow-next/src/lib/totpCrypto.ts:22"}, "properties": {"repobilityId": "d09a7c782e69612e", "scanner": "scanner-primary", "fingerprint": "f38daacbbda5f934", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c64f54e3ba650734", "level": "error", "message": {"text": "Possible secret in _archive/Back-End/server.js"}, "properties": {"repobilityId": "068fd69b1d421d32", "scanner": "scanner-primary", "fingerprint": "c64f54e3ba650734", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "_archive/Back-End/server.js"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-69b8fefec0cbf822", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in _archive/Front-End/src/pages/CertificationHCM.jsx:176"}, "properties": {"repobilityId": "aa29579cdc40830f", "scanner": "scanner-primary", "fingerprint": "69b8fefec0cbf822", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "_archive/Front-End/src/pages/CertificationHCM.jsx"}, "region": {"startLine": 176}}}]}, {"ruleId": "scanner-0ed89ae450422b71", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in _archive/Front-End/src/pages/CertificationPP.jsx:176"}, "properties": {"repobilityId": "3d0b640d55d09056", "scanner": "scanner-primary", "fingerprint": "0ed89ae450422b71", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "_archive/Front-End/src/pages/CertificationPP.jsx"}, "region": {"startLine": 176}}}]}, {"ruleId": "scanner-c3836bdaaba02151", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in _archive/Front-End/src/context/AuthContext.jsx:43"}, "properties": {"repobilityId": "b2d06be45dca6641", "scanner": "scanner-primary", "fingerprint": "c3836bdaaba02151", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "_archive/Front-End/src/context/AuthContext.jsx"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-1c9c773e3a50a011", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in hanaflow-next/package.json:19"}, "properties": {"repobilityId": "4a250ad18b06df13", "scanner": "scanner-primary", "fingerprint": "1c9c773e3a50a011", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hanaflow-next/package.json"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-edb18fff3f7bb6c5", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in hanaflow-next/src/components/ThemeScript.tsx:15"}, "properties": {"repobilityId": "787d5b2aa80ecc19", "scanner": "scanner-primary", "fingerprint": "edb18fff3f7bb6c5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hanaflow-next/src/components/ThemeScript.tsx"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-906f7871ce21224c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in hanaflow-next/src/components/JsonLd.tsx:30"}, "properties": {"repobilityId": "83a868ebee3b5c68", "scanner": "scanner-primary", "fingerprint": "906f7871ce21224c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hanaflow-next/src/components/JsonLd.tsx"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-0dba90fd39a8104e", "level": "error", "message": {"text": "Possible secret in hanaflow-next/e2e/password-reset.spec.ts"}, "properties": {"repobilityId": "515958d20607dc4e", "scanner": "scanner-primary", "fingerprint": "0dba90fd39a8104e", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hanaflow-next/e2e/password-reset.spec.ts"}, "region": {"startLine": 73}}}]}, {"ruleId": "scanner-adada9a9ef10f6c8", "level": "error", "message": {"text": "Possible secret in hanaflow-next/e2e/helpers/user.ts"}, "properties": {"repobilityId": "2fd5ee8ce091f30d", "scanner": "scanner-primary", "fingerprint": "adada9a9ef10f6c8", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hanaflow-next/e2e/helpers/user.ts"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-d8b09a67cd6fa419", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f1c66796a7741de3", "scanner": "scanner-primary", "fingerprint": "d8b09a67cd6fa419", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/sap-cert-watch.yml"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-d8b09a67cd6fa419", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "54430bac589a11b2", "scanner": "scanner-primary", "fingerprint": "d8b09a67cd6fa419", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/sap-cert-watch.yml"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-547965630a424c69", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "0bda41b71941318e", "scanner": "scanner-primary", "fingerprint": "547965630a424c69", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/sap-cert-watch.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "54c8f1b47dd62535", "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": 102}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bd7f3c1c34d83159", "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": 120}}}]}, {"ruleId": "scanner-bd33fbed1a313e0e", "level": "warning", "message": {"text": "Install-time lifecycle script performs network/shell-sensitive actions"}, "properties": {"repobilityId": "871bd41b37981dfb", "scanner": "scanner-primary", "fingerprint": "bd33fbed1a313e0e", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "hanaflow-next/package.json"}, "region": {"startLine": 1}}}]}, {"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": "e97f73d37c7107b8", "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": "f4ce0618fa141152", "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": "23515ca22f5d1a57", "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": "a1b5e41df0b18653", "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": "ea16fb220b688ef9", "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": "7e9b5ab14e845dea", "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": "14891174abbba5a9", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-04c64ff4d890dd86", "level": "none", "message": {"text": "Commented-code block (5 lines) in _archive/Back-End/server.js:68"}, "properties": {"repobilityId": "1941234e758acdad", "scanner": "scanner-primary", "fingerprint": "04c64ff4d890dd86", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d2e9297a42a3f0f8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 _archive/Front-End/src/context/AuthContext.jsx:7"}, "properties": {"repobilityId": "fc6dbb7942580f22", "scanner": "scanner-primary", "fingerprint": "d2e9297a42a3f0f8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8680bd82a8d3e97f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 _archive/Front-End/src/context/SubscriptionContext.jsx:17"}, "properties": {"repobilityId": "323df711570bf2ce", "scanner": "scanner-primary", "fingerprint": "8680bd82a8d3e97f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a26dc2e7a6f6d69c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/components/FeedbackWidget.tsx:45"}, "properties": {"repobilityId": "3b982ff21b6bac49", "scanner": "scanner-primary", "fingerprint": "a26dc2e7a6f6d69c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7bf18588ad4ec78c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/components/CertificateDownloadButton.tsx:45"}, "properties": {"repobilityId": "48fea31f51bdce6e", "scanner": "scanner-primary", "fingerprint": "7bf18588ad4ec78c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9820a5c3e082323f", "level": "none", "message": {"text": "Commented-code block (5 lines) in hanaflow-next/src/app/api/certificates/issue/route.ts:65"}, "properties": {"repobilityId": "9d0fec8e7b351533", "scanner": "scanner-primary", "fingerprint": "9820a5c3e082323f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-72b5c1a4d86fead3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/app/admin/settings/page.tsx:107"}, "properties": {"repobilityId": "7c6cce5f747ad96f", "scanner": "scanner-primary", "fingerprint": "72b5c1a4d86fead3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-64888730d4465d16", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/app/admin/promo-codes/page.tsx:62"}, "properties": {"repobilityId": "ac39c2502f87e487", "scanner": "scanner-primary", "fingerprint": "64888730d4465d16", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c76c24973a7c1199", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/app/admin/testimonials/page.tsx:103"}, "properties": {"repobilityId": "64c9540b07b65e56", "scanner": "scanner-primary", "fingerprint": "c76c24973a7c1199", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ae5a0cea3c1450f3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/app/admin/feedback/page.tsx:62"}, "properties": {"repobilityId": "c869214d98efef3f", "scanner": "scanner-primary", "fingerprint": "ae5a0cea3c1450f3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1e0962ef9f4fe70a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/app/cv-builder/page.tsx:184"}, "properties": {"repobilityId": "50bd8852d7ba6220", "scanner": "scanner-primary", "fingerprint": "1e0962ef9f4fe70a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-caed1d7241d6af25", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/app/verify-email/page.tsx:18"}, "properties": {"repobilityId": "d1e88be8b31deed0", "scanner": "scanner-primary", "fingerprint": "caed1d7241d6af25", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3b194abb1fe2a123", "level": "none", "message": {"text": "Commented-code block (5 lines) in hanaflow-next/src/lib/apiHelpers.ts:182"}, "properties": {"repobilityId": "c13968db753f2a36", "scanner": "scanner-primary", "fingerprint": "3b194abb1fe2a123", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a5c6261330285a8c", "level": "none", "message": {"text": "Commented-code block (8 lines) in hanaflow-next/src/lib/certAccess.ts:37"}, "properties": {"repobilityId": "6989339cf16fd0a3", "scanner": "scanner-primary", "fingerprint": "a5c6261330285a8c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-13184218893a802a", "level": "note", "message": {"text": "Legacy-named symbol `hf_admin_backup` in hanaflow-next/src/context/AuthContext.tsx:71"}, "properties": {"repobilityId": "1004940fcee364ba", "scanner": "scanner-primary", "fingerprint": "13184218893a802a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4365d257eb98766f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/context/AuthContext.tsx:25"}, "properties": {"repobilityId": "2d88bfcdae447593", "scanner": "scanner-primary", "fingerprint": "4365d257eb98766f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-253d27c33b0bbf89", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 hanaflow-next/src/context/GamificationContext.tsx:109"}, "properties": {"repobilityId": "44e27f04eb4062b1", "scanner": "scanner-primary", "fingerprint": "253d27c33b0bbf89", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-87acb4066071a15a", "level": "note", "message": {"text": "19 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "b1f30c58de7ffb20", "scanner": "scanner-primary", "fingerprint": "87acb4066071a15a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-ccd08766cbb3e0d1", "level": "error", "message": {"text": "Dangling fetch: POST /api/feedback (hanaflow-next/src/components/FeedbackWidget.tsx:45)"}, "properties": {"repobilityId": "1d0ebf180b1ddbd1", "scanner": "scanner-primary", "fingerprint": "ccd08766cbb3e0d1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-26f7126592160ab9", "level": "error", "message": {"text": "Dangling fetch: GET /api/auth/2fa/backup-codes (hanaflow-next/src/components/TwoFactorSection.tsx:24)"}, "properties": {"repobilityId": "222dc8a3f419ba3b", "scanner": "scanner-primary", "fingerprint": "26f7126592160ab9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a49137a5d4ea3718", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/2fa/enroll (hanaflow-next/src/components/TwoFactorSection.tsx:53)"}, "properties": {"repobilityId": "8f94a88fbc5043a8", "scanner": "scanner-primary", "fingerprint": "a49137a5d4ea3718", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4315612544905bd4", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/2fa/verify-enroll (hanaflow-next/src/components/TwoFactorSection.tsx:74)"}, "properties": {"repobilityId": "34c3ab91c2c1cf41", "scanner": "scanner-primary", "fingerprint": "4315612544905bd4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-35289306d51d4b5a", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/2fa/disable (hanaflow-next/src/components/TwoFactorSection.tsx:99)"}, "properties": {"repobilityId": "cd105d77980ba320", "scanner": "scanner-primary", "fingerprint": "35289306d51d4b5a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4e26b210ac17f1e5", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/2fa/backup-codes (hanaflow-next/src/components/TwoFactorSection.tsx:121)"}, "properties": {"repobilityId": "bfeead486da23fea", "scanner": "scanner-primary", "fingerprint": "4e26b210ac17f1e5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4ca75d1044d047c5", "level": "error", "message": {"text": "Dangling fetch: POST /api/certificates/issue (hanaflow-next/src/components/CertificateDownloadButton.tsx:45)"}, "properties": {"repobilityId": "cf00db54ab2c67ad", "scanner": "scanner-primary", "fingerprint": "4ca75d1044d047c5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-01edee96bf66b805", "level": "error", "message": {"text": "Dangling fetch: GET /api/testimonials (hanaflow-next/src/components/TestimonialsSection.tsx:34)"}, "properties": {"repobilityId": "0ef72b187dbd1cd0", "scanner": "scanner-primary", "fingerprint": "01edee96bf66b805", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-82c7b63e5e3f34b2", "level": "error", "message": {"text": "Dangling fetch: POST /api/tutor/chat (hanaflow-next/src/components/TutorChat.tsx:137)"}, "properties": {"repobilityId": "66d8dbce7d26221a", "scanner": "scanner-primary", "fingerprint": "82c7b63e5e3f34b2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-804a09f4d69ef926", "level": "error", "message": {"text": "Dangling fetch: GET /api/nps/should-show (hanaflow-next/src/components/NPSPrompt.tsx:57)"}, "properties": {"repobilityId": "00f1567d01d02380", "scanner": "scanner-primary", "fingerprint": "804a09f4d69ef926", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b12360c22733c974", "level": "error", "message": {"text": "Dangling fetch: POST /api/nps (hanaflow-next/src/components/NPSPrompt.tsx:97)"}, "properties": {"repobilityId": "fe29b081ecf5563c", "scanner": "scanner-primary", "fingerprint": "b12360c22733c974", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d40ea0325f43497b", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/resend-verification (hanaflow-next/src/components/EmailVerificationBanner.tsx:29)"}, "properties": {"repobilityId": "0d4d5314a9015a49", "scanner": "scanner-primary", "fingerprint": "d40ea0325f43497b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4e50f786b848a7c1", "level": "error", "message": {"text": "Dangling fetch: GET /api/quiz/attempts?limit=8 (hanaflow-next/src/components/QuizHistorySection.tsx:46)"}, "properties": {"repobilityId": "5c5003111b0ef70b", "scanner": "scanner-primary", "fingerprint": "4e50f786b848a7c1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-923c831a1bdd1cb1", "level": "error", "message": {"text": "Dangling fetch: POST /api/feedback (hanaflow-next/src/app/ecoles/DemoRequestForm.tsx:22)"}, "properties": {"repobilityId": "7d474d9109338e08", "scanner": "scanner-primary", "fingerprint": "923c831a1bdd1cb1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c35eeb356bdd47f4", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/reset-password (hanaflow-next/src/app/reset-password/page.tsx:25)"}, "properties": {"repobilityId": "8e00ce93aea9d8ce", "scanner": "scanner-primary", "fingerprint": "c35eeb356bdd47f4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-325eda19d0a2164d", "level": "error", "message": {"text": "Dangling fetch: POST /api/feedback (hanaflow-next/src/app/contact/page.tsx:34)"}, "properties": {"repobilityId": "9c013a0c5e0f84fd", "scanner": "scanner-primary", "fingerprint": "325eda19d0a2164d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f97e16744b426bcc", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/forgot-password (hanaflow-next/src/app/forgot-password/page.tsx:17)"}, "properties": {"repobilityId": "96d5048f2f327db9", "scanner": "scanner-primary", "fingerprint": "f97e16744b426bcc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b609308bab42e052", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/analytics (hanaflow-next/src/app/admin/page.tsx:94)"}, "properties": {"repobilityId": "996fde40bb9c0147", "scanner": "scanner-primary", "fingerprint": "b609308bab42e052", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c83bdde3936aba43", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/settings (hanaflow-next/src/app/admin/settings/page.tsx:65)"}, "properties": {"repobilityId": "c357765cc28b4c0c", "scanner": "scanner-primary", "fingerprint": "c83bdde3936aba43", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-06c4c2d9204d7298", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/admin/settings (hanaflow-next/src/app/admin/settings/page.tsx:107)"}, "properties": {"repobilityId": "9cd2e5626ade33ed", "scanner": "scanner-primary", "fingerprint": "06c4c2d9204d7298", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5340b1a136cc7b36", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/users?${params} (hanaflow-next/src/app/admin/users/page.tsx:54)"}, "properties": {"repobilityId": "14fe5f5cc286173e", "scanner": "scanner-primary", "fingerprint": "5340b1a136cc7b36", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2e8b0570a2117690", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/admin/users/${id} (hanaflow-next/src/app/admin/users/page.tsx:76)"}, "properties": {"repobilityId": "c2a7a0215b5e5eca", "scanner": "scanner-primary", "fingerprint": "2e8b0570a2117690", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8edfab36e0ff6ae4", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/admin/users/${id} (hanaflow-next/src/app/admin/users/page.tsx:101)"}, "properties": {"repobilityId": "7182f84988a03885", "scanner": "scanner-primary", "fingerprint": "8edfab36e0ff6ae4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9614032d687e2afb", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/users/bulk (hanaflow-next/src/app/admin/users/page.tsx:144)"}, "properties": {"repobilityId": "aca71044d2f7b166", "scanner": "scanner-primary", "fingerprint": "9614032d687e2afb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-643f585cc309caac", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/users/export (hanaflow-next/src/app/admin/users/page.tsx:166)"}, "properties": {"repobilityId": "ce5393f0c6ac6431", "scanner": "scanner-primary", "fingerprint": "643f585cc309caac", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f6d43bec0399317c", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/users/${id} (hanaflow-next/src/app/admin/users/[id]/page.tsx:47)"}, "properties": {"repobilityId": "5ae0d7c061d48c09", "scanner": "scanner-primary", "fingerprint": "f6d43bec0399317c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bc233a09859e68f9", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/admin/users/${data.id} (hanaflow-next/src/app/admin/users/[id]/page.tsx:68)"}, "properties": {"repobilityId": "010f00df2fe0f99c", "scanner": "scanner-primary", "fingerprint": "bc233a09859e68f9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4bbf6680a39874a1", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/users/${data.id}/impersonate (hanaflow-next/src/app/admin/users/[id]/page.tsx:104)"}, "properties": {"repobilityId": "2668234b77f0e80c", "scanner": "scanner-primary", "fingerprint": "4bbf6680a39874a1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-05edddb917bdc84b", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/users/${data.id}/revoke-sessions (hanaflow-next/src/app/admin/users/[id]/page.tsx:132)"}, "properties": {"repobilityId": "0d8dc5f3583acb23", "scanner": "scanner-primary", "fingerprint": "05edddb917bdc84b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-36c35cc4bae6ba6b", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/admin/users/${data.id} (hanaflow-next/src/app/admin/users/[id]/page.tsx:153)"}, "properties": {"repobilityId": "92fb397feb7ec0c7", "scanner": "scanner-primary", "fingerprint": "36c35cc4bae6ba6b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-32e4a8c99d547e85", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/audit-log?${params} (hanaflow-next/src/app/admin/audit-log/page.tsx:54)"}, "properties": {"repobilityId": "4c5a06d3fdd01976", "scanner": "scanner-primary", "fingerprint": "32e4a8c99d547e85", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f8eea6921c72a8b7", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/promo-codes (hanaflow-next/src/app/admin/promo-codes/page.tsx:36)"}, "properties": {"repobilityId": "fd7820247c658c9b", "scanner": "scanner-primary", "fingerprint": "f8eea6921c72a8b7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-742f4de10449e78c", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/promo-codes (hanaflow-next/src/app/admin/promo-codes/page.tsx:62)"}, "properties": {"repobilityId": "12c319a56a1a9da2", "scanner": "scanner-primary", "fingerprint": "742f4de10449e78c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-19382db4606365e9", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/admin/promo-codes/${id} (hanaflow-next/src/app/admin/promo-codes/page.tsx:82)"}, "properties": {"repobilityId": "f549bbeae1723aef", "scanner": "scanner-primary", "fingerprint": "19382db4606365e9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b5574503e6b7ff3a", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/admin/promo-codes/${id} (hanaflow-next/src/app/admin/promo-codes/page.tsx:103)"}, "properties": {"repobilityId": "0358596816db1f88", "scanner": "scanner-primary", "fingerprint": "b5574503e6b7ff3a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fa3bbac10e09e0d6", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/testimonials (hanaflow-next/src/app/admin/testimonials/page.tsx:47)"}, "properties": {"repobilityId": "89ddef8801e08d73", "scanner": "scanner-primary", "fingerprint": "fa3bbac10e09e0d6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8dc05d45bc8fbb58", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/admin/testimonials/${id} (hanaflow-next/src/app/admin/testimonials/page.tsx:124)"}, "properties": {"repobilityId": "49a23470bd1e4d97", "scanner": "scanner-primary", "fingerprint": "8dc05d45bc8fbb58", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f96f3d42ea47a4e4", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/admin/testimonials/${t.id} (hanaflow-next/src/app/admin/testimonials/page.tsx:134)"}, "properties": {"repobilityId": "aee761422c2e0a41", "scanner": "scanner-primary", "fingerprint": "f96f3d42ea47a4e4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dff7448169b04dc6", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/nps (hanaflow-next/src/app/admin/nps/page.tsx:32)"}, "properties": {"repobilityId": "568f95d6e752aa7e", "scanner": "scanner-primary", "fingerprint": "dff7448169b04dc6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3c0ecb0da6496e2f", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/feedback?status=${filter}&page=${page} (hanaflow-next/src/app/admin/feedback/page.tsx:45)"}, "properties": {"repobilityId": "0e3a11187d92ae07", "scanner": "scanner-primary", "fingerprint": "3c0ecb0da6496e2f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1836e87601bc6c79", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/admin/feedback/${id} (hanaflow-next/src/app/admin/feedback/page.tsx:62)"}, "properties": {"repobilityId": "62d2919909e39319", "scanner": "scanner-primary", "fingerprint": "1836e87601bc6c79", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-69fc63e43074421b", "level": "error", "message": {"text": "Dangling fetch: POST /api/cv/optimize (hanaflow-next/src/app/cv-builder/page.tsx:184)"}, "properties": {"repobilityId": "a070f1019cea468e", "scanner": "scanner-primary", "fingerprint": "69fc63e43074421b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-be6a5048a98cdf27", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/verify-email (hanaflow-next/src/app/verify-email/page.tsx:18)"}, "properties": {"repobilityId": "b7fa30433ea22586", "scanner": "scanner-primary", "fingerprint": "be6a5048a98cdf27", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d49bf370aab229a0", "level": "error", "message": {"text": "Dangling fetch: POST /api/promo/redeem (hanaflow-next/src/app/profil/page.tsx:82)"}, "properties": {"repobilityId": "692c2bc6e99cef92", "scanner": "scanner-primary", "fingerprint": "d49bf370aab229a0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bda357300486a0c5", "level": "error", "message": {"text": "Dangling fetch: POST /api/interview/start (hanaflow-next/src/app/entretien/page.tsx:120)"}, "properties": {"repobilityId": "abcf28cb6e891cb0", "scanner": "scanner-primary", "fingerprint": "bda357300486a0c5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bc33a23b2b8a7352", "level": "error", "message": {"text": "Dangling fetch: POST /api/interview/grade (hanaflow-next/src/app/entretien/page.tsx:153)"}, "properties": {"repobilityId": "528e1b511d3445c3", "scanner": "scanner-primary", "fingerprint": "bc33a23b2b8a7352", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-600a7d2e11325e1b", "level": "error", "message": {"text": "Dangling fetch: GET /api/certificates (hanaflow-next/src/app/stats/page.tsx:72)"}, "properties": {"repobilityId": "a76dea34dca9ec21", "scanner": "scanner-primary", "fingerprint": "600a7d2e11325e1b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4c6026fa6dd2faa6", "level": "error", "message": {"text": "Dangling fetch: POST /api/roadmap/generate (hanaflow-next/src/app/roadmap/page.tsx:84)"}, "properties": {"repobilityId": "f6825183af70ffe9", "scanner": "scanner-primary", "fingerprint": "4c6026fa6dd2faa6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fdcc1d607c97b2e5", "level": "error", "message": {"text": "Dangling fetch: GET /api/certificates (hanaflow-next/src/app/certificats/page.tsx:48)"}, "properties": {"repobilityId": "0873554686443d97", "scanner": "scanner-primary", "fingerprint": "fdcc1d607c97b2e5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0b3b3387776b8965", "level": "error", "message": {"text": "Dangling fetch: GET https://api.pwnedpasswords.com/range/${prefix} (hanaflow-next/src/lib/passwordBreach.ts:30)"}, "properties": {"repobilityId": "49e4cbc1b95bf4e6", "scanner": "scanner-primary", "fingerprint": "0b3b3387776b8965", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-51baf1a0e55095fa", "level": "error", "message": {"text": "Dangling fetch: GET /api/progress (hanaflow-next/src/hooks/useProgress.ts:24)"}, "properties": {"repobilityId": "6f4a3a25db141575", "scanner": "scanner-primary", "fingerprint": "51baf1a0e55095fa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eac6ff4d9d9a7dff", "level": "error", "message": {"text": "Dangling fetch: POST /api/progress (hanaflow-next/src/hooks/useProgress.ts:43)"}, "properties": {"repobilityId": "afdb7abdf6b277ca", "scanner": "scanner-primary", "fingerprint": "eac6ff4d9d9a7dff", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-98828d6a50f1579f", "level": "error", "message": {"text": "Dangling fetch: GET /api/gamification (hanaflow-next/src/context/GamificationContext.tsx:100)"}, "properties": {"repobilityId": "3cbcf0b68556c9e9", "scanner": "scanner-primary", "fingerprint": "98828d6a50f1579f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-75485ab19c8a8b00", "level": "error", "message": {"text": "Dangling fetch: POST /api/gamification/migrate (hanaflow-next/src/context/GamificationContext.tsx:109)"}, "properties": {"repobilityId": "8b6f6949eeb45b64", "scanner": "scanner-primary", "fingerprint": "75485ab19c8a8b00", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "c462e34cbf07632b", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b28d92215a503990", "level": "note", "message": {"text": "Unused endpoint: USE /auth"}, "properties": {"repobilityId": "f3422c318759a15d", "scanner": "scanner-primary", "fingerprint": "b28d92215a503990", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a59d91aaffa7376d", "level": "note", "message": {"text": "Unused endpoint: USE /progress"}, "properties": {"repobilityId": "5ca73d7cb945f14d", "scanner": "scanner-primary", "fingerprint": "a59d91aaffa7376d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7874d137c73d03db", "level": "note", "message": {"text": "Unused endpoint: USE /gamification"}, "properties": {"repobilityId": "32b77803790dd41e", "scanner": "scanner-primary", "fingerprint": "7874d137c73d03db", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-60b852ae648b1af6", "level": "note", "message": {"text": "Unused endpoint: POST /:module"}, "properties": {"repobilityId": "afbeddee266cae3b", "scanner": "scanner-primary", "fingerprint": "60b852ae648b1af6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-304b6f2b403d93f7", "level": "note", "message": {"text": "Unused endpoint: POST /register"}, "properties": {"repobilityId": "b76889ee9517cd89", "scanner": "scanner-primary", "fingerprint": "304b6f2b403d93f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-618721b912bad1c2", "level": "note", "message": {"text": "Unused endpoint: POST /login"}, "properties": {"repobilityId": "64e9f3e8fd9f9f09", "scanner": "scanner-primary", "fingerprint": "618721b912bad1c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7ce17d6b092a81ca", "level": "note", "message": {"text": "Unused endpoint: POST /refresh"}, "properties": {"repobilityId": "0985d6a1b0f292e2", "scanner": "scanner-primary", "fingerprint": "7ce17d6b092a81ca", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-99fc36db98c134ce", "level": "note", "message": {"text": "Unused endpoint: POST /logout"}, "properties": {"repobilityId": "abb19b4e71bca6a7", "scanner": "scanner-primary", "fingerprint": "99fc36db98c134ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "e2d714a1a07dbbbd", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd591ec7a1e77a1c", "level": "note", "message": {"text": "Unused endpoint: POST /upgrade"}, "properties": {"repobilityId": "ebf683fb85aee1fe", "scanner": "scanner-primary", "fingerprint": "fd591ec7a1e77a1c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f4d655f521f7f2b3", "level": "note", "message": {"text": "Unused endpoint: POST /downgrade"}, "properties": {"repobilityId": "35421aade1a038fa", "scanner": "scanner-primary", "fingerprint": "f4d655f521f7f2b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-59a1cc885f47e39f", "level": "note", "message": {"text": "Unused endpoint: PATCH /profile"}, "properties": {"repobilityId": "87dd55b258b90fe2", "scanner": "scanner-primary", "fingerprint": "59a1cc885f47e39f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e5cea7dddfee804f", "level": "note", "message": {"text": "Unused endpoint: POST /event"}, "properties": {"repobilityId": "26232c5a51b069dc", "scanner": "scanner-primary", "fingerprint": "e5cea7dddfee804f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}