{"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-651680d7d44f34fd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/TableauDeBord.tsx:257", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/TableauDeBord.tsx:257"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-27d8bfce158dc729", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/GestionReferentiels.tsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/GestionReferentiels.tsx:123"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9a1519659bb5ff67", "name": "Insecure pattern 'node_child_process' in scripts/generer-rgpd-docx.cjs:14", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/generer-rgpd-docx.cjs:14"}, "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-fd582ed43ddd4f7d", "name": "Insecure pattern 'weak_hash' in scripts/generer-rgpd-docx.cjs:133", "shortDescription": {"text": "Insecure pattern 'weak_hash' in scripts/generer-rgpd-docx.cjs:133"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 87 placeholder/mock markers across 24 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "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-732059cadedace37", "name": "Commented-code block (5 lines) in src/types/index.ts:361", "shortDescription": {"text": "Commented-code block (5 lines) in src/types/index.ts:361"}, "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-cf224fb2b2310cf5", "name": "Commented-code block (8 lines) in src/fixtures/livret-demo.ts:192", "shortDescription": {"text": "Commented-code block (8 lines) in src/fixtures/livret-demo.ts:192"}, "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-c48991d31c88a59f", "name": "Commented-code block (5 lines) in src/components/layout/RoleSwitcher.tsx:83", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/layout/RoleSwitcher.tsx:83"}, "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-e53201e1d0b4fe22", "name": "Commented-code block (8 lines) in src/components/admin/ModaleApprenti.tsx:92", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/admin/ModaleApprenti.tsx:92"}, "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-633a481284f55597", "name": "Commented-code block (8 lines) in src/components/admin/ModaleUtilisateurStaff.tsx:92", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/admin/ModaleUtilisateurStaff.tsx:92"}, "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-f91b5cdf56d9214f", "name": "Commented-code block (5 lines) in src/lib/generer-xlsx-modele.test.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/generer-xlsx-modele.test.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f2bd6a8900be3dd5", "name": "Commented-code block (5 lines) in src/lib/import-utilisateurs.ts:251", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/import-utilisateurs.ts:251"}, "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-5ef224cfac96b1fc", "name": "Commented-code block (5 lines) in src/lib/droits.test.ts:118", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/droits.test.ts:118"}, "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-83b8f54245ab0a52", "name": "Commented-code block (7 lines) in src/lib/droits.ts:180", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/droits.ts:180"}, "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-0daff5c3cb16f71c", "name": "Commented-code block (5 lines) in src/lib/etat-livret.test.ts:136", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/etat-livret.test.ts:136"}, "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-91b356837c8d98ac", "name": "Commented-code block (6 lines) in src/lib/parser-xlsx.test.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/parser-xlsx.test.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-27f419f6aea3243d", "name": "Commented-code block (7 lines) in src/pages/admin/ImportUtilisateurs.tsx:135", "shortDescription": {"text": "Commented-code block (7 lines) in src/pages/admin/ImportUtilisateurs.tsx:135"}, "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-2a8204fbf8494846", "name": "Commented-code block (44 lines) in src/store/useLivretStore.ts:56", "shortDescription": {"text": "Commented-code block (44 lines) in src/store/useLivretStore.ts:56"}, "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-c16c71fa1556dfed", "name": "Commented-code block (7 lines) in src/store/useBanqueQuestionsStore.ts:44", "shortDescription": {"text": "Commented-code block (7 lines) in src/store/useBanqueQuestionsStore.ts:44"}, "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-99229a7048476f1a", "name": "Commented-code block (12 lines) in src/store/useFormationsStore.ts:108", "shortDescription": {"text": "Commented-code block (12 lines) in src/store/useFormationsStore.ts:108"}, "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-0c35e70ebb900bb6", "name": "Commented-code block (5 lines) in src/store/useReferentielsStore.ts:48", "shortDescription": {"text": "Commented-code block (5 lines) in src/store/useReferentielsStore.ts:48"}, "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-6c12afd225c99a9f", "name": "Commented-code block (6 lines) in e2e/header-trio-contextuel.spec.ts:46", "shortDescription": {"text": "Commented-code block (6 lines) in e2e/header-trio-contextuel.spec.ts:46"}, "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-51a2e27b79dd9366", "name": "Frontend route `livret/:apprentiId` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `livret/:apprentiId` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c815cfd2ed31fa06", "name": "Frontend route `livret/organisation-suivi` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `livret/organisation-suivi` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-69230aca359bf1c5", "name": "Frontend route `livret/entretien/:numero` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `livret/entretien/:numero` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4c402c5af36ae5e2", "name": "Frontend route `livret/fiches-suivi` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `livret/fiches-suivi` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7aa7c69c25280c5a", "name": "Frontend route `livret/fiches-suivi/:ficheId` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `livret/fiches-suivi/:ficheId` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-34a8d9f1a3f06bac", "name": "Frontend route `livret/evaluation-finale` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `livret/evaluation-finale` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f763efc2becc6e17", "name": "Frontend route `livret/pronote` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `livret/pronote` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4bc990a46d523ae6", "name": "Frontend route `admin/utilisateurs` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `admin/utilisateurs` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2fe2d5f34e3ba6a5", "name": "Frontend route `admin/import-utilisateurs` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `admin/import-utilisateurs` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a0ec84d77c65fa2c", "name": "Frontend route `admin/formations` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `admin/formations` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8b351803dacf93b9", "name": "Frontend route `admin/affectations` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `admin/affectations` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c79156cf6f214acc", "name": "Frontend route `admin/referentiels` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `admin/referentiels` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6bd05b58115351e5", "name": "Frontend route `admin/banque-questions` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `admin/banque-questions` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3b7f926567d28ca5", "name": "Frontend route `admin/etablissements` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `admin/etablissements` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0623b35a8fafb962", "name": "Frontend route `admin/attitudes` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `admin/attitudes` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/22862"}, "properties": {"repository": "Worzee/livret-glm", "repoUrl": "https://github.com/Worzee/livret-glm", "branch": "main"}, "results": [{"ruleId": "scanner-651680d7d44f34fd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/TableauDeBord.tsx:257"}, "properties": {"repobilityId": "e237bbd70e2270d4", "scanner": "scanner-primary", "fingerprint": "651680d7d44f34fd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-27d8bfce158dc729", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/admin/GestionReferentiels.tsx:123"}, "properties": {"repobilityId": "9faab37f6597d42a", "scanner": "scanner-primary", "fingerprint": "27d8bfce158dc729", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9a1519659bb5ff67", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/generer-rgpd-docx.cjs:14"}, "properties": {"repobilityId": "389ddeaaec6501b2", "scanner": "scanner-primary", "fingerprint": "9a1519659bb5ff67", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generer-rgpd-docx.cjs"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-fd582ed43ddd4f7d", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in scripts/generer-rgpd-docx.cjs:133"}, "properties": {"repobilityId": "0f57d9bea8c94395", "scanner": "scanner-primary", "fingerprint": "fd582ed43ddd4f7d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generer-rgpd-docx.cjs"}, "region": {"startLine": 133}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "a595d86753d5b790", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "dbb4b1d0eb7a8494", "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": "a2d86f0bf7a2a9bb", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "605b5a9cb450f82a", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "834bdb8dc339d625", "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": "792686d6cc71b5bc", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-732059cadedace37", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/types/index.ts:361"}, "properties": {"repobilityId": "a2a6c94b1f7f54a6", "scanner": "scanner-primary", "fingerprint": "732059cadedace37", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cf224fb2b2310cf5", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/fixtures/livret-demo.ts:192"}, "properties": {"repobilityId": "7ced8ffe123a35e9", "scanner": "scanner-primary", "fingerprint": "cf224fb2b2310cf5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c48991d31c88a59f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/layout/RoleSwitcher.tsx:83"}, "properties": {"repobilityId": "20ca60cdf986568e", "scanner": "scanner-primary", "fingerprint": "c48991d31c88a59f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e53201e1d0b4fe22", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/admin/ModaleApprenti.tsx:92"}, "properties": {"repobilityId": "02a8242440d46042", "scanner": "scanner-primary", "fingerprint": "e53201e1d0b4fe22", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-633a481284f55597", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/admin/ModaleUtilisateurStaff.tsx:92"}, "properties": {"repobilityId": "e69992e4a60921a4", "scanner": "scanner-primary", "fingerprint": "633a481284f55597", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f91b5cdf56d9214f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/generer-xlsx-modele.test.ts:1"}, "properties": {"repobilityId": "78013193427134fc", "scanner": "scanner-primary", "fingerprint": "f91b5cdf56d9214f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2bd6a8900be3dd5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/import-utilisateurs.ts:251"}, "properties": {"repobilityId": "02521921ad47d3d9", "scanner": "scanner-primary", "fingerprint": "f2bd6a8900be3dd5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5ef224cfac96b1fc", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/droits.test.ts:118"}, "properties": {"repobilityId": "d02f4b6ed45456ab", "scanner": "scanner-primary", "fingerprint": "5ef224cfac96b1fc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-83b8f54245ab0a52", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/droits.ts:180"}, "properties": {"repobilityId": "a654ea40f8c88fab", "scanner": "scanner-primary", "fingerprint": "83b8f54245ab0a52", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0daff5c3cb16f71c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/etat-livret.test.ts:136"}, "properties": {"repobilityId": "8047ca3b92abfc4b", "scanner": "scanner-primary", "fingerprint": "0daff5c3cb16f71c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-91b356837c8d98ac", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/parser-xlsx.test.ts:1"}, "properties": {"repobilityId": "3a9107dd06afa942", "scanner": "scanner-primary", "fingerprint": "91b356837c8d98ac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-27f419f6aea3243d", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/pages/admin/ImportUtilisateurs.tsx:135"}, "properties": {"repobilityId": "1b39701e49a54646", "scanner": "scanner-primary", "fingerprint": "27f419f6aea3243d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2a8204fbf8494846", "level": "none", "message": {"text": "Commented-code block (44 lines) in src/store/useLivretStore.ts:56"}, "properties": {"repobilityId": "c724046f6b345010", "scanner": "scanner-primary", "fingerprint": "2a8204fbf8494846", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c16c71fa1556dfed", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/store/useBanqueQuestionsStore.ts:44"}, "properties": {"repobilityId": "abe4a27205fd8de3", "scanner": "scanner-primary", "fingerprint": "c16c71fa1556dfed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-99229a7048476f1a", "level": "none", "message": {"text": "Commented-code block (12 lines) in src/store/useFormationsStore.ts:108"}, "properties": {"repobilityId": "c02cfba804a9d6f9", "scanner": "scanner-primary", "fingerprint": "99229a7048476f1a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0c35e70ebb900bb6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/store/useReferentielsStore.ts:48"}, "properties": {"repobilityId": "75a734d66ec423ad", "scanner": "scanner-primary", "fingerprint": "0c35e70ebb900bb6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6c12afd225c99a9f", "level": "none", "message": {"text": "Commented-code block (6 lines) in e2e/header-trio-contextuel.spec.ts:46"}, "properties": {"repobilityId": "ca205fae2926c439", "scanner": "scanner-primary", "fingerprint": "6c12afd225c99a9f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-51a2e27b79dd9366", "level": "warning", "message": {"text": "Frontend route `livret/:apprentiId` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "f0da31fba598c3ae", "scanner": "scanner-primary", "fingerprint": "51a2e27b79dd9366", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c815cfd2ed31fa06", "level": "warning", "message": {"text": "Frontend route `livret/organisation-suivi` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "7adef5480059838d", "scanner": "scanner-primary", "fingerprint": "c815cfd2ed31fa06", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-69230aca359bf1c5", "level": "warning", "message": {"text": "Frontend route `livret/entretien/:numero` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "c46950deba292bd9", "scanner": "scanner-primary", "fingerprint": "69230aca359bf1c5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4c402c5af36ae5e2", "level": "warning", "message": {"text": "Frontend route `livret/fiches-suivi` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "e7b40e87010ec973", "scanner": "scanner-primary", "fingerprint": "4c402c5af36ae5e2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7aa7c69c25280c5a", "level": "warning", "message": {"text": "Frontend route `livret/fiches-suivi/:ficheId` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "d317660b6c337337", "scanner": "scanner-primary", "fingerprint": "7aa7c69c25280c5a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-34a8d9f1a3f06bac", "level": "warning", "message": {"text": "Frontend route `livret/evaluation-finale` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "a85a53364aeaf8d6", "scanner": "scanner-primary", "fingerprint": "34a8d9f1a3f06bac", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f763efc2becc6e17", "level": "warning", "message": {"text": "Frontend route `livret/pronote` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "edf1ed2f0c74a10f", "scanner": "scanner-primary", "fingerprint": "f763efc2becc6e17", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4bc990a46d523ae6", "level": "warning", "message": {"text": "Frontend route `admin/utilisateurs` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "e6d5d50594ececb5", "scanner": "scanner-primary", "fingerprint": "4bc990a46d523ae6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2fe2d5f34e3ba6a5", "level": "warning", "message": {"text": "Frontend route `admin/import-utilisateurs` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "c130ea2efcfa1c46", "scanner": "scanner-primary", "fingerprint": "2fe2d5f34e3ba6a5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a0ec84d77c65fa2c", "level": "warning", "message": {"text": "Frontend route `admin/formations` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "b69eb34a6dcc7b5d", "scanner": "scanner-primary", "fingerprint": "a0ec84d77c65fa2c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8b351803dacf93b9", "level": "warning", "message": {"text": "Frontend route `admin/affectations` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "c4df387d7988662c", "scanner": "scanner-primary", "fingerprint": "8b351803dacf93b9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c79156cf6f214acc", "level": "warning", "message": {"text": "Frontend route `admin/referentiels` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "607ff4c2b8e545b5", "scanner": "scanner-primary", "fingerprint": "c79156cf6f214acc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-6bd05b58115351e5", "level": "warning", "message": {"text": "Frontend route `admin/banque-questions` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "097c71a2f5819130", "scanner": "scanner-primary", "fingerprint": "6bd05b58115351e5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3b7f926567d28ca5", "level": "warning", "message": {"text": "Frontend route `admin/etablissements` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "e8a5498857b029b7", "scanner": "scanner-primary", "fingerprint": "3b7f926567d28ca5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0623b35a8fafb962", "level": "warning", "message": {"text": "Frontend route `admin/attitudes` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "319de4e850507f62", "scanner": "scanner-primary", "fingerprint": "0623b35a8fafb962", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}]}]}