{"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-415d09b43b4277ac", "name": "Stray `console.log` in TS/JS \u2014 scripts/simulate-bot-balance.ts:196", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/simulate-bot-balance.ts:196"}, "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-9710c8d059e53154", "name": "No frontend routes/components detected", "shortDescription": {"text": "No frontend routes/components detected"}, "fullDescription": {"text": "No React/Vue/Next routes were found. This is fine for backend-only repos."}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fa560b60b4eab555", "name": "Insecure pattern 'node_child_process' in scripts/tunnel.mjs:9", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/tunnel.mjs:9"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0af7f7dd58927477", "name": "Very large file: apps/web/src/screens/OikosApp.tsx (4057 lines)", "shortDescription": {"text": "Very large file: apps/web/src/screens/OikosApp.tsx (4057 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-fc4c7f0e079a4eaf", "name": "Very large file: apps/web/src/game/ForestPhaserScene.ts (1662 lines)", "shortDescription": {"text": "Very large file: apps/web/src/game/ForestPhaserScene.ts (1662 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-47a0fb685140bd49", "name": "Very large file: packages/rules/src/setup.test.ts (2665 lines)", "shortDescription": {"text": "Very large file: packages/rules/src/setup.test.ts (2665 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": "26 tests / 132 src (ratio 0.20)."}, "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-4a9eb7dc7c6e3880", "name": "Node manifest has dependencies but no lockfile: apps/web/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/web/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-5f12bbcc60e1f76c", "name": "Node manifest has dependencies but no lockfile: apps/server/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/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-4e4169d3a6c9b99d", "name": "Node manifest has dependencies but no lockfile: packages/rules/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/rules/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-b06ea4006804536a", "name": "Node manifest has dependencies but no lockfile: packages/content/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/content/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-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, 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": "low", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6cecf248ce0dd91b", "name": "Legacy-named symbol `bosque_1_copy` in apps/web/src/ui/tutorials.test.ts:74", "shortDescription": {"text": "Legacy-named symbol `bosque_1_copy` in apps/web/src/ui/tutorials.test.ts:74"}, "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-a25067f8195eab7f", "name": "Legacy-named symbol `campo_2_copy` in apps/web/src/ui/tutorials/macaw.ts:8", "shortDescription": {"text": "Legacy-named symbol `campo_2_copy` in apps/web/src/ui/tutorials/macaw.ts:8"}, "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-17b38f56d60ccf63", "name": "Commented-code block (6 lines) in apps/web/src/ui/tutorials/macaw.ts:112", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/ui/tutorials/macaw.ts:112"}, "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-d5a5ff5f34bb4184", "name": "Legacy-named symbol `bosque_2_copy` in apps/web/src/ui/tutorials/jaguar.ts:19", "shortDescription": {"text": "Legacy-named symbol `bosque_2_copy` in apps/web/src/ui/tutorials/jaguar.ts:19"}, "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-b482920918e8fd04", "name": "Commented-code block (7 lines) in apps/web/src/ui/tutorials/jaguar.ts:83", "shortDescription": {"text": "Commented-code block (7 lines) in apps/web/src/ui/tutorials/jaguar.ts:83"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4475f38dbc2eb4c1", "name": "Legacy-named symbol `campo_2_copy` in apps/web/src/ui/tutorials/capuchin.ts:8", "shortDescription": {"text": "Legacy-named symbol `campo_2_copy` in apps/web/src/ui/tutorials/capuchin.ts:8"}, "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-f1135e045a8a7cc3", "name": "Commented-code block (5 lines) in apps/web/src/ui/tutorials/capuchin.ts:108", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/ui/tutorials/capuchin.ts:108"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e7eb789fae514af7", "name": "Legacy-named symbol `bosque_2_copy` in apps/web/src/ui/tutorials/initial.ts:23", "shortDescription": {"text": "Legacy-named symbol `bosque_2_copy` in apps/web/src/ui/tutorials/initial.ts:23"}, "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-189ebebfeb0f7e96", "name": "Commented-code block (5 lines) in apps/web/src/ui/tutorials/initial.ts:27", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/ui/tutorials/initial.ts:27"}, "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-4241320fcccd490e", "name": "Legacy-named symbol `campo_1_copy` in apps/web/src/ui/tutorials/wolf.ts:9", "shortDescription": {"text": "Legacy-named symbol `campo_1_copy` in apps/web/src/ui/tutorials/wolf.ts:9"}, "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-1304d6f2021737b4", "name": "Commented-code block (5 lines) in apps/web/src/ui/tutorials/wolf.ts:115", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/ui/tutorials/wolf.ts:115"}, "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-9fe8ba91a0e7489e", "name": "Legacy-named symbol `bosque_1_copy` in apps/web/src/ui/tutorials/coati.ts:8", "shortDescription": {"text": "Legacy-named symbol `bosque_1_copy` in apps/web/src/ui/tutorials/coati.ts:8"}, "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-9d8167a664ba54d8", "name": "Commented-code block (11 lines) in apps/web/src/ui/tutorials/types.ts:5", "shortDescription": {"text": "Commented-code block (11 lines) in apps/web/src/ui/tutorials/types.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-a58d0565a045cf3b", "name": "Legacy-named symbol `bosque_1_copy` in apps/web/src/ui/tutorials/armadillo.ts:12", "shortDescription": {"text": "Legacy-named symbol `bosque_1_copy` in apps/web/src/ui/tutorials/armadillo.ts:12"}, "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-965c77fef2f06f85", "name": "Legacy-named symbol `bosque_1_copy` in apps/web/src/hooks/useBoardInteractionTargets.test.ts:406", "shortDescription": {"text": "Legacy-named symbol `bosque_1_copy` in apps/web/src/hooks/useBoardInteractionTargets.test.ts:406"}, "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-bcde1d452f8d124a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/hooks/useOpenRoomsPolling.ts:8", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/hooks/useOpenRoomsPolling.ts:8"}, "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-97040c9427f945e8", "name": "Commented-code block (6 lines) in apps/web/src/hooks/useOikosSocket.ts:30", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/hooks/useOikosSocket.ts:30"}, "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-adbdaaca887e90a2", "name": "Commented-code block (5 lines) in apps/web/src/game/ForestPhaserScene.ts:233", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/game/ForestPhaserScene.ts:233"}, "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-1e414d2cb4cffd61", "name": "Commented-code block (5 lines) in apps/server/src/projection.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in apps/server/src/projection.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-3c507b542fe87c93", "name": "Legacy-named symbol `campo_2_copy` in packages/rules/src/setup.test.ts:1243", "shortDescription": {"text": "Legacy-named symbol `campo_2_copy` in packages/rules/src/setup.test.ts:1243"}, "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-0095bbb2cd1cc699", "name": "Legacy-named symbol `bosque_1_copy` in packages/content/src/cards.ts:96", "shortDescription": {"text": "Legacy-named symbol `bosque_1_copy` in packages/content/src/cards.ts:96"}, "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-482e8b156996c628", "name": "Commented-code block (6 lines) in packages/content/src/cards.ts:22", "shortDescription": {"text": "Commented-code block (6 lines) in packages/content/src/cards.ts:22"}, "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-8e047ab7af03962f", "name": "7 env vars used in code but missing from .env.example", "shortDescription": {"text": "7 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AUTO_SCORE_DELAY_MS`, `BOT_TURN_DELAY_MS`, `DB_PATH`, `FRONTEND_URL`, `ROOM_MAX_AGE_MS`, `TUNNEL_PROTOCOL`, `TURN_TIMEOUT_MS`. 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/20713"}, "properties": {"repository": "tacianoneto/oikosdigital", "repoUrl": "https://github.com/tacianoneto/oikosdigital", "branch": "main"}, "results": [{"ruleId": "scanner-415d09b43b4277ac", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/simulate-bot-balance.ts:196"}, "properties": {"repobilityId": "efc006c63935e6cb", "scanner": "scanner-primary", "fingerprint": "415d09b43b4277ac", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9710c8d059e53154", "level": "none", "message": {"text": "No frontend routes/components detected"}, "properties": {"repobilityId": "44ca61485762e494", "scanner": "scanner-primary", "fingerprint": "9710c8d059e53154", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-fa560b60b4eab555", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/tunnel.mjs:9"}, "properties": {"repobilityId": "5862d75cea7b697c", "scanner": "scanner-primary", "fingerprint": "fa560b60b4eab555", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/tunnel.mjs"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-0af7f7dd58927477", "level": "note", "message": {"text": "Very large file: apps/web/src/screens/OikosApp.tsx (4057 lines)"}, "properties": {"repobilityId": "be3d6cc2e313e25f", "scanner": "scanner-primary", "fingerprint": "0af7f7dd58927477", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fc4c7f0e079a4eaf", "level": "note", "message": {"text": "Very large file: apps/web/src/game/ForestPhaserScene.ts (1662 lines)"}, "properties": {"repobilityId": "7c10bce94f53fdc1", "scanner": "scanner-primary", "fingerprint": "fc4c7f0e079a4eaf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-47a0fb685140bd49", "level": "note", "message": {"text": "Very large file: packages/rules/src/setup.test.ts (2665 lines)"}, "properties": {"repobilityId": "5e8e9c5d5ce9e019", "scanner": "scanner-primary", "fingerprint": "47a0fb685140bd49", "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": "c714a37e18330eaf", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-4a9eb7dc7c6e3880", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "properties": {"repobilityId": "6c1704bf24cf19ac", "scanner": "scanner-primary", "fingerprint": "4a9eb7dc7c6e3880", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5f12bbcc60e1f76c", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/server/package.json"}, "properties": {"repobilityId": "16bf11fe30b0b8cc", "scanner": "scanner-primary", "fingerprint": "5f12bbcc60e1f76c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/server/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4e4169d3a6c9b99d", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/rules/package.json"}, "properties": {"repobilityId": "bf36e44438b451c4", "scanner": "scanner-primary", "fingerprint": "4e4169d3a6c9b99d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/rules/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b06ea4006804536a", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/content/package.json"}, "properties": {"repobilityId": "6fd47829f3e50fb1", "scanner": "scanner-primary", "fingerprint": "b06ea4006804536a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/content/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "13a591d10d8f3821", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "4152a98426629bb9", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "d23a37104cb1fbb8", "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": "d64ec2a9d451822b", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-6cecf248ce0dd91b", "level": "note", "message": {"text": "Legacy-named symbol `bosque_1_copy` in apps/web/src/ui/tutorials.test.ts:74"}, "properties": {"repobilityId": "c91ff10fa058613c", "scanner": "scanner-primary", "fingerprint": "6cecf248ce0dd91b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a25067f8195eab7f", "level": "note", "message": {"text": "Legacy-named symbol `campo_2_copy` in apps/web/src/ui/tutorials/macaw.ts:8"}, "properties": {"repobilityId": "031e474f504cf409", "scanner": "scanner-primary", "fingerprint": "a25067f8195eab7f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-17b38f56d60ccf63", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/ui/tutorials/macaw.ts:112"}, "properties": {"repobilityId": "3d60ed21befe5841", "scanner": "scanner-primary", "fingerprint": "17b38f56d60ccf63", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d5a5ff5f34bb4184", "level": "note", "message": {"text": "Legacy-named symbol `bosque_2_copy` in apps/web/src/ui/tutorials/jaguar.ts:19"}, "properties": {"repobilityId": "9b13db2d56984081", "scanner": "scanner-primary", "fingerprint": "d5a5ff5f34bb4184", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b482920918e8fd04", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/web/src/ui/tutorials/jaguar.ts:83"}, "properties": {"repobilityId": "cd20a94e9ba2c2de", "scanner": "scanner-primary", "fingerprint": "b482920918e8fd04", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4475f38dbc2eb4c1", "level": "note", "message": {"text": "Legacy-named symbol `campo_2_copy` in apps/web/src/ui/tutorials/capuchin.ts:8"}, "properties": {"repobilityId": "0a5f948b11dfac38", "scanner": "scanner-primary", "fingerprint": "4475f38dbc2eb4c1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f1135e045a8a7cc3", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/ui/tutorials/capuchin.ts:108"}, "properties": {"repobilityId": "bd89ec9cf2c3a261", "scanner": "scanner-primary", "fingerprint": "f1135e045a8a7cc3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e7eb789fae514af7", "level": "note", "message": {"text": "Legacy-named symbol `bosque_2_copy` in apps/web/src/ui/tutorials/initial.ts:23"}, "properties": {"repobilityId": "4ad2b6a2ec3b8bf7", "scanner": "scanner-primary", "fingerprint": "e7eb789fae514af7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-189ebebfeb0f7e96", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/ui/tutorials/initial.ts:27"}, "properties": {"repobilityId": "fcd3b983ebde9358", "scanner": "scanner-primary", "fingerprint": "189ebebfeb0f7e96", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4241320fcccd490e", "level": "note", "message": {"text": "Legacy-named symbol `campo_1_copy` in apps/web/src/ui/tutorials/wolf.ts:9"}, "properties": {"repobilityId": "a3c1c02ed15f8fb9", "scanner": "scanner-primary", "fingerprint": "4241320fcccd490e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1304d6f2021737b4", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/ui/tutorials/wolf.ts:115"}, "properties": {"repobilityId": "9cd5fd7bb26e4538", "scanner": "scanner-primary", "fingerprint": "1304d6f2021737b4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9fe8ba91a0e7489e", "level": "note", "message": {"text": "Legacy-named symbol `bosque_1_copy` in apps/web/src/ui/tutorials/coati.ts:8"}, "properties": {"repobilityId": "6844859bc0d1e830", "scanner": "scanner-primary", "fingerprint": "9fe8ba91a0e7489e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9d8167a664ba54d8", "level": "none", "message": {"text": "Commented-code block (11 lines) in apps/web/src/ui/tutorials/types.ts:5"}, "properties": {"repobilityId": "51a7b015565410e1", "scanner": "scanner-primary", "fingerprint": "9d8167a664ba54d8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a58d0565a045cf3b", "level": "note", "message": {"text": "Legacy-named symbol `bosque_1_copy` in apps/web/src/ui/tutorials/armadillo.ts:12"}, "properties": {"repobilityId": "23e375555d15d9ff", "scanner": "scanner-primary", "fingerprint": "a58d0565a045cf3b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-965c77fef2f06f85", "level": "note", "message": {"text": "Legacy-named symbol `bosque_1_copy` in apps/web/src/hooks/useBoardInteractionTargets.test.ts:406"}, "properties": {"repobilityId": "8d48ed1cd7bf05fe", "scanner": "scanner-primary", "fingerprint": "965c77fef2f06f85", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bcde1d452f8d124a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/hooks/useOpenRoomsPolling.ts:8"}, "properties": {"repobilityId": "6efdc1f7f618d49e", "scanner": "scanner-primary", "fingerprint": "bcde1d452f8d124a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-97040c9427f945e8", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/hooks/useOikosSocket.ts:30"}, "properties": {"repobilityId": "fc740d75382d3880", "scanner": "scanner-primary", "fingerprint": "97040c9427f945e8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-adbdaaca887e90a2", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/game/ForestPhaserScene.ts:233"}, "properties": {"repobilityId": "37d83b609018621d", "scanner": "scanner-primary", "fingerprint": "adbdaaca887e90a2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e414d2cb4cffd61", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/server/src/projection.ts:3"}, "properties": {"repobilityId": "c7ca6f1c889f7c62", "scanner": "scanner-primary", "fingerprint": "1e414d2cb4cffd61", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3c507b542fe87c93", "level": "note", "message": {"text": "Legacy-named symbol `campo_2_copy` in packages/rules/src/setup.test.ts:1243"}, "properties": {"repobilityId": "fb578a138ccdd043", "scanner": "scanner-primary", "fingerprint": "3c507b542fe87c93", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0095bbb2cd1cc699", "level": "note", "message": {"text": "Legacy-named symbol `bosque_1_copy` in packages/content/src/cards.ts:96"}, "properties": {"repobilityId": "f965ee432f51467f", "scanner": "scanner-primary", "fingerprint": "0095bbb2cd1cc699", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-482e8b156996c628", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/content/src/cards.ts:22"}, "properties": {"repobilityId": "beb827611f9388e0", "scanner": "scanner-primary", "fingerprint": "482e8b156996c628", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8e047ab7af03962f", "level": "note", "message": {"text": "7 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "5a0455f6498c27ad", "scanner": "scanner-primary", "fingerprint": "8e047ab7af03962f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}