{"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-b7f9b2b274898a3f", "name": "Possibly dead Python function: build_hub", "shortDescription": {"text": "Possibly dead Python function: build_hub"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-46768cab4d2c5363", "name": "Possibly dead Python function: build_chain", "shortDescription": {"text": "Possibly dead Python function: build_chain"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-076d77210c3aa7ef", "name": "Possibly dead Python function: build_star", "shortDescription": {"text": "Possibly dead Python function: build_star"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-17bcdb3227b2f4fa", "name": "Possibly dead Python function: build_dag", "shortDescription": {"text": "Possibly dead Python function: build_dag"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1a988d9d61297699", "name": "TODO/FIXME marker in shipping code \u2014 ui/src/layout/IslandLayoutEngine.ts:233", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 ui/src/layout/IslandLayoutEngine.ts:233"}, "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-403cb0122aede55a", "name": "React Flow <MiniMap> without dark background \u2014 ui/src/components/GraphShell.tsx:221", "shortDescription": {"text": "React Flow <MiniMap> without dark background \u2014 ui/src/components/GraphShell.tsx:221"}, "fullDescription": {"text": "A bare <MiniMap> renders with the vendor's white default in dark themes. Wrap the canvas in a class that overrides `.react-flow__minimap` background, or pass an explicit `style`/`maskColor`/`bgColor`.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.minimap.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b358da3a7dd6690a", "name": "React Flow <Controls> without dark theming \u2014 ui/src/components/GraphShell.tsx:220", "shortDescription": {"text": "React Flow <Controls> without dark theming \u2014 ui/src/components/GraphShell.tsx:220"}, "fullDescription": {"text": "`<Controls>` ships with white buttons. Override `.react-flow__controls` and `.react-flow__controls-button` in your stylesheet or pass a styled wrapper.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.controls.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-780a48f2adabb57b", "name": "Custom React Flow node registered without explicit width/height \u2014 ui/src/hooks/useSearch.test.ts:71", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 ui/src/hooks/useSearch.test.ts:71"}, "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-c5e6b557345d67a6", "name": "Runtime dotenv file present in repo: ui/.env.development", "shortDescription": {"text": "Runtime dotenv file present in repo: ui/.env.development"}, "fullDescription": {"text": "`ui/.env.development` 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-082e3d3acf8f1c7e", "name": "Insecure pattern 'direct_innerhtml_assignment' in ui/src/hooks/useExport.test.ts:12", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in ui/src/hooks/useExport.test.ts:12"}, "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-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-cbe310f193a6df9f", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-832f475aaebfc992", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-271bb111afee1c2b", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-323a1141805f1951", "name": "Very large file: tests/unit/test_drift.py (1662 lines)", "shortDescription": {"text": "Very large file: tests/unit/test_drift.py (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-b8b3ce97e1cc499c", "name": "Very large file: tests/unit/test_cli.py (1390 lines)", "shortDescription": {"text": "Very large file: tests/unit/test_cli.py (1390 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-d1765778d8d8432e", "name": "Very large file: src/cgis/cli.py (1443 lines)", "shortDescription": {"text": "Very large file: src/cgis/cli.py (1443 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-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 10 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-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-cb52fce879ee076f", "name": "Legacy-named symbol `model_copy` in tests/unit/test_prompt.py:157", "shortDescription": {"text": "Legacy-named symbol `model_copy` in tests/unit/test_prompt.py:157"}, "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-3cdc62ab89099dbf", "name": "Legacy-named symbol `model_copy` in tests/unit/test_guardian_skeptic.py:45", "shortDescription": {"text": "Legacy-named symbol `model_copy` in tests/unit/test_guardian_skeptic.py:45"}, "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-3180d48ea8a80100", "name": "Legacy-named symbol `model_copy` in tests/unit/test_guardian_findings.py:35", "shortDescription": {"text": "Legacy-named symbol `model_copy` in tests/unit/test_guardian_findings.py:35"}, "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-f9b1db26b534ebd9", "name": "Legacy-named symbol `execute_v1` in tests/unit/test_resolver.py:170", "shortDescription": {"text": "Legacy-named symbol `execute_v1` in tests/unit/test_resolver.py:170"}, "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-a8fd202163cc0f67", "name": "Legacy-named symbol `model_copy` in tests/unit/test_guardian_poster.py:31", "shortDescription": {"text": "Legacy-named symbol `model_copy` in tests/unit/test_guardian_poster.py:31"}, "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-d611188b737012e8", "name": "Legacy-named symbol `model_copy` in tests/unit/test_guardian_render.py:38", "shortDescription": {"text": "Legacy-named symbol `model_copy` in tests/unit/test_guardian_render.py:38"}, "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-b9083901901f2463", "name": "Commented-code block (5 lines) in tests/self_parsing/test_drift.py:40", "shortDescription": {"text": "Commented-code block (5 lines) in tests/self_parsing/test_drift.py:40"}, "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-a3167b2363096672", "name": "Commented-code block (5 lines) in ui/src/layout/IslandLayoutEngine.ts:172", "shortDescription": {"text": "Commented-code block (5 lines) in ui/src/layout/IslandLayoutEngine.ts:172"}, "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-a21029aa3e2b7e0a", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/guardian_bench.py:39", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/guardian_bench.py:39"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-671650f61f120faa", "name": "Legacy-named symbol `model_copy` in src/cgis/extractors/python_extractor.py:82", "shortDescription": {"text": "Legacy-named symbol `model_copy` in src/cgis/extractors/python_extractor.py:82"}, "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-e09b099f2cf27de7", "name": "Legacy-named symbol `model_copy` in src/cgis/guardian/chunked.py:83", "shortDescription": {"text": "Legacy-named symbol `model_copy` in src/cgis/guardian/chunked.py:83"}, "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-1e1121994165d19e", "name": "Legacy-named symbol `model_copy` in src/cgis/guardian/core.py:36", "shortDescription": {"text": "Legacy-named symbol `model_copy` in src/cgis/guardian/core.py:36"}, "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-4e61f55a66003c56", "name": "Legacy-named symbol `model_copy` in src/cgis/guardian/skeptic.py:105", "shortDescription": {"text": "Legacy-named symbol `model_copy` in src/cgis/guardian/skeptic.py:105"}, "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-d10618e9e53e5d65", "name": "Commented-code block (6 lines) in src/cgis/guardian/skeptic.py:32", "shortDescription": {"text": "Commented-code block (6 lines) in src/cgis/guardian/skeptic.py:32"}, "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-c36a2e6bf1ce3806", "name": "Legacy-named symbol `model_copy` in src/cgis/guardian/github_poster.py:83", "shortDescription": {"text": "Legacy-named symbol `model_copy` in src/cgis/guardian/github_poster.py:83"}, "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-679f5ec54b935a55", "name": "Network/subprocess call without timeout or try/except \u2014 src/cgis/guardian/github_poster.py:124", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 src/cgis/guardian/github_poster.py:124"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5fdb8391cd996aee", "name": "Commented-code block (5 lines) in src/cgis/guardian/providers/ollama.py:17", "shortDescription": {"text": "Commented-code block (5 lines) in src/cgis/guardian/providers/ollama.py:17"}, "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-2b4224338367993b", "name": "Commented-code block (6 lines) in src/cgis/query/analysis/suggest_service.py:175", "shortDescription": {"text": "Commented-code block (6 lines) in src/cgis/query/analysis/suggest_service.py:175"}, "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-e0e14c6b1a73fe1d", "name": "Legacy-named symbol `model_copy` in src/cgis/query/analysis/health.py:116", "shortDescription": {"text": "Legacy-named symbol `model_copy` in src/cgis/query/analysis/health.py:116"}, "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-c20597a629a2c49a", "name": "Commented-code block (7 lines) in src/cgis/query/drift/ontology_init.py:34", "shortDescription": {"text": "Commented-code block (7 lines) in src/cgis/query/drift/ontology_init.py:34"}, "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-34fc3354030d23ea", "name": "Legacy-named symbol `_score_v1` in src/cgis/query/drift/drift.py:381", "shortDescription": {"text": "Legacy-named symbol `_score_v1` in src/cgis/query/drift/drift.py:381"}, "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-24a061c3d424b953", "name": "Commented-code block (7 lines) in src/cgis/query/drift/drift.py:495", "shortDescription": {"text": "Commented-code block (7 lines) in src/cgis/query/drift/drift.py:495"}, "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-4f83fff8784e2eed", "name": "Legacy-named symbol `_score_v2` in src/cgis/query/drift/fingerprint.py:57", "shortDescription": {"text": "Legacy-named symbol `_score_v2` in src/cgis/query/drift/fingerprint.py:57"}, "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-9a8bb9b31ccd35ba", "name": "Commented-code block (5 lines) in src/cgis/query/drift/fingerprint.py:39", "shortDescription": {"text": "Commented-code block (5 lines) in src/cgis/query/drift/fingerprint.py:39"}, "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-f147e75a215e7100", "name": "Legacy-named symbol `model_copy` in src/cgis/resolver/engine.py:82", "shortDescription": {"text": "Legacy-named symbol `model_copy` in src/cgis/resolver/engine.py:82"}, "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-c19f5e05f61b3a80", "name": "Legacy-named symbol `model_copy` in src/cgis/resolver/uplift.py:106", "shortDescription": {"text": "Legacy-named symbol `model_copy` in src/cgis/resolver/uplift.py:106"}, "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-b334d875f2339fa1", "name": "5 env vars used in code but missing from .env.example", "shortDescription": {"text": "5 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `GITHUB_OUTPUT`, `GITHUB_REPOSITORY`, `GUARDIAN_FEATURES`, `GUARDIAN_NO_GRAPH`, `GUARDIAN_SKEPTIC`. 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-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nsrc/cgis/cli.py:build_trace_tree, src/cgis/cli.py:build_impact_tree\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nsrc/cgis/extractors/_python_functions.py:process_function_node, src/cgis/extractors/_python_functions.py:process_module_assignment, src/cgis/extractors/_python_classes.py:process_class_node\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/23509"}, "properties": {"repository": "zaebee/codegraph-brain", "repoUrl": "https://github.com/zaebee/codegraph-brain", "branch": "main"}, "results": [{"ruleId": "scanner-b7f9b2b274898a3f", "level": "note", "message": {"text": "Possibly dead Python function: build_hub"}, "properties": {"repobilityId": "3f85d1b95e4a9741", "scanner": "scanner-primary", "fingerprint": "b7f9b2b274898a3f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/gen_ideal_graph.py:111"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-46768cab4d2c5363", "level": "note", "message": {"text": "Possibly dead Python function: build_chain"}, "properties": {"repobilityId": "325508e7d24a8cac", "scanner": "scanner-primary", "fingerprint": "46768cab4d2c5363", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/gen_ideal_graph.py:151"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-076d77210c3aa7ef", "level": "note", "message": {"text": "Possibly dead Python function: build_star"}, "properties": {"repobilityId": "87d1b59370ad59f8", "scanner": "scanner-primary", "fingerprint": "076d77210c3aa7ef", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/gen_ideal_graph.py:181"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-17bcdb3227b2f4fa", "level": "note", "message": {"text": "Possibly dead Python function: build_dag"}, "properties": {"repobilityId": "0251f778b3b09376", "scanner": "scanner-primary", "fingerprint": "17bcdb3227b2f4fa", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/gen_ideal_graph.py:212"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1a988d9d61297699", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 ui/src/layout/IslandLayoutEngine.ts:233"}, "properties": {"repobilityId": "2b5d6056658f9649", "scanner": "scanner-primary", "fingerprint": "1a988d9d61297699", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-403cb0122aede55a", "level": "note", "message": {"text": "React Flow <MiniMap> without dark background \u2014 ui/src/components/GraphShell.tsx:221"}, "properties": {"repobilityId": "c868def4ad2b50b1", "scanner": "scanner-primary", "fingerprint": "403cb0122aede55a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.minimap.no-bg"]}}, {"ruleId": "scanner-b358da3a7dd6690a", "level": "note", "message": {"text": "React Flow <Controls> without dark theming \u2014 ui/src/components/GraphShell.tsx:220"}, "properties": {"repobilityId": "1341e4781ad731bd", "scanner": "scanner-primary", "fingerprint": "b358da3a7dd6690a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.controls.no-bg"]}}, {"ruleId": "scanner-780a48f2adabb57b", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 ui/src/hooks/useSearch.test.ts:71"}, "properties": {"repobilityId": "720bc0f1f1aa48a2", "scanner": "scanner-primary", "fingerprint": "780a48f2adabb57b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-c5e6b557345d67a6", "level": "error", "message": {"text": "Runtime dotenv file present in repo: ui/.env.development"}, "properties": {"repobilityId": "d44e367a1f18baaa", "scanner": "scanner-primary", "fingerprint": "c5e6b557345d67a6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ui/.env.development"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-082e3d3acf8f1c7e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in ui/src/hooks/useExport.test.ts:12"}, "properties": {"repobilityId": "3c40ede84fb75a19", "scanner": "scanner-primary", "fingerprint": "082e3d3acf8f1c7e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ui/src/hooks/useExport.test.ts"}, "region": {"startLine": 12}}}]}, {"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-cbe310f193a6df9f", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "573212e145c44806", "scanner": "scanner-primary", "fingerprint": "cbe310f193a6df9f", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release-please.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-832f475aaebfc992", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "930fa7c029707709", "scanner": "scanner-primary", "fingerprint": "832f475aaebfc992", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/guardian.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-271bb111afee1c2b", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "b6969c7d2c438cb0", "scanner": "scanner-primary", "fingerprint": "271bb111afee1c2b", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/autodoc.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-323a1141805f1951", "level": "note", "message": {"text": "Very large file: tests/unit/test_drift.py (1662 lines)"}, "properties": {"repobilityId": "22601fb717644ba8", "scanner": "scanner-primary", "fingerprint": "323a1141805f1951", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b8b3ce97e1cc499c", "level": "note", "message": {"text": "Very large file: tests/unit/test_cli.py (1390 lines)"}, "properties": {"repobilityId": "bb43f878d799f059", "scanner": "scanner-primary", "fingerprint": "b8b3ce97e1cc499c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d1765778d8d8432e", "level": "note", "message": {"text": "Very large file: src/cgis/cli.py (1443 lines)"}, "properties": {"repobilityId": "b7c25b4a78afca6d", "scanner": "scanner-primary", "fingerprint": "d1765778d8d8432e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "0620cd42fb338dc7", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "1ffc06e1aab1e37b", "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": "420461e5ce06a6d1", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-cb52fce879ee076f", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in tests/unit/test_prompt.py:157"}, "properties": {"repobilityId": "e6cb1381f083a163", "scanner": "scanner-primary", "fingerprint": "cb52fce879ee076f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3cdc62ab89099dbf", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in tests/unit/test_guardian_skeptic.py:45"}, "properties": {"repobilityId": "3bf0fa01d348e0b0", "scanner": "scanner-primary", "fingerprint": "3cdc62ab89099dbf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3180d48ea8a80100", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in tests/unit/test_guardian_findings.py:35"}, "properties": {"repobilityId": "2695fe1d4122a73a", "scanner": "scanner-primary", "fingerprint": "3180d48ea8a80100", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f9b1db26b534ebd9", "level": "note", "message": {"text": "Legacy-named symbol `execute_v1` in tests/unit/test_resolver.py:170"}, "properties": {"repobilityId": "d6f83174e0daedd2", "scanner": "scanner-primary", "fingerprint": "f9b1db26b534ebd9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a8fd202163cc0f67", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in tests/unit/test_guardian_poster.py:31"}, "properties": {"repobilityId": "951935dcb13ac512", "scanner": "scanner-primary", "fingerprint": "a8fd202163cc0f67", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d611188b737012e8", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in tests/unit/test_guardian_render.py:38"}, "properties": {"repobilityId": "5f75e6572b2c218e", "scanner": "scanner-primary", "fingerprint": "d611188b737012e8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b9083901901f2463", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/self_parsing/test_drift.py:40"}, "properties": {"repobilityId": "e4a31a6751c0b198", "scanner": "scanner-primary", "fingerprint": "b9083901901f2463", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a3167b2363096672", "level": "none", "message": {"text": "Commented-code block (5 lines) in ui/src/layout/IslandLayoutEngine.ts:172"}, "properties": {"repobilityId": "31eadd0f4da704a5", "scanner": "scanner-primary", "fingerprint": "a3167b2363096672", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a21029aa3e2b7e0a", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/guardian_bench.py:39"}, "properties": {"repobilityId": "5f15ceebd449d666", "scanner": "scanner-primary", "fingerprint": "a21029aa3e2b7e0a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-671650f61f120faa", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in src/cgis/extractors/python_extractor.py:82"}, "properties": {"repobilityId": "bc4e02f4725218cc", "scanner": "scanner-primary", "fingerprint": "671650f61f120faa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e09b099f2cf27de7", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in src/cgis/guardian/chunked.py:83"}, "properties": {"repobilityId": "19733e8c95edb23f", "scanner": "scanner-primary", "fingerprint": "e09b099f2cf27de7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1e1121994165d19e", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in src/cgis/guardian/core.py:36"}, "properties": {"repobilityId": "d2387fd7f6b17f45", "scanner": "scanner-primary", "fingerprint": "1e1121994165d19e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4e61f55a66003c56", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in src/cgis/guardian/skeptic.py:105"}, "properties": {"repobilityId": "0bec9d59181598f3", "scanner": "scanner-primary", "fingerprint": "4e61f55a66003c56", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d10618e9e53e5d65", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/cgis/guardian/skeptic.py:32"}, "properties": {"repobilityId": "7ebda2cad227e821", "scanner": "scanner-primary", "fingerprint": "d10618e9e53e5d65", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c36a2e6bf1ce3806", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in src/cgis/guardian/github_poster.py:83"}, "properties": {"repobilityId": "ed47d16da21aa95b", "scanner": "scanner-primary", "fingerprint": "c36a2e6bf1ce3806", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-679f5ec54b935a55", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 src/cgis/guardian/github_poster.py:124"}, "properties": {"repobilityId": "0d637fa4e5faa304", "scanner": "scanner-primary", "fingerprint": "679f5ec54b935a55", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5fdb8391cd996aee", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/cgis/guardian/providers/ollama.py:17"}, "properties": {"repobilityId": "c244968c756aeded", "scanner": "scanner-primary", "fingerprint": "5fdb8391cd996aee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2b4224338367993b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/cgis/query/analysis/suggest_service.py:175"}, "properties": {"repobilityId": "b7cf28911782a2be", "scanner": "scanner-primary", "fingerprint": "2b4224338367993b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e0e14c6b1a73fe1d", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in src/cgis/query/analysis/health.py:116"}, "properties": {"repobilityId": "8c7e25fe51e19ac4", "scanner": "scanner-primary", "fingerprint": "e0e14c6b1a73fe1d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c20597a629a2c49a", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/cgis/query/drift/ontology_init.py:34"}, "properties": {"repobilityId": "25ddb5ad35d1a946", "scanner": "scanner-primary", "fingerprint": "c20597a629a2c49a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-34fc3354030d23ea", "level": "note", "message": {"text": "Legacy-named symbol `_score_v1` in src/cgis/query/drift/drift.py:381"}, "properties": {"repobilityId": "4dbc9623ee70c4bd", "scanner": "scanner-primary", "fingerprint": "34fc3354030d23ea", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-24a061c3d424b953", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/cgis/query/drift/drift.py:495"}, "properties": {"repobilityId": "c5c8cf646bc273a7", "scanner": "scanner-primary", "fingerprint": "24a061c3d424b953", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4f83fff8784e2eed", "level": "note", "message": {"text": "Legacy-named symbol `_score_v2` in src/cgis/query/drift/fingerprint.py:57"}, "properties": {"repobilityId": "91c63941fc10aaed", "scanner": "scanner-primary", "fingerprint": "4f83fff8784e2eed", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9a8bb9b31ccd35ba", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/cgis/query/drift/fingerprint.py:39"}, "properties": {"repobilityId": "04297432981ec4bd", "scanner": "scanner-primary", "fingerprint": "9a8bb9b31ccd35ba", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f147e75a215e7100", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in src/cgis/resolver/engine.py:82"}, "properties": {"repobilityId": "a2a09dde70b2efbe", "scanner": "scanner-primary", "fingerprint": "f147e75a215e7100", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c19f5e05f61b3a80", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in src/cgis/resolver/uplift.py:106"}, "properties": {"repobilityId": "973edb0646a80781", "scanner": "scanner-primary", "fingerprint": "c19f5e05f61b3a80", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b334d875f2339fa1", "level": "note", "message": {"text": "5 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "faa38682016f5d53", "scanner": "scanner-primary", "fingerprint": "b334d875f2339fa1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "9d595252272796f4", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "deb214d2d5059182", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "4c5c1c7a15b915d5", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "9b478d7ec5f164c8", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "dcfb35c23001a42f", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "0f3a27696272c62c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "c8b893ebd5eb67f8", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "1794c290f4f3a7ea", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}