{"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-3485cd85c5a7aa1e", "name": "Possibly dead Python function: format_breaking", "shortDescription": {"text": "Possibly dead Python function: format_breaking"}, "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-30089667127ec970", "name": "Possibly dead Python function: format_alert", "shortDescription": {"text": "Possibly dead Python function: format_alert"}, "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-63e257923b7c343b", "name": "Possibly dead Python function: needs_validation", "shortDescription": {"text": "Possibly dead Python function: needs_validation"}, "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-8014760953ed9cd4", "name": "Possibly dead Python function: push", "shortDescription": {"text": "Possibly dead Python function: push"}, "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-79ca8a092f424906", "name": "Possibly dead Python function: build_digest_text", "shortDescription": {"text": "Possibly dead Python function: build_digest_text"}, "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-7c462d2168237ecc", "name": "Possibly dead Python function: x_post", "shortDescription": {"text": "Possibly dead Python function: x_post"}, "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-4bbccb21307b6a38", "name": "Possibly dead Python function: is_active_session", "shortDescription": {"text": "Possibly dead Python function: is_active_session"}, "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-bd02bb7517cf0258", "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-4dc049822a4e7468", "name": "Privileged port 13 in use", "shortDescription": {"text": "Privileged port 13 in use"}, "fullDescription": {"text": "Port 13 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-4587f41046e8daae", "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-b67c87353a930611", "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-f8bd7f5d551f2d82", "name": "Privileged port 40 in use", "shortDescription": {"text": "Privileged port 40 in use"}, "fullDescription": {"text": "Port 40 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-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-979bb42c13a30d34", "name": "Very large file: src/main.py (1212 lines)", "shortDescription": {"text": "Very large file: src/main.py (1212 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-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-c7dd407052bf0917", "name": "Legacy-named symbol `hours_old` in tests/test_normalizer.py:11", "shortDescription": {"text": "Legacy-named symbol `hours_old` in tests/test_normalizer.py:11"}, "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-0dd994c157e601f3", "name": "Legacy-named symbol `ff_weekly_cache_v1` in scripts/push_ff_to_gas.py:17", "shortDescription": {"text": "Legacy-named symbol `ff_weekly_cache_v1` in scripts/push_ff_to_gas.py:17"}, "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-9ea0b6b397315d9a", "name": "Commented-code block (5 lines) in scripts/push_ff_to_gas.py:61", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/push_ff_to_gas.py:61"}, "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-147bb603748aabef", "name": "Commented-code block (5 lines) in src/dedup.py:24", "shortDescription": {"text": "Commented-code block (5 lines) in src/dedup.py:24"}, "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-01869bb5dde214be", "name": "Commented-code block (5 lines) in src/normalizer.py:14", "shortDescription": {"text": "Commented-code block (5 lines) in src/normalizer.py:14"}, "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-f7970114247d7ae8", "name": "Commented-code block (6 lines) in src/store.py:80", "shortDescription": {"text": "Commented-code block (6 lines) in src/store.py:80"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1ed72c393a738227", "name": "Commented-code block (5 lines) in src/line_flex.py:934", "shortDescription": {"text": "Commented-code block (5 lines) in src/line_flex.py:934"}, "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-ae8c1bbb812de5c8", "name": "Commented-code block (5 lines) in src/main.py:108", "shortDescription": {"text": "Commented-code block (5 lines) in src/main.py:108"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-af022f937dd5b7fd", "name": "9 env vars used in code but missing from .env.example", "shortDescription": {"text": "9 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANTHROPIC_API_KEY`, `APIFY_TOKEN`, `DRY_RUN`, `GAS_WEBAPP_TOKEN`, `GAS_WEBAPP_URL`, `GITHUB_REPOSITORY`, `GITHUB_TOKEN`, `LOG_LEVEL` + 1 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-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/router.py:format_breaking, src/router.py:format_alert\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/22499"}, "properties": {"repository": "walight999/gold-news-pipeline", "repoUrl": "https://github.com/walight999/gold-news-pipeline", "branch": "main"}, "results": [{"ruleId": "scanner-3485cd85c5a7aa1e", "level": "note", "message": {"text": "Possibly dead Python function: format_breaking"}, "properties": {"repobilityId": "bdbac42271653e46", "scanner": "scanner-primary", "fingerprint": "3485cd85c5a7aa1e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/router.py:150"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-30089667127ec970", "level": "note", "message": {"text": "Possibly dead Python function: format_alert"}, "properties": {"repobilityId": "852252079a2efe61", "scanner": "scanner-primary", "fingerprint": "30089667127ec970", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/router.py:163"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-63e257923b7c343b", "level": "note", "message": {"text": "Possibly dead Python function: needs_validation"}, "properties": {"repobilityId": "d01b25023849ef71", "scanner": "scanner-primary", "fingerprint": "63e257923b7c343b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/health.py:24"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8014760953ed9cd4", "level": "note", "message": {"text": "Possibly dead Python function: push"}, "properties": {"repobilityId": "dce58df0017d7e9c", "scanner": "scanner-primary", "fingerprint": "8014760953ed9cd4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/line_client.py:189"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-79ca8a092f424906", "level": "note", "message": {"text": "Possibly dead Python function: build_digest_text"}, "properties": {"repobilityId": "38cd3023715ea5b0", "scanner": "scanner-primary", "fingerprint": "79ca8a092f424906", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/digest.py:50"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7c462d2168237ecc", "level": "note", "message": {"text": "Possibly dead Python function: x_post"}, "properties": {"repobilityId": "73e720908cd289e5", "scanner": "scanner-primary", "fingerprint": "7c462d2168237ecc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/social_feed.py:198"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4bbccb21307b6a38", "level": "note", "message": {"text": "Possibly dead Python function: is_active_session"}, "properties": {"repobilityId": "c91080b82a2b1c1e", "scanner": "scanner-primary", "fingerprint": "4bbccb21307b6a38", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/utils_time.py:60"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bd02bb7517cf0258", "level": "warning", "message": {"text": "Privileged port 30 in use"}, "properties": {"repobilityId": "54f172e7d16fc662", "scanner": "scanner-primary", "fingerprint": "bd02bb7517cf0258", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "config/schedule.yaml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4dc049822a4e7468", "level": "warning", "message": {"text": "Privileged port 13 in use"}, "properties": {"repobilityId": "79d721e4d6f64798", "scanner": "scanner-primary", "fingerprint": "4dc049822a4e7468", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "config/schedule.yaml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4587f41046e8daae", "level": "warning", "message": {"text": "Privileged port 21 in use"}, "properties": {"repobilityId": "d920b7cd1b1a16dc", "scanner": "scanner-primary", "fingerprint": "4587f41046e8daae", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "config/schedule.yaml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b67c87353a930611", "level": "warning", "message": {"text": "Privileged port 14 in use"}, "properties": {"repobilityId": "2dbd4b719a1412ff", "scanner": "scanner-primary", "fingerprint": "b67c87353a930611", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "config/schedule.yaml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f8bd7f5d551f2d82", "level": "warning", "message": {"text": "Privileged port 40 in use"}, "properties": {"repobilityId": "28c59d470d4929c6", "scanner": "scanner-primary", "fingerprint": "f8bd7f5d551f2d82", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "config/schedule.yaml"}, "region": {"startLine": 1}}}]}, {"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-979bb42c13a30d34", "level": "note", "message": {"text": "Very large file: src/main.py (1212 lines)"}, "properties": {"repobilityId": "44c823c0d6ffefa1", "scanner": "scanner-primary", "fingerprint": "979bb42c13a30d34", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "d9c86a77deced2f3", "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": "f5a4212d20045d4e", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-c7dd407052bf0917", "level": "note", "message": {"text": "Legacy-named symbol `hours_old` in tests/test_normalizer.py:11"}, "properties": {"repobilityId": "7d9830fb9251e106", "scanner": "scanner-primary", "fingerprint": "c7dd407052bf0917", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0dd994c157e601f3", "level": "note", "message": {"text": "Legacy-named symbol `ff_weekly_cache_v1` in scripts/push_ff_to_gas.py:17"}, "properties": {"repobilityId": "140331f9d1440305", "scanner": "scanner-primary", "fingerprint": "0dd994c157e601f3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9ea0b6b397315d9a", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/push_ff_to_gas.py:61"}, "properties": {"repobilityId": "6b8ff9cde226543c", "scanner": "scanner-primary", "fingerprint": "9ea0b6b397315d9a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-147bb603748aabef", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/dedup.py:24"}, "properties": {"repobilityId": "db238413eefce9b1", "scanner": "scanner-primary", "fingerprint": "147bb603748aabef", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-01869bb5dde214be", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/normalizer.py:14"}, "properties": {"repobilityId": "5505b890e350edb0", "scanner": "scanner-primary", "fingerprint": "01869bb5dde214be", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f7970114247d7ae8", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/store.py:80"}, "properties": {"repobilityId": "26d94222b0518c2b", "scanner": "scanner-primary", "fingerprint": "f7970114247d7ae8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1ed72c393a738227", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/line_flex.py:934"}, "properties": {"repobilityId": "34ea4a1bc3d323a5", "scanner": "scanner-primary", "fingerprint": "1ed72c393a738227", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ae8c1bbb812de5c8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/main.py:108"}, "properties": {"repobilityId": "0ae4278062fab452", "scanner": "scanner-primary", "fingerprint": "ae8c1bbb812de5c8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af022f937dd5b7fd", "level": "note", "message": {"text": "9 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "5597384795dea7a4", "scanner": "scanner-primary", "fingerprint": "af022f937dd5b7fd", "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": "9cd7cc99a9557733", "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": "3782017c419bbc37", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}