{"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-7de07a0516cd5cc9", "name": "Possibly dead Python function: cmd_roster", "shortDescription": {"text": "Possibly dead Python function: cmd_roster"}, "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-b691f9e203e02bd2", "name": "Possibly dead Python function: cmd_list", "shortDescription": {"text": "Possibly dead Python function: cmd_list"}, "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-ee4af5490d7c9bef", "name": "Possibly dead Python function: device_label", "shortDescription": {"text": "Possibly dead Python function: device_label"}, "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-7be5a70f933c61c3", "name": "Possibly dead Python function: radio_summary", "shortDescription": {"text": "Possibly dead Python function: radio_summary"}, "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-d488a0f474a02ca6", "name": "Possibly dead Python function: radio_badge", "shortDescription": {"text": "Possibly dead Python function: radio_badge"}, "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-eca012e8ff562337", "name": "Possibly dead Python function: ap_sort_key", "shortDescription": {"text": "Possibly dead Python function: ap_sort_key"}, "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-885e4c79ef68c10b", "name": "Possibly dead Python function: cmd_discover", "shortDescription": {"text": "Possibly dead Python function: cmd_discover"}, "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-72b697255039634c", "name": "Possibly dead Python function: cmd_list", "shortDescription": {"text": "Possibly dead Python function: cmd_list"}, "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-3cc9c28ae213af67", "name": "Possibly dead Python function: cmd_validate", "shortDescription": {"text": "Possibly dead Python function: cmd_validate"}, "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-cb0a3f8bee12d51f", "name": "Possibly dead Python function: cmd_history", "shortDescription": {"text": "Possibly dead Python function: cmd_history"}, "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-d3df1496ad6c6335", "name": "Possibly dead Python function: cmd_comforts_capture", "shortDescription": {"text": "Possibly dead Python function: cmd_comforts_capture"}, "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-7f4438c597caf0a9", "name": "Possibly dead Python function: cmd_comforts_sync", "shortDescription": {"text": "Possibly dead Python function: cmd_comforts_sync"}, "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-26502f1d2dd775d5", "name": "Possibly dead Python function: cmd_weather_discover", "shortDescription": {"text": "Possibly dead Python function: cmd_weather_discover"}, "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-5ce0546c88d58dc6", "name": "Possibly dead Python function: cmd_weather", "shortDescription": {"text": "Possibly dead Python function: cmd_weather"}, "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-d3ca69b3682a3a24", "name": "Possibly dead Python function: cmd_air_quality", "shortDescription": {"text": "Possibly dead Python function: cmd_air_quality"}, "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-634eda433e541126", "name": "Possibly dead Python function: fetch_air_quality", "shortDescription": {"text": "Possibly dead Python function: fetch_air_quality"}, "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-786c31fb6108f433", "name": "Possibly dead Python function: fetch_pollen", "shortDescription": {"text": "Possibly dead Python function: fetch_pollen"}, "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-e53fee7a31e9d80b", "name": "Stray `console.log` in TS/JS \u2014 _bmad/wds/workflows/5-agentic-development/templates/components/dev-mode.js:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 _bmad/wds/workflows/5-agentic-development/templates/components/dev-mode.js:67"}, "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-4c68f741712ac0ca", "name": "Privileged port 21 in use", "shortDescription": {"text": "Privileged port 21 in use"}, "fullDescription": {"text": "Port 21 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e4631224b43f691a", "name": "Privileged port 30 in use", "shortDescription": {"text": "Privileged port 30 in use"}, "fullDescription": {"text": "Port 30 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-424110a5b159ef5d", "name": "Privileged port 10 in use", "shortDescription": {"text": "Privileged port 10 in use"}, "fullDescription": {"text": "Port 10 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cff07e3fccecbf46", "name": "Privileged port 14 in use", "shortDescription": {"text": "Privileged port 14 in use"}, "fullDescription": {"text": "Port 14 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-42523b218eb05d62", "name": "Docker base image is tag-pinned but not digest-pinned: ubuntu:24.04", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: ubuntu:24.04"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9bc5f3e309f09aba", "name": "Dockerfile pipes a remote installer into a shell", "shortDescription": {"text": "Dockerfile pipes a remote installer into a shell"}, "fullDescription": {"text": "Executing downloaded code during image build gives the remote endpoint build-time code execution. Prefer pinned packages or verify downloaded installers by checksum/signature."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "high", "confidence": 1.0}}, {"id": "scanner-82efa08307ccc5e5", "name": "Dockerfile runs as root: homelab/services/obsidian-sync/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: homelab/services/obsidian-sync/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d91553cd457a361a", "name": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bb6d7bc02ef44849", "name": "Dockerfile runs as root: homelab/services/climate-auto-switch/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: homelab/services/climate-auto-switch/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-85b585e4749eddb7", "name": "Docker base image is tag-pinned but not digest-pinned: ghcr.io/astral-sh/uv:${UV_VERSION}", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: ghcr.io/astral-sh/uv:${UV_VERSION}"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8c67bd757b2f7372", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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-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-59861a22de7ae266", "name": "Runtime dotenv file present in repo: homelab/services/taskchampion-sync/.env.vars", "shortDescription": {"text": "Runtime dotenv file present in repo: homelab/services/taskchampion-sync/.env.vars"}, "fullDescription": {"text": "`homelab/services/taskchampion-sync/.env.vars` 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-0b8107fca490452c", "name": "Runtime dotenv file present in repo: homelab/services/brineworks-agent/.env.vars", "shortDescription": {"text": "Runtime dotenv file present in repo: homelab/services/brineworks-agent/.env.vars"}, "fullDescription": {"text": "`homelab/services/brineworks-agent/.env.vars` 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-a854d161732503fd", "name": "Runtime dotenv file present in repo: homelab/services/brineworks-server/.env.vars", "shortDescription": {"text": "Runtime dotenv file present in repo: homelab/services/brineworks-server/.env.vars"}, "fullDescription": {"text": "`homelab/services/brineworks-server/.env.vars` 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-fff8c1aedbef4984", "name": "Runtime dotenv file present in repo: homelab/services/backup/.env.vars", "shortDescription": {"text": "Runtime dotenv file present in repo: homelab/services/backup/.env.vars"}, "fullDescription": {"text": "`homelab/services/backup/.env.vars` 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-88ce370dd6353f25", "name": "Runtime dotenv file present in repo: homelab/services/github-actions-runner/.env.vars", "shortDescription": {"text": "Runtime dotenv file present in repo: homelab/services/github-actions-runner/.env.vars"}, "fullDescription": {"text": "`homelab/services/github-actions-runner/.env.vars` 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-61f43841bf0934dc", "name": "Runtime dotenv file present in repo: homelab/services/climate-auto-switch/.env.vars", "shortDescription": {"text": "Runtime dotenv file present in repo: homelab/services/climate-auto-switch/.env.vars"}, "fullDescription": {"text": "`homelab/services/climate-auto-switch/.env.vars` 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-d1fa247950ceca5e", "name": "Insecure pattern 'tls_verify_false' in network/snapshot.py:103", "shortDescription": {"text": "Insecure pattern 'tls_verify_false' in network/snapshot.py:103"}, "fullDescription": {"text": "Found a known-risky pattern (tls_verify_false). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ab9755be3c60e024", "name": "Insecure pattern 'tls_verify_false' in network/unifi/__init__.py:25", "shortDescription": {"text": "Insecure pattern 'tls_verify_false' in network/unifi/__init__.py:25"}, "fullDescription": {"text": "Found a known-risky pattern (tls_verify_false). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 633 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-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "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-41025f75808edcd0", "name": "Agent authority lacks a verifier contract: _bmad/cis/workflows/bmad-cis-design-thinking/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: _bmad/cis/workflows/bmad-cis-design-thinking/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-861f44038f381328", "name": "Agent authority lacks a verifier contract: _bmad/core/tasks/bmad-index-docs/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: _bmad/core/tasks/bmad-index-docs/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1d748a788d53824e", "name": "Agent authority lacks a verifier contract: climate/CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: climate/CLAUDE.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fe56554bedfe2d0b", "name": "Legacy-named symbol `test_get_data_age_minutes_old` in tests/ambient/test_client.py:61", "shortDescription": {"text": "Legacy-named symbol `test_get_data_age_minutes_old` in tests/ambient/test_client.py:61"}, "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-0e6ee3775fdd7f55", "name": "Legacy-named symbol `get_legacy` in network/unifi/__init__.py:51", "shortDescription": {"text": "Legacy-named symbol `get_legacy` in network/unifi/__init__.py:51"}, "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-1cc7195d87233b61", "name": "Legacy-named symbol `get_legacy` in network/unifi/usg.py:69", "shortDescription": {"text": "Legacy-named symbol `get_legacy` in network/unifi/usg.py:69"}, "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-d0740adcd07e600b", "name": "Network/subprocess call without timeout or try/except \u2014 climate/ecobee/history.py:187", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 climate/ecobee/history.py:187"}, "fullDescription": {"text": "`requests.get(...)` 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-250f57e8a1dbd3c5", "name": "4 env vars used in code but missing from .env.example", "shortDescription": {"text": "4 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ALADDIN_TOKEN_PATH`, `CLIMATE_DATA_DIR`, `ECOBEE_TOKEN_PATH`, `YALE_TOKEN_PATH`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "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:\nlighting/hue.py:cmd_scenes, lighting/hue.py:cmd_scene\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:\nnetwork/unifi/__init__.py:walk, network/unifi/__init__.py:walk, network/unifi/__init__.py:walk\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/20940"}, "properties": {"repository": "technicalpickles/picklehome", "repoUrl": "https://github.com/technicalpickles/picklehome", "branch": "main"}, "results": [{"ruleId": "scanner-7de07a0516cd5cc9", "level": "note", "message": {"text": "Possibly dead Python function: cmd_roster"}, "properties": {"repobilityId": "8b6e92f1967bf805", "scanner": "scanner-primary", "fingerprint": "7de07a0516cd5cc9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sonos/sonos_cli.py:87"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b691f9e203e02bd2", "level": "note", "message": {"text": "Possibly dead Python function: cmd_list"}, "properties": {"repobilityId": "bd09044da90857da", "scanner": "scanner-primary", "fingerprint": "b691f9e203e02bd2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sonos/sonos_cli.py:99"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ee4af5490d7c9bef", "level": "note", "message": {"text": "Possibly dead Python function: device_label"}, "properties": {"repobilityId": "5f6027936f15e635", "scanner": "scanner-primary", "fingerprint": "ee4af5490d7c9bef", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "network/unifi/__init__.py:113"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7be5a70f933c61c3", "level": "note", "message": {"text": "Possibly dead Python function: radio_summary"}, "properties": {"repobilityId": "f38e2d35a092b040", "scanner": "scanner-primary", "fingerprint": "7be5a70f933c61c3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "network/unifi/__init__.py:120"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d488a0f474a02ca6", "level": "note", "message": {"text": "Possibly dead Python function: radio_badge"}, "properties": {"repobilityId": "821170beea876aee", "scanner": "scanner-primary", "fingerprint": "d488a0f474a02ca6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "network/unifi/__init__.py:133"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-eca012e8ff562337", "level": "note", "message": {"text": "Possibly dead Python function: ap_sort_key"}, "properties": {"repobilityId": "a88aeb53da19fef6", "scanner": "scanner-primary", "fingerprint": "eca012e8ff562337", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "network/unifi/wifi.py:72"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-885e4c79ef68c10b", "level": "note", "message": {"text": "Possibly dead Python function: cmd_discover"}, "properties": {"repobilityId": "b49bc4725362d3d2", "scanner": "scanner-primary", "fingerprint": "885e4c79ef68c10b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "climate/blueair_cli.py:61"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-72b697255039634c", "level": "note", "message": {"text": "Possibly dead Python function: cmd_list"}, "properties": {"repobilityId": "bd09044da90857da", "scanner": "scanner-primary", "fingerprint": "72b697255039634c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "climate/sync.py:26"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3cc9c28ae213af67", "level": "note", "message": {"text": "Possibly dead Python function: cmd_validate"}, "properties": {"repobilityId": "e595afaaf6f22972", "scanner": "scanner-primary", "fingerprint": "3cc9c28ae213af67", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "climate/sync.py:107"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cb0a3f8bee12d51f", "level": "note", "message": {"text": "Possibly dead Python function: cmd_history"}, "properties": {"repobilityId": "a4d653bbd551db7b", "scanner": "scanner-primary", "fingerprint": "cb0a3f8bee12d51f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "climate/sync.py:187"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d3df1496ad6c6335", "level": "note", "message": {"text": "Possibly dead Python function: cmd_comforts_capture"}, "properties": {"repobilityId": "5c41197430ab5d32", "scanner": "scanner-primary", "fingerprint": "d3df1496ad6c6335", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "climate/sync.py:241"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7f4438c597caf0a9", "level": "note", "message": {"text": "Possibly dead Python function: cmd_comforts_sync"}, "properties": {"repobilityId": "cc16d6b016a384f7", "scanner": "scanner-primary", "fingerprint": "7f4438c597caf0a9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "climate/sync.py:284"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-26502f1d2dd775d5", "level": "note", "message": {"text": "Possibly dead Python function: cmd_weather_discover"}, "properties": {"repobilityId": "5ae876b5c8bbbc14", "scanner": "scanner-primary", "fingerprint": "26502f1d2dd775d5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "climate/sync.py:348"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5ce0546c88d58dc6", "level": "note", "message": {"text": "Possibly dead Python function: cmd_weather"}, "properties": {"repobilityId": "9ea05ce427053f69", "scanner": "scanner-primary", "fingerprint": "5ce0546c88d58dc6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "climate/sync.py:394"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d3ca69b3682a3a24", "level": "note", "message": {"text": "Possibly dead Python function: cmd_air_quality"}, "properties": {"repobilityId": "ca043488d7e8cad8", "scanner": "scanner-primary", "fingerprint": "d3ca69b3682a3a24", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "climate/sync.py:623"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-634eda433e541126", "level": "note", "message": {"text": "Possibly dead Python function: fetch_air_quality"}, "properties": {"repobilityId": "9666d7141214b703", "scanner": "scanner-primary", "fingerprint": "634eda433e541126", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "climate/outdoor_air/client.py:129"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-786c31fb6108f433", "level": "note", "message": {"text": "Possibly dead Python function: fetch_pollen"}, "properties": {"repobilityId": "c33127c980ea8540", "scanner": "scanner-primary", "fingerprint": "786c31fb6108f433", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "climate/outdoor_air/pollen.py:106"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e53fee7a31e9d80b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 _bmad/wds/workflows/5-agentic-development/templates/components/dev-mode.js:67"}, "properties": {"repobilityId": "df6cb16b1846c7f7", "scanner": "scanner-primary", "fingerprint": "e53fee7a31e9d80b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4c68f741712ac0ca", "level": "warning", "message": {"text": "Privileged port 21 in use"}, "properties": {"repobilityId": "d920b7cd1b1a16dc", "scanner": "scanner-primary", "fingerprint": "4c68f741712ac0ca", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "_bmad/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e4631224b43f691a", "level": "warning", "message": {"text": "Privileged port 30 in use"}, "properties": {"repobilityId": "54f172e7d16fc662", "scanner": "scanner-primary", "fingerprint": "e4631224b43f691a", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "_bmad/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-424110a5b159ef5d", "level": "warning", "message": {"text": "Privileged port 10 in use"}, "properties": {"repobilityId": "735372d6b5594915", "scanner": "scanner-primary", "fingerprint": "424110a5b159ef5d", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "climate/config/schedule.yaml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cff07e3fccecbf46", "level": "warning", "message": {"text": "Privileged port 14 in use"}, "properties": {"repobilityId": "2dbd4b719a1412ff", "scanner": "scanner-primary", "fingerprint": "cff07e3fccecbf46", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "climate/config/schedule.yaml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-42523b218eb05d62", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: ubuntu:24.04"}, "properties": {"repobilityId": "2074013956718142", "scanner": "scanner-primary", "fingerprint": "42523b218eb05d62", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "homelab/dev/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9bc5f3e309f09aba", "level": "error", "message": {"text": "Dockerfile pipes a remote installer into a shell"}, "properties": {"repobilityId": "57add56aea49c257", "scanner": "scanner-primary", "fingerprint": "9bc5f3e309f09aba", "layer": "hardware", "severity": "high", "confidence": 1.0, "tags": ["supply-chain", "docker", "remote-installer"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "homelab/dev/Dockerfile"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-9bc5f3e309f09aba", "level": "error", "message": {"text": "Dockerfile pipes a remote installer into a shell"}, "properties": {"repobilityId": "fc4d17aa5c719a8e", "scanner": "scanner-primary", "fingerprint": "9bc5f3e309f09aba", "layer": "hardware", "severity": "high", "confidence": 1.0, "tags": ["supply-chain", "docker", "remote-installer"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "homelab/dev/Dockerfile"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-82efa08307ccc5e5", "level": "warning", "message": {"text": "Dockerfile runs as root: homelab/services/obsidian-sync/Dockerfile"}, "properties": {"repobilityId": "d6469368c7883e92", "scanner": "scanner-primary", "fingerprint": "82efa08307ccc5e5", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-d91553cd457a361a", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "dd738d5989c17d91", "scanner": "scanner-primary", "fingerprint": "d91553cd457a361a", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "homelab/services/obsidian-sync/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bb6d7bc02ef44849", "level": "warning", "message": {"text": "Dockerfile runs as root: homelab/services/climate-auto-switch/Dockerfile"}, "properties": {"repobilityId": "bb5f6c96ee58c8d5", "scanner": "scanner-primary", "fingerprint": "bb6d7bc02ef44849", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-85b585e4749eddb7", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: ghcr.io/astral-sh/uv:${UV_VERSION}"}, "properties": {"repobilityId": "feaaed9c8d5a3139", "scanner": "scanner-primary", "fingerprint": "85b585e4749eddb7", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "homelab/services/climate-auto-switch/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-8c67bd757b2f7372", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "0f2b3b2e0cf76b58", "scanner": "scanner-primary", "fingerprint": "8c67bd757b2f7372", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "homelab/services/climate-auto-switch/Dockerfile"}, "region": {"startLine": 3}}}]}, {"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-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-59861a22de7ae266", "level": "error", "message": {"text": "Runtime dotenv file present in repo: homelab/services/taskchampion-sync/.env.vars"}, "properties": {"repobilityId": "e949ba615845cc06", "scanner": "scanner-primary", "fingerprint": "59861a22de7ae266", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "homelab/services/taskchampion-sync/.env.vars"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0b8107fca490452c", "level": "error", "message": {"text": "Runtime dotenv file present in repo: homelab/services/brineworks-agent/.env.vars"}, "properties": {"repobilityId": "61a9060858eb7664", "scanner": "scanner-primary", "fingerprint": "0b8107fca490452c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "homelab/services/brineworks-agent/.env.vars"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a854d161732503fd", "level": "error", "message": {"text": "Runtime dotenv file present in repo: homelab/services/brineworks-server/.env.vars"}, "properties": {"repobilityId": "32345cf80103d8e4", "scanner": "scanner-primary", "fingerprint": "a854d161732503fd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "homelab/services/brineworks-server/.env.vars"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fff8c1aedbef4984", "level": "error", "message": {"text": "Runtime dotenv file present in repo: homelab/services/backup/.env.vars"}, "properties": {"repobilityId": "0dcbd872e139e21a", "scanner": "scanner-primary", "fingerprint": "fff8c1aedbef4984", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "homelab/services/backup/.env.vars"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-88ce370dd6353f25", "level": "error", "message": {"text": "Runtime dotenv file present in repo: homelab/services/github-actions-runner/.env.vars"}, "properties": {"repobilityId": "75869111d3292369", "scanner": "scanner-primary", "fingerprint": "88ce370dd6353f25", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "homelab/services/github-actions-runner/.env.vars"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-61f43841bf0934dc", "level": "error", "message": {"text": "Runtime dotenv file present in repo: homelab/services/climate-auto-switch/.env.vars"}, "properties": {"repobilityId": "b34da295ea1d9f11", "scanner": "scanner-primary", "fingerprint": "61f43841bf0934dc", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "homelab/services/climate-auto-switch/.env.vars"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d1fa247950ceca5e", "level": "error", "message": {"text": "Insecure pattern 'tls_verify_false' in network/snapshot.py:103"}, "properties": {"repobilityId": "e511eb64d511fdec", "scanner": "scanner-primary", "fingerprint": "d1fa247950ceca5e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "tls_verify_false"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "network/snapshot.py"}, "region": {"startLine": 103}}}]}, {"ruleId": "scanner-ab9755be3c60e024", "level": "error", "message": {"text": "Insecure pattern 'tls_verify_false' in network/unifi/__init__.py:25"}, "properties": {"repobilityId": "84f6f00464ef161f", "scanner": "scanner-primary", "fingerprint": "ab9755be3c60e024", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "tls_verify_false"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "network/unifi/__init__.py"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "a5f5f9b04e512a0f", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "43c1a4972356a3cd", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "723255839a882dc9", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "334a819105b3f7cb", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "b84e10b52dec2146", "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": "2906aeef2ae25edd", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-41025f75808edcd0", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: _bmad/cis/workflows/bmad-cis-design-thinking/SKILL.md"}, "properties": {"repobilityId": "94d3562e6396e9eb", "scanner": "scanner-primary", "fingerprint": "41025f75808edcd0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "_bmad/cis/workflows/bmad-cis-design-thinking/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-861f44038f381328", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: _bmad/core/tasks/bmad-index-docs/SKILL.md"}, "properties": {"repobilityId": "a8fe96c6bc188a26", "scanner": "scanner-primary", "fingerprint": "861f44038f381328", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "_bmad/core/tasks/bmad-index-docs/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1d748a788d53824e", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: climate/CLAUDE.md"}, "properties": {"repobilityId": "d9beb7a41531c865", "scanner": "scanner-primary", "fingerprint": "1d748a788d53824e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "climate/CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fe56554bedfe2d0b", "level": "note", "message": {"text": "Legacy-named symbol `test_get_data_age_minutes_old` in tests/ambient/test_client.py:61"}, "properties": {"repobilityId": "9404c24ffded615d", "scanner": "scanner-primary", "fingerprint": "fe56554bedfe2d0b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0e6ee3775fdd7f55", "level": "note", "message": {"text": "Legacy-named symbol `get_legacy` in network/unifi/__init__.py:51"}, "properties": {"repobilityId": "5a7f0962f23020b9", "scanner": "scanner-primary", "fingerprint": "0e6ee3775fdd7f55", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1cc7195d87233b61", "level": "note", "message": {"text": "Legacy-named symbol `get_legacy` in network/unifi/usg.py:69"}, "properties": {"repobilityId": "3c07e8bc86261e95", "scanner": "scanner-primary", "fingerprint": "1cc7195d87233b61", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d0740adcd07e600b", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 climate/ecobee/history.py:187"}, "properties": {"repobilityId": "869212f7362a13f7", "scanner": "scanner-primary", "fingerprint": "d0740adcd07e600b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-250f57e8a1dbd3c5", "level": "none", "message": {"text": "4 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "57584f22b735b5ee", "scanner": "scanner-primary", "fingerprint": "250f57e8a1dbd3c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "f7e60c8ca7934015", "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": "c762d4be7444239d", "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": "686a96a24ac6df51", "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": "c72f6f07869c38da", "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": "d091f6f4b9055319", "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": "32e785a24d490263", "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": "96d2c6ab5d8dee77", "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": "436b27d2924fc02c", "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": "854bb6dd718337c1", "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": "f1e2338708cbdd67", "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": "b7d5100c6ac20347", "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": "c1d198f65d731be1", "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": "0e2ad563e6317f95", "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": "1251862d4f306dca", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}