{"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-81489ced0d7a0cff", "name": "Stray `console.log` in TS/JS \u2014 client/src/network/SocketManager.ts:221", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 client/src/network/SocketManager.ts:221"}, "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-46cabc21780cda51", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/HUD.tsx:155", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/HUD.tsx:155"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-da3a81353a74ae81", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/ScreenViewer.tsx:150", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/ScreenViewer.tsx:150"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-80eadad1daeaa8d0", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/RaceHud.tsx:121", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/RaceHud.tsx:121"}, "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-33df6f6c10802b9d", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/VideoBar.tsx:332", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/VideoBar.tsx:332"}, "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-b4d6bac93607dad3", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/LinkModal.tsx:57", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/LinkModal.tsx:57"}, "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-3681524d9d8ae498", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/DmToasts.tsx:76", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/DmToasts.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-e6a5d755e4890da3", "name": "TODO/FIXME marker in shipping code \u2014 client/src/react/components/KanbanModal.tsx:24", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 client/src/react/components/KanbanModal.tsx:24"}, "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-b7c051f8c7fbbd23", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/AvControls.tsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/AvControls.tsx:196"}, "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-ebb005b2011f8826", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/ChatPanel.tsx:304", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/ChatPanel.tsx:304"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4eaf70b1de8b0d04", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/AdminPanel.tsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/AdminPanel.tsx:177"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0c9ab0c324252990", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/WorkstationPanel.tsx:132", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/WorkstationPanel.tsx:132"}, "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-3440d293f29ae3d5", "name": "Stray `console.log` in TS/JS \u2014 server/dist.backup-20260527-004821/index.js:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/dist.backup-20260527-004821/index.js:24"}, "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-70b600c8ca9d2982", "name": "TODO/FIXME marker in shipping code \u2014 server/dist.backup-20260527-004821/kanban/KanbanStore.js:110", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 server/dist.backup-20260527-004821/kanban/KanbanStore.js:110"}, "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-5768835079c96d5b", "name": "Custom React Flow node registered without explicit width/height \u2014 server/dist.backup-20260527-004821/rooms/RoomManager.j", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 server/dist.backup-20260527-004821/rooms/RoomManager.js:16"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-10457168677f5e52", "name": "Stray `console.log` in TS/JS \u2014 server/dist.backup-20260527-012656/index.js:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/dist.backup-20260527-012656/index.js:28"}, "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-ae57370614cafa74", "name": "TODO/FIXME marker in shipping code \u2014 server/dist.backup-20260527-012656/kanban/KanbanStore.js:110", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 server/dist.backup-20260527-012656/kanban/KanbanStore.js:110"}, "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-7ee293082a528706", "name": "Stray `console.log` in TS/JS \u2014 server/dist.backup-20260527-012656/uploads/uploadsCleanup.js:61", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/dist.backup-20260527-012656/uploads/uploadsCleanup.js:61"}, "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-a4d00b3738aaed7e", "name": "Custom React Flow node registered without explicit width/height \u2014 server/dist.backup-20260527-012656/rooms/RoomManager.j", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 server/dist.backup-20260527-012656/rooms/RoomManager.js:21"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6f76f42c5c015b72", "name": "Stray `console.log` in TS/JS \u2014 server/dist.backup-20260526-231715/index.js:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/dist.backup-20260526-231715/index.js:24"}, "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-85c431a5b39c4d7d", "name": "TODO/FIXME marker in shipping code \u2014 server/dist.backup-20260526-231715/kanban/KanbanStore.js:96", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 server/dist.backup-20260526-231715/kanban/KanbanStore.js:96"}, "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-dea4f5a30aafe7ca", "name": "Custom React Flow node registered without explicit width/height \u2014 server/dist.backup-20260526-231715/rooms/RoomManager.j", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 server/dist.backup-20260526-231715/rooms/RoomManager.js:15"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9205222d34374e3b", "name": "Stray `console.log` in TS/JS \u2014 server/dist.backup-20260526-204657/index.js:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/dist.backup-20260526-204657/index.js:24"}, "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-fce61c2976c6fe0f", "name": "Custom React Flow node registered without explicit width/height \u2014 server/dist.backup-20260526-204657/rooms/RoomManager.j", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 server/dist.backup-20260526-204657/rooms/RoomManager.js:15"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2cf3fa6c75297f62", "name": "Stray `console.log` in TS/JS \u2014 server/dist.bak-20260516-031707/index.js:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/dist.bak-20260516-031707/index.js:24"}, "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-14fe75eac56f36b5", "name": "Custom React Flow node registered without explicit width/height \u2014 server/dist.bak-20260516-031707/rooms/RoomManager.js:1", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 server/dist.bak-20260516-031707/rooms/RoomManager.js:15"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-79c627afd4c6f8b1", "name": "Stray `console.log` in TS/JS \u2014 server/src/index.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/index.ts:35"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9a941a51310b72d7", "name": "TODO/FIXME marker in shipping code \u2014 server/src/kanban/KanbanStore.ts:112", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 server/src/kanban/KanbanStore.ts:112"}, "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-4c088e571c6ec779", "name": "Stray `console.log` in TS/JS \u2014 server/src/uploads/uploadsCleanup.ts:61", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/uploads/uploadsCleanup.ts:61"}, "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-ad8e04a6932afe59", "name": "Stray `console.log` in TS/JS \u2014 server/src/pocketbase/migrate.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/pocketbase/migrate.ts:41"}, "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-3ab1eb30631ad561", "name": "Custom React Flow node registered without explicit width/height \u2014 server/src/rooms/RoomManager.ts:55", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 server/src/rooms/RoomManager.ts:55"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-860ca59d0d1b7553", "name": "Runtime dotenv file present in repo: client/.env.production", "shortDescription": {"text": "Runtime dotenv file present in repo: client/.env.production"}, "fullDescription": {"text": "`client/.env.production` looks like a runtime dotenv file. No high-confidence secret value was matched, but runtime dotenv files often drift into live credentials. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d7c2a30c80e5b5d6", "name": "Insecure pattern 'direct_innerhtml_assignment' in webinti-town-teaser.html:1533", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in webinti-town-teaser.html:1533"}, "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-967960baebaa7e87", "name": "Insecure pattern 'direct_innerhtml_assignment' in landing/site.js:55", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in landing/site.js:55"}, "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-779df84a0094d4be", "name": "Insecure pattern 'direct_innerhtml_assignment' in landing/fonctionnalites.html:244", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in landing/fonctionnalites.html:244"}, "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-b2fc1a2c1a700453", "name": "Insecure pattern 'direct_innerhtml_assignment' in landing/index.html:333", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in landing/index.html:333"}, "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-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-8a4ce94036098525", "name": "Very large file: client/src/phaser/scenes/GameScene.ts (1306 lines)", "shortDescription": {"text": "Very large file: client/src/phaser/scenes/GameScene.ts (1306 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-033f11a77ff2899b", "name": "Very large file: server/src/socket/handlers.ts (1370 lines)", "shortDescription": {"text": "Very large file: server/src/socket/handlers.ts (1370 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-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "20 tests / 175 src (ratio 0.11)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "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-faccb9061e9b52a0", "name": "No README detected", "shortDescription": {"text": "No README detected"}, "fullDescription": {"text": "No README file was found. Generated repos without README context are hard to operate, validate, or safely hand off."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1a6aeb84f8544549", "name": "Node manifest has dependencies but no lockfile: client/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: client/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d7101ca1926e3342", "name": "Node manifest has dependencies but no lockfile: server/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: server/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 54 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 15 placeholder/mock markers across 8 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, operator-readme, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-106f495abb956a78", "name": "Commented-code block (6 lines) in client/scripts/officePoc.mjs:28", "shortDescription": {"text": "Commented-code block (6 lines) in client/scripts/officePoc.mjs:28"}, "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-95df2fbf53c50b68", "name": "Commented-code block (5 lines) in client/scripts/gen-reception.mjs:1", "shortDescription": {"text": "Commented-code block (5 lines) in client/scripts/gen-reception.mjs: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-d08b8293d0450967", "name": "Commented-code block (5 lines) in client/scripts/gen-garage.mjs:1", "shortDescription": {"text": "Commented-code block (5 lines) in client/scripts/gen-garage.mjs: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-85e58e00e5a835df", "name": "Commented-code block (5 lines) in client/src/pocketbase.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in client/src/pocketbase.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-559ea26ed9463961", "name": "Commented-code block (5 lines) in client/src/phaser/OfficeStatusOverlay.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in client/src/phaser/OfficeStatusOverlay.ts:5"}, "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-5900c28abff3cc4e", "name": "Commented-code block (7 lines) in client/src/phaser/scenes/GameScene.ts:372", "shortDescription": {"text": "Commented-code block (7 lines) in client/src/phaser/scenes/GameScene.ts:372"}, "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-487ef497c36efaab", "name": "Commented-code block (7 lines) in client/src/phaser/scenes/BootScene.ts:59", "shortDescription": {"text": "Commented-code block (7 lines) in client/src/phaser/scenes/BootScene.ts:59"}, "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-030c912907bac89e", "name": "Commented-code block (6 lines) in client/src/react/components/ScreenViewer.tsx:28", "shortDescription": {"text": "Commented-code block (6 lines) in client/src/react/components/ScreenViewer.tsx:28"}, "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-dc0d41ae439e78e6", "name": "Commented-code block (6 lines) in client/src/livekit/LiveKitManager.ts:80", "shortDescription": {"text": "Commented-code block (6 lines) in client/src/livekit/LiveKitManager.ts:80"}, "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-098d5ee009ab285a", "name": "Commented-code block (5 lines) in server/src/circuit.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/circuit.ts:8"}, "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-9b32990160cffc6b", "name": "Commented-code block (7 lines) in server/src/workstations.ts:23", "shortDescription": {"text": "Commented-code block (7 lines) in server/src/workstations.ts:23"}, "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-deb4fac37ffe518f", "name": "Commented-code block (5 lines) in server/src/socket/handlers.ts:275", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/socket/handlers.ts:275"}, "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-cc7f8b97c41e1021", "name": "Commented-code block (5 lines) in server/src/pocketbase/migrate.ts:50", "shortDescription": {"text": "Commented-code block (5 lines) in server/src/pocketbase/migrate.ts:50"}, "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-533413b87eee8af2", "name": "Commented-code block (8 lines) in server/src/race/RaceManager.ts:3", "shortDescription": {"text": "Commented-code block (8 lines) in server/src/race/RaceManager.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-b0b5e7cb1208a7cd", "name": "13 env vars used in code but missing from .env.example", "shortDescription": {"text": "13 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `BASE_URL`, `DM_BACKEND`, `HOST_EMAIL`, `KANBAN_BACKEND`, `MESSAGE_TTL_MS`, `OPENROUTER_API_KEY`, `POCKETBASE_ADMIN_EMAIL`, `POCKETBASE_ADMIN_PASSWORD` + 5 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-50470c40a321ef69", "name": "Dangling fetch: POST /api/uploads/${currentRoomSlug} (client/src/react/components/ChatPanel.tsx:155)", "shortDescription": {"text": "Dangling fetch: POST /api/uploads/${currentRoomSlug} (client/src/react/components/ChatPanel.tsx:155)"}, "fullDescription": {"text": "`client/src/react/components/ChatPanel.tsx:155` calls `POST /api/uploads/${currentRoomSlug}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/uploads/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dde3adb27bf7eebe", "name": "Unused endpoint: USE /api", "shortDescription": {"text": "Unused endpoint: USE /api"}, "fullDescription": {"text": "`server/dist.backup-20260527-004821/index.js` declares `USE /api` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5c3fc18a0ac2e6cb", "name": "Unused endpoint: POST /rooms", "shortDescription": {"text": "Unused endpoint: POST /rooms"}, "fullDescription": {"text": "`server/dist.backup-20260527-004821/api/routes.js` declares `POST /rooms` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7d2feb911c3bafdc", "name": "Unused endpoint: GET /rooms/:slug", "shortDescription": {"text": "Unused endpoint: GET /rooms/:slug"}, "fullDescription": {"text": "`server/dist.backup-20260527-004821/api/routes.js` declares `GET /rooms/:slug` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b8bb0f49fa79a962", "name": "Unused endpoint: POST /livekit/token", "shortDescription": {"text": "Unused endpoint: POST /livekit/token"}, "fullDescription": {"text": "`server/dist.backup-20260527-004821/api/routes.js` declares `POST /livekit/token` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-84bd4c31da0619b1", "name": "Unused endpoint: USE /api/uploads", "shortDescription": {"text": "Unused endpoint: USE /api/uploads"}, "fullDescription": {"text": "`server/dist.backup-20260527-012656/index.js` declares `USE /api/uploads` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-44ac51bdbf0b9d68", "name": "Unused endpoint: POST /:roomSlug", "shortDescription": {"text": "Unused endpoint: POST /:roomSlug"}, "fullDescription": {"text": "`server/dist.backup-20260527-012656/uploads/uploadsRouter.js` declares `POST /:roomSlug` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-520c0f0770e2dad8", "name": "Unused endpoint: GET /:roomSlug/:filename", "shortDescription": {"text": "Unused endpoint: GET /:roomSlug/:filename"}, "fullDescription": {"text": "`server/dist.backup-20260527-012656/uploads/uploadsRouter.js` declares `GET /:roomSlug/:filename` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/22616"}, "properties": {"repository": "webinti/webinti-town", "repoUrl": "https://github.com/webinti/webinti-town", "branch": "main"}, "results": [{"ruleId": "scanner-81489ced0d7a0cff", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 client/src/network/SocketManager.ts:221"}, "properties": {"repobilityId": "88c9b19547e0899e", "scanner": "scanner-primary", "fingerprint": "81489ced0d7a0cff", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-46cabc21780cda51", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/HUD.tsx:155"}, "properties": {"repobilityId": "847db41fe12a014a", "scanner": "scanner-primary", "fingerprint": "46cabc21780cda51", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-da3a81353a74ae81", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/ScreenViewer.tsx:150"}, "properties": {"repobilityId": "c4177fbd12d83db1", "scanner": "scanner-primary", "fingerprint": "da3a81353a74ae81", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-80eadad1daeaa8d0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/RaceHud.tsx:121"}, "properties": {"repobilityId": "2b32c68205a28ccd", "scanner": "scanner-primary", "fingerprint": "80eadad1daeaa8d0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-33df6f6c10802b9d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/VideoBar.tsx:332"}, "properties": {"repobilityId": "a84c6bd87a47cb83", "scanner": "scanner-primary", "fingerprint": "33df6f6c10802b9d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b4d6bac93607dad3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/LinkModal.tsx:57"}, "properties": {"repobilityId": "cc4c546b71f7508a", "scanner": "scanner-primary", "fingerprint": "b4d6bac93607dad3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3681524d9d8ae498", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/DmToasts.tsx:76"}, "properties": {"repobilityId": "4fdd8c388a45507c", "scanner": "scanner-primary", "fingerprint": "3681524d9d8ae498", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e6a5d755e4890da3", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 client/src/react/components/KanbanModal.tsx:24"}, "properties": {"repobilityId": "346bd9699ae37723", "scanner": "scanner-primary", "fingerprint": "e6a5d755e4890da3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-b7c051f8c7fbbd23", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/AvControls.tsx:196"}, "properties": {"repobilityId": "b662853d883a736e", "scanner": "scanner-primary", "fingerprint": "b7c051f8c7fbbd23", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ebb005b2011f8826", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/ChatPanel.tsx:304"}, "properties": {"repobilityId": "eb341eb265905cc3", "scanner": "scanner-primary", "fingerprint": "ebb005b2011f8826", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4eaf70b1de8b0d04", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/AdminPanel.tsx:177"}, "properties": {"repobilityId": "efb174bb96e043a1", "scanner": "scanner-primary", "fingerprint": "4eaf70b1de8b0d04", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0c9ab0c324252990", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/react/components/WorkstationPanel.tsx:132"}, "properties": {"repobilityId": "42164ab1f1830f58", "scanner": "scanner-primary", "fingerprint": "0c9ab0c324252990", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3440d293f29ae3d5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/dist.backup-20260527-004821/index.js:24"}, "properties": {"repobilityId": "828dee319b0a2794", "scanner": "scanner-primary", "fingerprint": "3440d293f29ae3d5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-70b600c8ca9d2982", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 server/dist.backup-20260527-004821/kanban/KanbanStore.js:110"}, "properties": {"repobilityId": "6c437c5f0dd5f53c", "scanner": "scanner-primary", "fingerprint": "70b600c8ca9d2982", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-5768835079c96d5b", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 server/dist.backup-20260527-004821/rooms/RoomManager.js:16"}, "properties": {"repobilityId": "fe1d64bdb961ee7b", "scanner": "scanner-primary", "fingerprint": "5768835079c96d5b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-10457168677f5e52", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/dist.backup-20260527-012656/index.js:28"}, "properties": {"repobilityId": "6b2db9ca3262f4e6", "scanner": "scanner-primary", "fingerprint": "10457168677f5e52", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ae57370614cafa74", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 server/dist.backup-20260527-012656/kanban/KanbanStore.js:110"}, "properties": {"repobilityId": "692351373985af71", "scanner": "scanner-primary", "fingerprint": "ae57370614cafa74", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-7ee293082a528706", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/dist.backup-20260527-012656/uploads/uploadsCleanup.js:61"}, "properties": {"repobilityId": "89b8a5a1b86ef5b7", "scanner": "scanner-primary", "fingerprint": "7ee293082a528706", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a4d00b3738aaed7e", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 server/dist.backup-20260527-012656/rooms/RoomManager.js:21"}, "properties": {"repobilityId": "06f350811965ed29", "scanner": "scanner-primary", "fingerprint": "a4d00b3738aaed7e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-6f76f42c5c015b72", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/dist.backup-20260526-231715/index.js:24"}, "properties": {"repobilityId": "8b70b290de418b2d", "scanner": "scanner-primary", "fingerprint": "6f76f42c5c015b72", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-85c431a5b39c4d7d", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 server/dist.backup-20260526-231715/kanban/KanbanStore.js:96"}, "properties": {"repobilityId": "8f8ef8acf8767cba", "scanner": "scanner-primary", "fingerprint": "85c431a5b39c4d7d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-dea4f5a30aafe7ca", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 server/dist.backup-20260526-231715/rooms/RoomManager.js:15"}, "properties": {"repobilityId": "b50d254d22424d3c", "scanner": "scanner-primary", "fingerprint": "dea4f5a30aafe7ca", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-9205222d34374e3b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/dist.backup-20260526-204657/index.js:24"}, "properties": {"repobilityId": "a73a784bb4976e7b", "scanner": "scanner-primary", "fingerprint": "9205222d34374e3b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fce61c2976c6fe0f", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 server/dist.backup-20260526-204657/rooms/RoomManager.js:15"}, "properties": {"repobilityId": "1ad0ba8b3547e6af", "scanner": "scanner-primary", "fingerprint": "fce61c2976c6fe0f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-2cf3fa6c75297f62", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/dist.bak-20260516-031707/index.js:24"}, "properties": {"repobilityId": "fadb1708733cf5eb", "scanner": "scanner-primary", "fingerprint": "2cf3fa6c75297f62", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-14fe75eac56f36b5", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 server/dist.bak-20260516-031707/rooms/RoomManager.js:15"}, "properties": {"repobilityId": "79bd8374ab4f6433", "scanner": "scanner-primary", "fingerprint": "14fe75eac56f36b5", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-79c627afd4c6f8b1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/index.ts:35"}, "properties": {"repobilityId": "966123b8e19cb728", "scanner": "scanner-primary", "fingerprint": "79c627afd4c6f8b1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9a941a51310b72d7", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 server/src/kanban/KanbanStore.ts:112"}, "properties": {"repobilityId": "9a6c41408862b2f7", "scanner": "scanner-primary", "fingerprint": "9a941a51310b72d7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-4c088e571c6ec779", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/uploads/uploadsCleanup.ts:61"}, "properties": {"repobilityId": "a7844763022f47ea", "scanner": "scanner-primary", "fingerprint": "4c088e571c6ec779", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ad8e04a6932afe59", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/pocketbase/migrate.ts:41"}, "properties": {"repobilityId": "7d7d4b12c6e74efc", "scanner": "scanner-primary", "fingerprint": "ad8e04a6932afe59", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3ab1eb30631ad561", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 server/src/rooms/RoomManager.ts:55"}, "properties": {"repobilityId": "c6e1b73096512b94", "scanner": "scanner-primary", "fingerprint": "3ab1eb30631ad561", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-860ca59d0d1b7553", "level": "error", "message": {"text": "Runtime dotenv file present in repo: client/.env.production"}, "properties": {"repobilityId": "ba10706fc4e1197b", "scanner": "scanner-primary", "fingerprint": "860ca59d0d1b7553", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "client/.env.production"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d7c2a30c80e5b5d6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in webinti-town-teaser.html:1533"}, "properties": {"repobilityId": "f09c528ccbc586ba", "scanner": "scanner-primary", "fingerprint": "d7c2a30c80e5b5d6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "webinti-town-teaser.html"}, "region": {"startLine": 1533}}}]}, {"ruleId": "scanner-967960baebaa7e87", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in landing/site.js:55"}, "properties": {"repobilityId": "1d6ea58ac3a12016", "scanner": "scanner-primary", "fingerprint": "967960baebaa7e87", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "landing/site.js"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-779df84a0094d4be", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in landing/fonctionnalites.html:244"}, "properties": {"repobilityId": "0e219f46cab2b696", "scanner": "scanner-primary", "fingerprint": "779df84a0094d4be", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "landing/fonctionnalites.html"}, "region": {"startLine": 244}}}]}, {"ruleId": "scanner-b2fc1a2c1a700453", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in landing/index.html:333"}, "properties": {"repobilityId": "e521b5b108cf58d5", "scanner": "scanner-primary", "fingerprint": "b2fc1a2c1a700453", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "landing/index.html"}, "region": {"startLine": 333}}}]}, {"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-8a4ce94036098525", "level": "note", "message": {"text": "Very large file: client/src/phaser/scenes/GameScene.ts (1306 lines)"}, "properties": {"repobilityId": "0f55e3efeff12828", "scanner": "scanner-primary", "fingerprint": "8a4ce94036098525", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-033f11a77ff2899b", "level": "note", "message": {"text": "Very large file: server/src/socket/handlers.ts (1370 lines)"}, "properties": {"repobilityId": "e8bcead3e04b8274", "scanner": "scanner-primary", "fingerprint": "033f11a77ff2899b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "1c99b5fe9ea7e6e8", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-faccb9061e9b52a0", "level": "note", "message": {"text": "No README detected"}, "properties": {"repobilityId": "2c361635fa9beac3", "scanner": "scanner-primary", "fingerprint": "faccb9061e9b52a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-1a6aeb84f8544549", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: client/package.json"}, "properties": {"repobilityId": "289cda4e29a77d84", "scanner": "scanner-primary", "fingerprint": "1a6aeb84f8544549", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "client/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d7101ca1926e3342", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: server/package.json"}, "properties": {"repobilityId": "bbcd0a89809ced91", "scanner": "scanner-primary", "fingerprint": "d7101ca1926e3342", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "10cb56aaf0b16e46", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "bc128158958250db", "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": "a36983b4e20e6270", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "cfe91c037515ccda", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "e37c16747f4e41bc", "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": "62df3d80859ab157", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-106f495abb956a78", "level": "none", "message": {"text": "Commented-code block (6 lines) in client/scripts/officePoc.mjs:28"}, "properties": {"repobilityId": "5455d1111ecea471", "scanner": "scanner-primary", "fingerprint": "106f495abb956a78", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-95df2fbf53c50b68", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/scripts/gen-reception.mjs:1"}, "properties": {"repobilityId": "c035da2ea0b0ff68", "scanner": "scanner-primary", "fingerprint": "95df2fbf53c50b68", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d08b8293d0450967", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/scripts/gen-garage.mjs:1"}, "properties": {"repobilityId": "d730b2d3de33b528", "scanner": "scanner-primary", "fingerprint": "d08b8293d0450967", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-85e58e00e5a835df", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/src/pocketbase.ts:3"}, "properties": {"repobilityId": "014c1a26de2574d9", "scanner": "scanner-primary", "fingerprint": "85e58e00e5a835df", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-559ea26ed9463961", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/src/phaser/OfficeStatusOverlay.ts:5"}, "properties": {"repobilityId": "5f4df847073df5b4", "scanner": "scanner-primary", "fingerprint": "559ea26ed9463961", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5900c28abff3cc4e", "level": "none", "message": {"text": "Commented-code block (7 lines) in client/src/phaser/scenes/GameScene.ts:372"}, "properties": {"repobilityId": "e2232569cc4d03cc", "scanner": "scanner-primary", "fingerprint": "5900c28abff3cc4e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-487ef497c36efaab", "level": "none", "message": {"text": "Commented-code block (7 lines) in client/src/phaser/scenes/BootScene.ts:59"}, "properties": {"repobilityId": "256b1003a2c2e82c", "scanner": "scanner-primary", "fingerprint": "487ef497c36efaab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-030c912907bac89e", "level": "none", "message": {"text": "Commented-code block (6 lines) in client/src/react/components/ScreenViewer.tsx:28"}, "properties": {"repobilityId": "38e6293e5e51b98f", "scanner": "scanner-primary", "fingerprint": "030c912907bac89e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dc0d41ae439e78e6", "level": "none", "message": {"text": "Commented-code block (6 lines) in client/src/livekit/LiveKitManager.ts:80"}, "properties": {"repobilityId": "af87cd48c9f6e38b", "scanner": "scanner-primary", "fingerprint": "dc0d41ae439e78e6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-098d5ee009ab285a", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/circuit.ts:8"}, "properties": {"repobilityId": "c3d95a105255111c", "scanner": "scanner-primary", "fingerprint": "098d5ee009ab285a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9b32990160cffc6b", "level": "none", "message": {"text": "Commented-code block (7 lines) in server/src/workstations.ts:23"}, "properties": {"repobilityId": "d5052cc8da524ae2", "scanner": "scanner-primary", "fingerprint": "9b32990160cffc6b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-deb4fac37ffe518f", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/socket/handlers.ts:275"}, "properties": {"repobilityId": "0552e46046af40c8", "scanner": "scanner-primary", "fingerprint": "deb4fac37ffe518f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cc7f8b97c41e1021", "level": "none", "message": {"text": "Commented-code block (5 lines) in server/src/pocketbase/migrate.ts:50"}, "properties": {"repobilityId": "7e2a17042a4748cc", "scanner": "scanner-primary", "fingerprint": "cc7f8b97c41e1021", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-533413b87eee8af2", "level": "none", "message": {"text": "Commented-code block (8 lines) in server/src/race/RaceManager.ts:3"}, "properties": {"repobilityId": "9a63240f9e28892b", "scanner": "scanner-primary", "fingerprint": "533413b87eee8af2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b0b5e7cb1208a7cd", "level": "note", "message": {"text": "13 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "2737b8666c1f7eeb", "scanner": "scanner-primary", "fingerprint": "b0b5e7cb1208a7cd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-50470c40a321ef69", "level": "error", "message": {"text": "Dangling fetch: POST /api/uploads/${currentRoomSlug} (client/src/react/components/ChatPanel.tsx:155)"}, "properties": {"repobilityId": "2ee1ec4d8d073d33", "scanner": "scanner-primary", "fingerprint": "50470c40a321ef69", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dde3adb27bf7eebe", "level": "note", "message": {"text": "Unused endpoint: USE /api"}, "properties": {"repobilityId": "9f70dac4e4e3a86e", "scanner": "scanner-primary", "fingerprint": "dde3adb27bf7eebe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5c3fc18a0ac2e6cb", "level": "note", "message": {"text": "Unused endpoint: POST /rooms"}, "properties": {"repobilityId": "ad51f3525fac30dd", "scanner": "scanner-primary", "fingerprint": "5c3fc18a0ac2e6cb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7d2feb911c3bafdc", "level": "note", "message": {"text": "Unused endpoint: GET /rooms/:slug"}, "properties": {"repobilityId": "9995202fbe26088b", "scanner": "scanner-primary", "fingerprint": "7d2feb911c3bafdc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b8bb0f49fa79a962", "level": "note", "message": {"text": "Unused endpoint: POST /livekit/token"}, "properties": {"repobilityId": "3684b4a9a62bca2c", "scanner": "scanner-primary", "fingerprint": "b8bb0f49fa79a962", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-84bd4c31da0619b1", "level": "note", "message": {"text": "Unused endpoint: USE /api/uploads"}, "properties": {"repobilityId": "b946a7a275f1a72b", "scanner": "scanner-primary", "fingerprint": "84bd4c31da0619b1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-44ac51bdbf0b9d68", "level": "note", "message": {"text": "Unused endpoint: POST /:roomSlug"}, "properties": {"repobilityId": "40d1d58415bfb454", "scanner": "scanner-primary", "fingerprint": "44ac51bdbf0b9d68", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-520c0f0770e2dad8", "level": "note", "message": {"text": "Unused endpoint: GET /:roomSlug/:filename"}, "properties": {"repobilityId": "6fd4b65e457729db", "scanner": "scanner-primary", "fingerprint": "520c0f0770e2dad8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}