{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-23520d0aad6eef3f", "name": "Stray `console.log` in TS/JS \u2014 bertel-tourism-ui/scripts/generate-marker-pngs.ts:121", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 bertel-tourism-ui/scripts/generate-marker-pngs.ts:121"}, "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-4c35c6c407c93138", "name": "`truncate` class without `title=` for hover reveal \u2014 bertel-tourism-ui/src/components/layout/TopBar.tsx:76", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 bertel-tourism-ui/src/components/layout/TopBar.tsx:76"}, "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-c7639c9471723932", "name": "`truncate` class without `title=` for hover reveal \u2014 bertel-tourism-ui/src/components/explorer/ResultsList.tsx:139", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 bertel-tourism-ui/src/components/explorer/ResultsList.tsx:139"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-01fda5133262e607", "name": "Icon-only button without accessible name \u2014 bertel-tourism-ui/src/features/object-editor/primitives/StatCard.tsx:23", "shortDescription": {"text": "Icon-only button without accessible name \u2014 bertel-tourism-ui/src/features/object-editor/primitives/StatCard.tsx:23"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a38b050ae3afc459", "name": "TODO/FIXME marker in shipping code \u2014 bertel-tourism-ui/src/services/rpc.ts:446", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 bertel-tourism-ui/src/services/rpc.ts:446"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3adfc1e73197ceab", "name": "Dockerfile runs as root: docs/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: docs/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6f304fa1ab127c39", "name": "Docker base image is tag-pinned but not digest-pinned: nginx:alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: nginx:alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-92ca207dd1adc065", "name": "Dockerfile runs as root: bertel-tourism-ui/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: bertel-tourism-ui/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-33a984e57f1d238e", "name": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7981921d493fe639", "name": "Insecure pattern 'direct_innerhtml_assignment' in tools/db-graph/dbgraph/render.py:252", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tools/db-graph/dbgraph/render.py:252"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4970a2a579de086d", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/doc_api_bertel_v3.html:1571", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/doc_api_bertel_v3.html:1571"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ef38ba75789825d5", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/index.html:4887", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/index.html:4887"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2b93b7c0cf47c588", "name": "Insecure pattern 'node_child_process' in bertel-tourism-ui/scripts/run-e2e.mjs:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in bertel-tourism-ui/scripts/run-e2e.mjs:2"}, "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-e16ad9784f2987f8", "name": "Insecure pattern 'node_child_process' in bertel-tourism-ui/scripts/run-storybook.mjs:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in bertel-tourism-ui/scripts/run-storybook.mjs:2"}, "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-bc51c9aebe021f2d", "name": "Insecure pattern 'node_child_process' in bertel-tourism-ui/scripts/run-playwright.mjs:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in bertel-tourism-ui/scripts/run-playwright.mjs:2"}, "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-7b27c880196b3658", "name": "Insecure pattern 'node_child_process' in bertel-tourism-ui/scripts/run-supabase.mjs:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in bertel-tourism-ui/scripts/run-supabase.mjs:2"}, "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-2b5fca4816dd6185", "name": "Insecure pattern 'direct_innerhtml_assignment' in bertel-tourism-ui/src/utils/fly-to-selection.ts:33", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in bertel-tourism-ui/src/utils/fly-to-selection.ts:33"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1b4d02f2719088fb", "name": "Insecure pattern 'local_storage_auth_token' in bertel-tourism-ui/src/views/LoginPage.tsx:68", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in bertel-tourism-ui/src/views/LoginPage.tsx:68"}, "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-490e00ba1e4d7ba7", "name": "Insecure pattern 'document_write' in bertel-tourism-ui/src/components/explorer/SelectionBar.tsx:66", "shortDescription": {"text": "Insecure pattern 'document_write' in bertel-tourism-ui/src/components/explorer/SelectionBar.tsx:66"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0ac3644b65a17cfe", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "supabase/setup-cli@v1 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": "medium", "confidence": 1.0}}, {"id": "scanner-74212bce9a23c22c", "name": "Very large file: docs/Bertel_design_exemple/detail-types.jsx (1224 lines)", "shortDescription": {"text": "Very large file: docs/Bertel_design_exemple/detail-types.jsx (1224 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c9472787dbc194ac", "name": "Very large file: bertel-tourism-ui/src/components/explorer/FiltersPanel.tsx (1211 lines)", "shortDescription": {"text": "Very large file: bertel-tourism-ui/src/components/explorer/FiltersPanel.tsx (1211 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-88f215541416caef", "name": "Very large file: bertel-tourism-ui/src/features/object-drawer/ObjectDetailView.tsx (3541 lines)", "shortDescription": {"text": "Very large file: bertel-tourism-ui/src/features/object-drawer/ObjectDetailView.tsx (3541 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-78a3b7db9b6a3650", "name": "Very large file: bertel-tourism-ui/src/services/object-workspace.ts (5758 lines)", "shortDescription": {"text": "Very large file: bertel-tourism-ui/src/services/object-workspace.ts (5758 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-60470ba4e5e16c52", "name": "Very large file: bertel-tourism-ui/src/services/object-workspace-parser.ts (3113 lines)", "shortDescription": {"text": "Very large file: bertel-tourism-ui/src/services/object-workspace-parser.ts (3113 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 204 placeholder/mock markers across 57 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-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "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-909eb64265cce1c7", "name": "Agent authority lacks a verifier contract: .codex/hooks.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .codex/hooks.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d7064651e44f3b19", "name": "Commented-code block (6 lines) in docs/Bertel_design_exemple/design-canvas.jsx:2", "shortDescription": {"text": "Commented-code block (6 lines) in docs/Bertel_design_exemple/design-canvas.jsx:2"}, "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-06d265cf0ff3ac8c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 docs/Bertel_design_exemple/design-canvas.jsx:128", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 docs/Bertel_design_exemple/design-canvas.jsx:128"}, "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-a24024b2527efd91", "name": "Legacy-named symbol `sched__copy` in docs/Bertel_design_exemple/edit-type-blocks.jsx:52", "shortDescription": {"text": "Legacy-named symbol `sched__copy` in docs/Bertel_design_exemple/edit-type-blocks.jsx:52"}, "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-5bdf509baf9a517d", "name": "Commented-code block (7 lines) in docs/Bertel_design_exemple/tweaks-panel.jsx:12", "shortDescription": {"text": "Commented-code block (7 lines) in docs/Bertel_design_exemple/tweaks-panel.jsx:12"}, "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-b1d39682656f52d4", "name": "Commented-code block (5 lines) in bertel-tourism-ui/src/app/api/media/upload/route.ts:47", "shortDescription": {"text": "Commented-code block (5 lines) in bertel-tourism-ui/src/app/api/media/upload/route.ts:47"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c0a7dd23f1288841", "name": "Commented-code block (8 lines) in bertel-tourism-ui/src/app/api/media/upload/process-image.ts:56", "shortDescription": {"text": "Commented-code block (8 lines) in bertel-tourism-ui/src/app/api/media/upload/process-image.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-e9e39d6b6d11bbde", "name": "Commented-code block (5 lines) in bertel-tourism-ui/src/hooks/useDashboardQuery.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in bertel-tourism-ui/src/hooks/useDashboardQuery.ts:4"}, "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-3b8616db3caa2325", "name": "Commented-code block (5 lines) in bertel-tourism-ui/src/views/CrmPage.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in bertel-tourism-ui/src/views/CrmPage.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b226a33c3fddbffd", "name": "Legacy-named symbol `sched__copy` in bertel-tourism-ui/src/features/object-editor/primitives/ScheduleEditor.tsx:86", "shortDescription": {"text": "Legacy-named symbol `sched__copy` in bertel-tourism-ui/src/features/object-editor/primitives/ScheduleEditor.tsx:86"}, "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-c9e4646c2a61404c", "name": "Legacy-named symbol `overview__copy` in bertel-tourism-ui/src/features/object-drawer/ObjectDetailView.tsx:1217", "shortDescription": {"text": "Legacy-named symbol `overview__copy` in bertel-tourism-ui/src/features/object-drawer/ObjectDetailView.tsx:1217"}, "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-e39a5474804dfd35", "name": "Commented-code block (8 lines) in bertel-tourism-ui/src/features/crm/CrmActorFiche.tsx:3", "shortDescription": {"text": "Commented-code block (8 lines) in bertel-tourism-ui/src/features/crm/CrmActorFiche.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dd7afab84c1703fc", "name": "Commented-code block (6 lines) in bertel-tourism-ui/src/features/crm/CrmAnnuaire.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in bertel-tourism-ui/src/features/crm/CrmAnnuaire.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-98d2da984b820da8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 bertel-tourism-ui/src/features/crm/CrmAnnuaire.tsx:66", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 bertel-tourism-ui/src/features/crm/CrmAnnuaire.tsx:66"}, "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-9b6c1b7450545fca", "name": "`fetch()` without try/.catch or AbortSignal \u2014 bertel-tourism-ui/src/features/crm/CrmTimelineView.tsx:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 bertel-tourism-ui/src/features/crm/CrmTimelineView.tsx:63"}, "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-76d8f4302c0e7aba", "name": "Commented-code block (5 lines) in bertel-tourism-ui/src/features/crm/crm-primitives.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in bertel-tourism-ui/src/features/crm/crm-primitives.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b14db410c8271ef5", "name": "Commented-code block (7 lines) in bertel-tourism-ui/src/features/crm/CrmObjectView.tsx:3", "shortDescription": {"text": "Commented-code block (7 lines) in bertel-tourism-ui/src/features/crm/CrmObjectView.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6e9cbebfcf1d89ee", "name": "Commented-code block (5 lines) in bertel-tourism-ui/src/features/crm/crm-view-utils.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in bertel-tourism-ui/src/features/crm/crm-view-utils.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-3fe25541be7ba6f5", "name": "Commented-code block (6 lines) in bertel-tourism-ui/src/features/crm/CrmTaches.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in bertel-tourism-ui/src/features/crm/CrmTaches.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e116f84b2fd0a271", "name": "Commented-code block (5 lines) in bertel-tourism-ui/src/features/crm/CrmModal.tsx:3", "shortDescription": {"text": "Commented-code block (5 lines) in bertel-tourism-ui/src/features/crm/CrmModal.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c109c3113951dc2e", "name": "Commented-code block (6 lines) in bertel-tourism-ui/src/features/crm/CrmInteractionModal.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in bertel-tourism-ui/src/features/crm/CrmInteractionModal.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-82817f436da0704e", "name": "Commented-code block (17 lines) in bertel-tourism-ui/src/features/crm/CrmActorModals.tsx:3", "shortDescription": {"text": "Commented-code block (17 lines) in bertel-tourism-ui/src/features/crm/CrmActorModals.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-720829d5eceba04d", "name": "Commented-code block (11 lines) in bertel-tourism-ui/src/features/crm/CrmTaskModal.tsx:3", "shortDescription": {"text": "Commented-code block (11 lines) in bertel-tourism-ui/src/features/crm/CrmTaskModal.tsx:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a4583c950acc7af3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 bertel-tourism-ui/src/services/rbac.ts:95", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 bertel-tourism-ui/src/services/rbac.ts:95"}, "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-5c4d285234760454", "name": "Commented-code block (5 lines) in bertel-tourism-ui/src/services/crm.ts:725", "shortDescription": {"text": "Commented-code block (5 lines) in bertel-tourism-ui/src/services/crm.ts:725"}, "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-6e388375a2871724", "name": "Commented-code block (5 lines) in bertel-tourism-ui/src/services/object-workspace.ts:2320", "shortDescription": {"text": "Commented-code block (5 lines) in bertel-tourism-ui/src/services/object-workspace.ts:2320"}, "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-a8ee89637c769fea", "name": "Commented-code block (5 lines) in bertel-tourism-ui/src/services/rpc.ts:165", "shortDescription": {"text": "Commented-code block (5 lines) in bertel-tourism-ui/src/services/rpc.ts:165"}, "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-17fe9c8bd3404a39", "name": "Commented-code block (5 lines) in bertel-tourism-ui/src/services/object-workspace.itinerary.test.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in bertel-tourism-ui/src/services/object-workspace.itinerary.test.ts:4"}, "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-7af7ebd43e654915", "name": "Commented-code block (8 lines) in bertel-tourism-ui/src/services/object-workspace.distinctions.test.ts:3", "shortDescription": {"text": "Commented-code block (8 lines) in bertel-tourism-ui/src/services/object-workspace.distinctions.test.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d0b17c8c07a7421d", "name": "8 env vars used in code but missing from .env.example", "shortDescription": {"text": "8 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `BERTEL_STORYBOOK_HOME`, `BERTEL_SUPABASE_HOME`, `CI`, `PLAYWRIGHT_BASE_URL`, `PLAYWRIGHT_BROWSERS_PATH`, `PLAYWRIGHT_PORT`, `PLAYWRIGHT_SKIP_WEBSERVER`, `PORT`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/25493"}, "properties": {"repository": "D-OTIsud/Bertel", "repoUrl": "https://github.com/D-OTIsud/Bertel", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-23520d0aad6eef3f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 bertel-tourism-ui/scripts/generate-marker-pngs.ts:121"}, "properties": {"repobilityId": "8cfa1c6fbf0ef16f", "scanner": "scanner-primary", "fingerprint": "23520d0aad6eef3f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4c35c6c407c93138", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 bertel-tourism-ui/src/components/layout/TopBar.tsx:76"}, "properties": {"repobilityId": "c9b15ad961be3a63", "scanner": "scanner-primary", "fingerprint": "4c35c6c407c93138", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c7639c9471723932", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 bertel-tourism-ui/src/components/explorer/ResultsList.tsx:139"}, "properties": {"repobilityId": "4bc8b360fa619af6", "scanner": "scanner-primary", "fingerprint": "c7639c9471723932", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-01fda5133262e607", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 bertel-tourism-ui/src/features/object-editor/primitives/StatCard.tsx:23"}, "properties": {"repobilityId": "37f4080551ac40e8", "scanner": "scanner-primary", "fingerprint": "01fda5133262e607", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-a38b050ae3afc459", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 bertel-tourism-ui/src/services/rpc.ts:446"}, "properties": {"repobilityId": "a0b4ccf50467d814", "scanner": "scanner-primary", "fingerprint": "a38b050ae3afc459", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-3adfc1e73197ceab", "level": "warning", "message": {"text": "Dockerfile runs as root: docs/Dockerfile"}, "properties": {"repobilityId": "793f8cea6cb720aa", "scanner": "scanner-primary", "fingerprint": "3adfc1e73197ceab", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-6f304fa1ab127c39", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: nginx:alpine"}, "properties": {"repobilityId": "b1540069c6f4e6eb", "scanner": "scanner-primary", "fingerprint": "6f304fa1ab127c39", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-92ca207dd1adc065", "level": "warning", "message": {"text": "Dockerfile runs as root: bertel-tourism-ui/Dockerfile"}, "properties": {"repobilityId": "dfa19850faf9fd25", "scanner": "scanner-primary", "fingerprint": "92ca207dd1adc065", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-33a984e57f1d238e", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "676b003fc34b4022", "scanner": "scanner-primary", "fingerprint": "33a984e57f1d238e", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bertel-tourism-ui/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-33a984e57f1d238e", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "0179f4e30630f6b2", "scanner": "scanner-primary", "fingerprint": "33a984e57f1d238e", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bertel-tourism-ui/Dockerfile"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-7981921d493fe639", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tools/db-graph/dbgraph/render.py:252"}, "properties": {"repobilityId": "a7da1f3bd141d725", "scanner": "scanner-primary", "fingerprint": "7981921d493fe639", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/db-graph/dbgraph/render.py"}, "region": {"startLine": 252}}}]}, {"ruleId": "scanner-4970a2a579de086d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/doc_api_bertel_v3.html:1571"}, "properties": {"repobilityId": "3112d6563b491ebc", "scanner": "scanner-primary", "fingerprint": "4970a2a579de086d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/doc_api_bertel_v3.html"}, "region": {"startLine": 1571}}}]}, {"ruleId": "scanner-ef38ba75789825d5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/index.html:4887"}, "properties": {"repobilityId": "cba7363c134f7b1d", "scanner": "scanner-primary", "fingerprint": "ef38ba75789825d5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/index.html"}, "region": {"startLine": 4887}}}]}, {"ruleId": "scanner-2b93b7c0cf47c588", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in bertel-tourism-ui/scripts/run-e2e.mjs:2"}, "properties": {"repobilityId": "405446b73ba97743", "scanner": "scanner-primary", "fingerprint": "2b93b7c0cf47c588", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bertel-tourism-ui/scripts/run-e2e.mjs"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-e16ad9784f2987f8", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in bertel-tourism-ui/scripts/run-storybook.mjs:2"}, "properties": {"repobilityId": "c60b4e1415394703", "scanner": "scanner-primary", "fingerprint": "e16ad9784f2987f8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bertel-tourism-ui/scripts/run-storybook.mjs"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-bc51c9aebe021f2d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in bertel-tourism-ui/scripts/run-playwright.mjs:2"}, "properties": {"repobilityId": "d23592aec4d1d583", "scanner": "scanner-primary", "fingerprint": "bc51c9aebe021f2d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bertel-tourism-ui/scripts/run-playwright.mjs"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-7b27c880196b3658", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in bertel-tourism-ui/scripts/run-supabase.mjs:2"}, "properties": {"repobilityId": "d3bb1ba697e261d0", "scanner": "scanner-primary", "fingerprint": "7b27c880196b3658", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bertel-tourism-ui/scripts/run-supabase.mjs"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-2b5fca4816dd6185", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in bertel-tourism-ui/src/utils/fly-to-selection.ts:33"}, "properties": {"repobilityId": "0d9bc12688b449cc", "scanner": "scanner-primary", "fingerprint": "2b5fca4816dd6185", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bertel-tourism-ui/src/utils/fly-to-selection.ts"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-1b4d02f2719088fb", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in bertel-tourism-ui/src/views/LoginPage.tsx:68"}, "properties": {"repobilityId": "2832ac3afb4d8780", "scanner": "scanner-primary", "fingerprint": "1b4d02f2719088fb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bertel-tourism-ui/src/views/LoginPage.tsx"}, "region": {"startLine": 68}}}]}, {"ruleId": "scanner-490e00ba1e4d7ba7", "level": "note", "message": {"text": "Insecure pattern 'document_write' in bertel-tourism-ui/src/components/explorer/SelectionBar.tsx:66"}, "properties": {"repobilityId": "f1a1436c0eedccbd", "scanner": "scanner-primary", "fingerprint": "490e00ba1e4d7ba7", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "bertel-tourism-ui/src/components/explorer/SelectionBar.tsx"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-0ac3644b65a17cfe", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "cd7e34a9f734a216", "scanner": "scanner-primary", "fingerprint": "0ac3644b65a17cfe", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/sql-fresh-apply.yml"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-74212bce9a23c22c", "level": "note", "message": {"text": "Very large file: docs/Bertel_design_exemple/detail-types.jsx (1224 lines)"}, "properties": {"repobilityId": "056dde664eda09ac", "scanner": "scanner-primary", "fingerprint": "74212bce9a23c22c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c9472787dbc194ac", "level": "note", "message": {"text": "Very large file: bertel-tourism-ui/src/components/explorer/FiltersPanel.tsx (1211 lines)"}, "properties": {"repobilityId": "6a6f310c128a6799", "scanner": "scanner-primary", "fingerprint": "c9472787dbc194ac", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-88f215541416caef", "level": "note", "message": {"text": "Very large file: bertel-tourism-ui/src/features/object-drawer/ObjectDetailView.tsx (3541 lines)"}, "properties": {"repobilityId": "e04d230ea61def22", "scanner": "scanner-primary", "fingerprint": "88f215541416caef", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-78a3b7db9b6a3650", "level": "note", "message": {"text": "Very large file: bertel-tourism-ui/src/services/object-workspace.ts (5758 lines)"}, "properties": {"repobilityId": "c6a9fe0a0ba4f8a0", "scanner": "scanner-primary", "fingerprint": "78a3b7db9b6a3650", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-60470ba4e5e16c52", "level": "note", "message": {"text": "Very large file: bertel-tourism-ui/src/services/object-workspace-parser.ts (3113 lines)"}, "properties": {"repobilityId": "81a2c21c11cc7bae", "scanner": "scanner-primary", "fingerprint": "60470ba4e5e16c52", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "b66c2f3d71364ced", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "a00d67a5b9d4827d", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "f66e394842a4558d", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-909eb64265cce1c7", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .codex/hooks.json"}, "properties": {"repobilityId": "6befa6c7c9baca08", "scanner": "scanner-primary", "fingerprint": "909eb64265cce1c7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "codex_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".codex/hooks.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d7064651e44f3b19", "level": "none", "message": {"text": "Commented-code block (6 lines) in docs/Bertel_design_exemple/design-canvas.jsx:2"}, "properties": {"repobilityId": "258c6ecac1df20bc", "scanner": "scanner-primary", "fingerprint": "d7064651e44f3b19", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-06d265cf0ff3ac8c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 docs/Bertel_design_exemple/design-canvas.jsx:128"}, "properties": {"repobilityId": "be4d33cd3621bc16", "scanner": "scanner-primary", "fingerprint": "06d265cf0ff3ac8c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a24024b2527efd91", "level": "note", "message": {"text": "Legacy-named symbol `sched__copy` in docs/Bertel_design_exemple/edit-type-blocks.jsx:52"}, "properties": {"repobilityId": "44c5599cfdb59f94", "scanner": "scanner-primary", "fingerprint": "a24024b2527efd91", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5bdf509baf9a517d", "level": "none", "message": {"text": "Commented-code block (7 lines) in docs/Bertel_design_exemple/tweaks-panel.jsx:12"}, "properties": {"repobilityId": "7419b33dfec52458", "scanner": "scanner-primary", "fingerprint": "5bdf509baf9a517d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b1d39682656f52d4", "level": "none", "message": {"text": "Commented-code block (5 lines) in bertel-tourism-ui/src/app/api/media/upload/route.ts:47"}, "properties": {"repobilityId": "1cda11b22b9bbeeb", "scanner": "scanner-primary", "fingerprint": "b1d39682656f52d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c0a7dd23f1288841", "level": "none", "message": {"text": "Commented-code block (8 lines) in bertel-tourism-ui/src/app/api/media/upload/process-image.ts:56"}, "properties": {"repobilityId": "74d13e79808f89a0", "scanner": "scanner-primary", "fingerprint": "c0a7dd23f1288841", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e9e39d6b6d11bbde", "level": "none", "message": {"text": "Commented-code block (5 lines) in bertel-tourism-ui/src/hooks/useDashboardQuery.ts:4"}, "properties": {"repobilityId": "1a5f9d36c78ed24e", "scanner": "scanner-primary", "fingerprint": "e9e39d6b6d11bbde", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3b8616db3caa2325", "level": "none", "message": {"text": "Commented-code block (5 lines) in bertel-tourism-ui/src/views/CrmPage.tsx:3"}, "properties": {"repobilityId": "37c2aeb57147cb58", "scanner": "scanner-primary", "fingerprint": "3b8616db3caa2325", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b226a33c3fddbffd", "level": "note", "message": {"text": "Legacy-named symbol `sched__copy` in bertel-tourism-ui/src/features/object-editor/primitives/ScheduleEditor.tsx:86"}, "properties": {"repobilityId": "4e6736f0f99896bd", "scanner": "scanner-primary", "fingerprint": "b226a33c3fddbffd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c9e4646c2a61404c", "level": "note", "message": {"text": "Legacy-named symbol `overview__copy` in bertel-tourism-ui/src/features/object-drawer/ObjectDetailView.tsx:1217"}, "properties": {"repobilityId": "0ec5d92b1d5a9ceb", "scanner": "scanner-primary", "fingerprint": "c9e4646c2a61404c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e39a5474804dfd35", "level": "none", "message": {"text": "Commented-code block (8 lines) in bertel-tourism-ui/src/features/crm/CrmActorFiche.tsx:3"}, "properties": {"repobilityId": "3569d42d94452aee", "scanner": "scanner-primary", "fingerprint": "e39a5474804dfd35", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dd7afab84c1703fc", "level": "none", "message": {"text": "Commented-code block (6 lines) in bertel-tourism-ui/src/features/crm/CrmAnnuaire.tsx:3"}, "properties": {"repobilityId": "6f5e3b2768fe6aed", "scanner": "scanner-primary", "fingerprint": "dd7afab84c1703fc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-98d2da984b820da8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 bertel-tourism-ui/src/features/crm/CrmAnnuaire.tsx:66"}, "properties": {"repobilityId": "91a9730bd1977bbd", "scanner": "scanner-primary", "fingerprint": "98d2da984b820da8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9b6c1b7450545fca", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 bertel-tourism-ui/src/features/crm/CrmTimelineView.tsx:63"}, "properties": {"repobilityId": "402270aabfcba25a", "scanner": "scanner-primary", "fingerprint": "9b6c1b7450545fca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-76d8f4302c0e7aba", "level": "none", "message": {"text": "Commented-code block (5 lines) in bertel-tourism-ui/src/features/crm/crm-primitives.tsx:3"}, "properties": {"repobilityId": "b3191a9cbc4bf120", "scanner": "scanner-primary", "fingerprint": "76d8f4302c0e7aba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b14db410c8271ef5", "level": "none", "message": {"text": "Commented-code block (7 lines) in bertel-tourism-ui/src/features/crm/CrmObjectView.tsx:3"}, "properties": {"repobilityId": "95bf9c1aef1e07ae", "scanner": "scanner-primary", "fingerprint": "b14db410c8271ef5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6e9cbebfcf1d89ee", "level": "none", "message": {"text": "Commented-code block (5 lines) in bertel-tourism-ui/src/features/crm/crm-view-utils.ts:1"}, "properties": {"repobilityId": "6671e3944b4c676e", "scanner": "scanner-primary", "fingerprint": "6e9cbebfcf1d89ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3fe25541be7ba6f5", "level": "none", "message": {"text": "Commented-code block (6 lines) in bertel-tourism-ui/src/features/crm/CrmTaches.tsx:3"}, "properties": {"repobilityId": "cb22b790b93edbb6", "scanner": "scanner-primary", "fingerprint": "3fe25541be7ba6f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e116f84b2fd0a271", "level": "none", "message": {"text": "Commented-code block (5 lines) in bertel-tourism-ui/src/features/crm/CrmModal.tsx:3"}, "properties": {"repobilityId": "eebc716822daf057", "scanner": "scanner-primary", "fingerprint": "e116f84b2fd0a271", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c109c3113951dc2e", "level": "none", "message": {"text": "Commented-code block (6 lines) in bertel-tourism-ui/src/features/crm/CrmInteractionModal.tsx:3"}, "properties": {"repobilityId": "57594bb80f085ab8", "scanner": "scanner-primary", "fingerprint": "c109c3113951dc2e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-82817f436da0704e", "level": "none", "message": {"text": "Commented-code block (17 lines) in bertel-tourism-ui/src/features/crm/CrmActorModals.tsx:3"}, "properties": {"repobilityId": "036fab8afa6be916", "scanner": "scanner-primary", "fingerprint": "82817f436da0704e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-720829d5eceba04d", "level": "none", "message": {"text": "Commented-code block (11 lines) in bertel-tourism-ui/src/features/crm/CrmTaskModal.tsx:3"}, "properties": {"repobilityId": "230da8a2ce7b46dd", "scanner": "scanner-primary", "fingerprint": "720829d5eceba04d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a4583c950acc7af3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 bertel-tourism-ui/src/services/rbac.ts:95"}, "properties": {"repobilityId": "d5e12b6785bc0953", "scanner": "scanner-primary", "fingerprint": "a4583c950acc7af3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5c4d285234760454", "level": "none", "message": {"text": "Commented-code block (5 lines) in bertel-tourism-ui/src/services/crm.ts:725"}, "properties": {"repobilityId": "99434aef22ed0a44", "scanner": "scanner-primary", "fingerprint": "5c4d285234760454", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6e388375a2871724", "level": "none", "message": {"text": "Commented-code block (5 lines) in bertel-tourism-ui/src/services/object-workspace.ts:2320"}, "properties": {"repobilityId": "2967d8293fe8fd48", "scanner": "scanner-primary", "fingerprint": "6e388375a2871724", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a8ee89637c769fea", "level": "none", "message": {"text": "Commented-code block (5 lines) in bertel-tourism-ui/src/services/rpc.ts:165"}, "properties": {"repobilityId": "8e1368794e3b5c3c", "scanner": "scanner-primary", "fingerprint": "a8ee89637c769fea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-17fe9c8bd3404a39", "level": "none", "message": {"text": "Commented-code block (5 lines) in bertel-tourism-ui/src/services/object-workspace.itinerary.test.ts:4"}, "properties": {"repobilityId": "1a00c5d7d17563a5", "scanner": "scanner-primary", "fingerprint": "17fe9c8bd3404a39", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7af7ebd43e654915", "level": "none", "message": {"text": "Commented-code block (8 lines) in bertel-tourism-ui/src/services/object-workspace.distinctions.test.ts:3"}, "properties": {"repobilityId": "fc10dfee635cd589", "scanner": "scanner-primary", "fingerprint": "7af7ebd43e654915", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d0b17c8c07a7421d", "level": "note", "message": {"text": "8 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "17fe720e8247f9df", "scanner": "scanner-primary", "fingerprint": "d0b17c8c07a7421d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}