{"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-d7ebf88477bac49e", "name": "Possibly dead Python function: check_health", "shortDescription": {"text": "Possibly dead Python function: check_health"}, "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-1c7b566f472f7d2e", "name": "Possibly dead Python function: when_ready", "shortDescription": {"text": "Possibly dead Python function: when_ready"}, "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-80c4783a61de7a1c", "name": "Possibly dead Python function: worker_int", "shortDescription": {"text": "Possibly dead Python function: worker_int"}, "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-d7f69721381f89c7", "name": "Possibly dead Python function: worker_abort", "shortDescription": {"text": "Possibly dead Python function: worker_abort"}, "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-56c231d6b8883a39", "name": "Possibly dead Python function: process_events", "shortDescription": {"text": "Possibly dead Python function: process_events"}, "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-65b4b953caf7f544", "name": "Possibly dead Python function: post_to_account", "shortDescription": {"text": "Possibly dead Python function: post_to_account"}, "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-5782af0967d1174c", "name": "Possibly dead Python function: post_worker_init_hook", "shortDescription": {"text": "Possibly dead Python function: post_worker_init_hook"}, "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-a7c51e32f984c861", "name": "Possibly dead Python function: stop", "shortDescription": {"text": "Possibly dead Python function: stop"}, "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-559dd44103e6d887", "name": "Possibly dead Python function: handle_startendtag", "shortDescription": {"text": "Possibly dead Python function: handle_startendtag"}, "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-8e0e2d75a5f0795a", "name": "Possibly dead Python function: handle_data", "shortDescription": {"text": "Possibly dead Python function: handle_data"}, "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-114d0db00d4c3272", "name": "Privileged port 256 in use", "shortDescription": {"text": "Privileged port 256 in use"}, "fullDescription": {"text": "Port 256 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-bd6b247a68fa1d05", "name": "Privileged port 397 in use", "shortDescription": {"text": "Privileged port 397 in use"}, "fullDescription": {"text": "Port 397 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-d63da3583b14afc0", "name": "Dockerfile runs as root: Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: 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-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-81ef957f185ca867", "name": "Insecure pattern 'exec_used' in src/posse/posse.py:1095", "shortDescription": {"text": "Insecure pattern 'exec_used' in src/posse/posse.py:1095"}, "fullDescription": {"text": "Found a known-risky pattern (exec_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-74ca8ee1a123f676", "name": "Insecure pattern 'debug_true' in src/posse/posse.py:924", "shortDescription": {"text": "Insecure pattern 'debug_true' in src/posse/posse.py:924"}, "fullDescription": {"text": "Found a known-risky pattern (debug_true). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-534d92ca89314bb6", "name": "Possible secret in src/social/bluesky_client.py", "shortDescription": {"text": "Possible secret in src/social/bluesky_client.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "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-b841c61fdfcff569", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-de53ac274e5b4ecf", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-37716d9c0a33ad5c", "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-487740d584f6dc6e", "name": "Very large file: tests/test_bluesky.py (1317 lines)", "shortDescription": {"text": "Very large file: tests/test_bluesky.py (1317 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-122c42e134cb5a47", "name": "Very large file: src/ghost/ghost.py (2172 lines)", "shortDescription": {"text": "Very large file: src/ghost/ghost.py (2172 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-323e9297b93937a5", "name": "Very large file: src/interactions/interaction_sync.py (1605 lines)", "shortDescription": {"text": "Very large file: src/interactions/interaction_sync.py (1605 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 5 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-675163ae832f9bf5", "name": "Commented-code block (12 lines) in src/ghost/gunicorn_config.py:33", "shortDescription": {"text": "Commented-code block (12 lines) in src/ghost/gunicorn_config.py:33"}, "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-75348046c50b46da", "name": "Commented-code block (5 lines) in src/notifications/pushover.py:519", "shortDescription": {"text": "Commented-code block (5 lines) in src/notifications/pushover.py:519"}, "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-de1c79c2ed3c2966", "name": "Commented-code block (8 lines) in src/posse/posse.py:708", "shortDescription": {"text": "Commented-code block (8 lines) in src/posse/posse.py:708"}, "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-abbd8ef16f4b1a13", "name": "Commented-code block (7 lines) in src/interactions/storage.py:18", "shortDescription": {"text": "Commented-code block (7 lines) in src/interactions/storage.py:18"}, "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-b2434b8dfaf12456", "name": "Commented-code block (5 lines) in src/interactions/interaction_sync.py:295", "shortDescription": {"text": "Commented-code block (5 lines) in src/interactions/interaction_sync.py:295"}, "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-75699e928722c91d", "name": "Commented-code block (6 lines) in src/social/mastodon_client.py:255", "shortDescription": {"text": "Commented-code block (6 lines) in src/social/mastodon_client.py:255"}, "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-5c2c51156d6e7c65", "name": "Commented-code block (5 lines) in src/social/bluesky_client.py:145", "shortDescription": {"text": "Commented-code block (5 lines) in src/social/bluesky_client.py:145"}, "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-5948c52793573010", "name": "Commented-code block (5 lines) in src/indieweb/receiver.py:243", "shortDescription": {"text": "Commented-code block (5 lines) in src/indieweb/receiver.py:243"}, "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-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/ghost/ghost.py:validate_ghost_post_id, src/ghost/ghost.py:validate_ghost_post\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-d04558a0318898f2", "name": "Flask mutation route `receive_ghost_post_update` without `@login_required` \u2014 src/ghost/ghost.py:763", "shortDescription": {"text": "Flask mutation route `receive_ghost_post_update` without `@login_required` \u2014 src/ghost/ghost.py:763"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6d6d6665aa61e18b", "name": "Flask mutation route `receive_ghost_post_deleted` without `@login_required` \u2014 src/ghost/ghost.py:929", "shortDescription": {"text": "Flask mutation route `receive_ghost_post_deleted` without `@login_required` \u2014 src/ghost/ghost.py:929"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-64692074662f5be9", "name": "Flask mutation route `receive_ghost_post` without `@login_required` \u2014 src/ghost/ghost.py:1079", "shortDescription": {"text": "Flask mutation route `receive_ghost_post` without `@login_required` \u2014 src/ghost/ghost.py:1079"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2df29ad1cfae96b4", "name": "Flask mutation route `trigger_interaction_sync` without `@login_required` \u2014 src/ghost/ghost.py:1515", "shortDescription": {"text": "Flask mutation route `trigger_interaction_sync` without `@login_required` \u2014 src/ghost/ghost.py:1515"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4008ef5c28cfa3dc", "name": "Flask mutation route `webmention_endpoint` without `@login_required` \u2014 src/ghost/ghost.py:1705", "shortDescription": {"text": "Flask mutation route `webmention_endpoint` without `@login_required` \u2014 src/ghost/ghost.py:1705"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a48a988a021a7aa1", "name": "Flask mutation route `submit_reply` without `@login_required` \u2014 src/ghost/ghost.py:1903", "shortDescription": {"text": "Flask mutation route `submit_reply` without `@login_required` \u2014 src/ghost/ghost.py:1903"}, "fullDescription": {"text": "Flask route declares POST/PUT/DELETE/PATCH methods without an auth decorator. Add `@login_required` (Flask-Login) or equivalent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e7b81429024d51b4", "name": "Unused endpoint: ANY /webhook/ghost/post-updated", "shortDescription": {"text": "Unused endpoint: ANY /webhook/ghost/post-updated"}, "fullDescription": {"text": "`src/ghost/ghost.py` declares `ANY /webhook/ghost/post-updated` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4251ecbee32aad0f", "name": "Unused endpoint: ANY /webhook/ghost/post-deleted", "shortDescription": {"text": "Unused endpoint: ANY /webhook/ghost/post-deleted"}, "fullDescription": {"text": "`src/ghost/ghost.py` declares `ANY /webhook/ghost/post-deleted` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-295dd7707969febb", "name": "Unused endpoint: ANY /webhook/ghost", "shortDescription": {"text": "Unused endpoint: ANY /webhook/ghost"}, "fullDescription": {"text": "`src/ghost/ghost.py` declares `ANY /webhook/ghost` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-756c043982929740", "name": "Unused endpoint: ANY /api/interactions/<ghost_post_id>", "shortDescription": {"text": "Unused endpoint: ANY /api/interactions/<ghost_post_id>"}, "fullDescription": {"text": "`src/ghost/ghost.py` declares `ANY /api/interactions/<ghost_post_id>` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-46654e9d800bbd3c", "name": "Unused endpoint: ANY /api/interactions/<ghost_post_id>/sync", "shortDescription": {"text": "Unused endpoint: ANY /api/interactions/<ghost_post_id>/sync"}, "fullDescription": {"text": "`src/ghost/ghost.py` declares `ANY /api/interactions/<ghost_post_id>/sync` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cfe4110a447e2406", "name": "Unused endpoint: ANY /api/webmentions", "shortDescription": {"text": "Unused endpoint: ANY /api/webmentions"}, "fullDescription": {"text": "`src/ghost/ghost.py` declares `ANY /api/webmentions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d9c6a5276cedbdb4", "name": "Unused endpoint: ANY /webmention", "shortDescription": {"text": "Unused endpoint: ANY /webmention"}, "fullDescription": {"text": "`src/ghost/ghost.py` declares `ANY /webmention` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d57824e0af5fb341", "name": "Unused endpoint: ANY /api/webmention/reply", "shortDescription": {"text": "Unused endpoint: ANY /api/webmention/reply"}, "fullDescription": {"text": "`src/ghost/ghost.py` declares `ANY /api/webmention/reply` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5ba335b4a01426dd", "name": "Unused endpoint: ANY /reply/<reply_id>", "shortDescription": {"text": "Unused endpoint: ANY /reply/<reply_id>"}, "fullDescription": {"text": "`src/ghost/ghost.py` declares `ANY /reply/<reply_id>` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/22870"}, "properties": {"repository": "wpowiertowski/posse", "repoUrl": "https://github.com/wpowiertowski/posse", "branch": "main"}, "results": [{"ruleId": "scanner-d7ebf88477bac49e", "level": "note", "message": {"text": "Possibly dead Python function: check_health"}, "properties": {"repobilityId": "c90f963d99aa5a4c", "scanner": "scanner-primary", "fingerprint": "d7ebf88477bac49e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/ghost/ghost_api.py:291"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1c7b566f472f7d2e", "level": "note", "message": {"text": "Possibly dead Python function: when_ready"}, "properties": {"repobilityId": "df01800f5374b1e5", "scanner": "scanner-primary", "fingerprint": "1c7b566f472f7d2e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/ghost/gunicorn_config.py:59"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-80c4783a61de7a1c", "level": "note", "message": {"text": "Possibly dead Python function: worker_int"}, "properties": {"repobilityId": "0228d46359b5edc3", "scanner": "scanner-primary", "fingerprint": "80c4783a61de7a1c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/ghost/gunicorn_config.py:67"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d7f69721381f89c7", "level": "note", "message": {"text": "Possibly dead Python function: worker_abort"}, "properties": {"repobilityId": "592bbdafdb291fd2", "scanner": "scanner-primary", "fingerprint": "d7f69721381f89c7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/ghost/gunicorn_config.py:71"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-56c231d6b8883a39", "level": "note", "message": {"text": "Possibly dead Python function: process_events"}, "properties": {"repobilityId": "1c2a84fe54410f8f", "scanner": "scanner-primary", "fingerprint": "56c231d6b8883a39", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/posse/posse.py:425"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-65b4b953caf7f544", "level": "note", "message": {"text": "Possibly dead Python function: post_to_account"}, "properties": {"repobilityId": "ecd3ed56d9b0fb99", "scanner": "scanner-primary", "fingerprint": "65b4b953caf7f544", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/posse/posse.py:554"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5782af0967d1174c", "level": "note", "message": {"text": "Possibly dead Python function: post_worker_init_hook"}, "properties": {"repobilityId": "be3255e24f89ce2f", "scanner": "scanner-primary", "fingerprint": "5782af0967d1174c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/posse/posse.py:1101"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a7c51e32f984c861", "level": "note", "message": {"text": "Possibly dead Python function: stop"}, "properties": {"repobilityId": "ba22d90d343a0bd9", "scanner": "scanner-primary", "fingerprint": "a7c51e32f984c861", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/interactions/scheduler.py:131"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-559dd44103e6d887", "level": "note", "message": {"text": "Possibly dead Python function: handle_startendtag"}, "properties": {"repobilityId": "259e69d47dc2412b", "scanner": "scanner-primary", "fingerprint": "559dd44103e6d887", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/indieweb/content_sanitizer.py:62"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8e0e2d75a5f0795a", "level": "note", "message": {"text": "Possibly dead Python function: handle_data"}, "properties": {"repobilityId": "3a673a278f4fc1e6", "scanner": "scanner-primary", "fingerprint": "8e0e2d75a5f0795a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/indieweb/content_sanitizer.py:149"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-114d0db00d4c3272", "level": "warning", "message": {"text": "Privileged port 256 in use"}, "properties": {"repobilityId": "0ec1f2d0c9e6da94", "scanner": "scanner-primary", "fingerprint": "114d0db00d4c3272", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bd6b247a68fa1d05", "level": "warning", "message": {"text": "Privileged port 397 in use"}, "properties": {"repobilityId": "cf55d5fb961b00ad", "scanner": "scanner-primary", "fingerprint": "bd6b247a68fa1d05", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d63da3583b14afc0", "level": "warning", "message": {"text": "Dockerfile runs as root: Dockerfile"}, "properties": {"repobilityId": "a2ed1bd120e507db", "scanner": "scanner-primary", "fingerprint": "d63da3583b14afc0", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"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-81ef957f185ca867", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in src/posse/posse.py:1095"}, "properties": {"repobilityId": "28c14714abc7320a", "scanner": "scanner-primary", "fingerprint": "81ef957f185ca867", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/posse/posse.py"}, "region": {"startLine": 1095}}}]}, {"ruleId": "scanner-74ca8ee1a123f676", "level": "note", "message": {"text": "Insecure pattern 'debug_true' in src/posse/posse.py:924"}, "properties": {"repobilityId": "2cca8aaa9e4441e2", "scanner": "scanner-primary", "fingerprint": "74ca8ee1a123f676", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "debug_true"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/posse/posse.py"}, "region": {"startLine": 924}}}]}, {"ruleId": "scanner-534d92ca89314bb6", "level": "error", "message": {"text": "Possible secret in src/social/bluesky_client.py"}, "properties": {"repobilityId": "e8500d348710088c", "scanner": "scanner-primary", "fingerprint": "534d92ca89314bb6", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/social/bluesky_client.py"}, "region": {"startLine": 84}}}]}, {"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-b841c61fdfcff569", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "83a185deafa37ffa", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4fb72da33f9def3e", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "97bc0c0574f7b461", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "cd6d9375d293facd", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-b841c61fdfcff569", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1b903f620f035394", "scanner": "scanner-primary", "fingerprint": "b841c61fdfcff569", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-publish.yml"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-de53ac274e5b4ecf", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "02600186fc092bd4", "scanner": "scanner-primary", "fingerprint": "de53ac274e5b4ecf", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/claude.yml"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-de53ac274e5b4ecf", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "919801c6ad2109a9", "scanner": "scanner-primary", "fingerprint": "de53ac274e5b4ecf", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/claude.yml"}, "region": {"startLine": 35}}}]}, {"ruleId": "scanner-37716d9c0a33ad5c", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "abfb5752158cf655", "scanner": "scanner-primary", "fingerprint": "37716d9c0a33ad5c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/claude.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-487740d584f6dc6e", "level": "note", "message": {"text": "Very large file: tests/test_bluesky.py (1317 lines)"}, "properties": {"repobilityId": "09e932362dd96e18", "scanner": "scanner-primary", "fingerprint": "487740d584f6dc6e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-122c42e134cb5a47", "level": "note", "message": {"text": "Very large file: src/ghost/ghost.py (2172 lines)"}, "properties": {"repobilityId": "89793d35068e771b", "scanner": "scanner-primary", "fingerprint": "122c42e134cb5a47", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-323e9297b93937a5", "level": "note", "message": {"text": "Very large file: src/interactions/interaction_sync.py (1605 lines)"}, "properties": {"repobilityId": "c64d6b2234eef28a", "scanner": "scanner-primary", "fingerprint": "323e9297b93937a5", "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": "b66c2fe2ab06d7cc", "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": "cbb7242ea5b3546d", "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": "8b7001897529fbce", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-675163ae832f9bf5", "level": "none", "message": {"text": "Commented-code block (12 lines) in src/ghost/gunicorn_config.py:33"}, "properties": {"repobilityId": "b54855dc5e06d164", "scanner": "scanner-primary", "fingerprint": "675163ae832f9bf5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-75348046c50b46da", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/notifications/pushover.py:519"}, "properties": {"repobilityId": "56b04df1296408e2", "scanner": "scanner-primary", "fingerprint": "75348046c50b46da", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-de1c79c2ed3c2966", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/posse/posse.py:708"}, "properties": {"repobilityId": "e4bfa92790baf8e1", "scanner": "scanner-primary", "fingerprint": "de1c79c2ed3c2966", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-abbd8ef16f4b1a13", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/interactions/storage.py:18"}, "properties": {"repobilityId": "6bb920a85b6ca984", "scanner": "scanner-primary", "fingerprint": "abbd8ef16f4b1a13", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2434b8dfaf12456", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/interactions/interaction_sync.py:295"}, "properties": {"repobilityId": "ae372b36d516cbdd", "scanner": "scanner-primary", "fingerprint": "b2434b8dfaf12456", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-75699e928722c91d", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/social/mastodon_client.py:255"}, "properties": {"repobilityId": "409aa875c4995f92", "scanner": "scanner-primary", "fingerprint": "75699e928722c91d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5c2c51156d6e7c65", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/social/bluesky_client.py:145"}, "properties": {"repobilityId": "784d6c124900f695", "scanner": "scanner-primary", "fingerprint": "5c2c51156d6e7c65", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5948c52793573010", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/indieweb/receiver.py:243"}, "properties": {"repobilityId": "114314da4edd8a21", "scanner": "scanner-primary", "fingerprint": "5948c52793573010", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "e92011ae3dbc73e8", "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": "b11963bc44b05663", "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": "ce5c055894aa1759", "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": "6e724507c14158d8", "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": "e47a6e5031ad007e", "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": "5e8d1147e1d3369f", "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": "e3fc63e889961acb", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-d04558a0318898f2", "level": "error", "message": {"text": "Flask mutation route `receive_ghost_post_update` without `@login_required` \u2014 src/ghost/ghost.py:763"}, "properties": {"repobilityId": "3830e3df570c45f7", "scanner": "scanner-primary", "fingerprint": "d04558a0318898f2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/ghost/ghost.py"}, "region": {"startLine": 763}}}]}, {"ruleId": "scanner-6d6d6665aa61e18b", "level": "error", "message": {"text": "Flask mutation route `receive_ghost_post_deleted` without `@login_required` \u2014 src/ghost/ghost.py:929"}, "properties": {"repobilityId": "777035a0baca9232", "scanner": "scanner-primary", "fingerprint": "6d6d6665aa61e18b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/ghost/ghost.py"}, "region": {"startLine": 929}}}]}, {"ruleId": "scanner-64692074662f5be9", "level": "error", "message": {"text": "Flask mutation route `receive_ghost_post` without `@login_required` \u2014 src/ghost/ghost.py:1079"}, "properties": {"repobilityId": "9035b178534ad31e", "scanner": "scanner-primary", "fingerprint": "64692074662f5be9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/ghost/ghost.py"}, "region": {"startLine": 1079}}}]}, {"ruleId": "scanner-2df29ad1cfae96b4", "level": "error", "message": {"text": "Flask mutation route `trigger_interaction_sync` without `@login_required` \u2014 src/ghost/ghost.py:1515"}, "properties": {"repobilityId": "f0685fa42f5ea613", "scanner": "scanner-primary", "fingerprint": "2df29ad1cfae96b4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/ghost/ghost.py"}, "region": {"startLine": 1515}}}]}, {"ruleId": "scanner-4008ef5c28cfa3dc", "level": "error", "message": {"text": "Flask mutation route `webmention_endpoint` without `@login_required` \u2014 src/ghost/ghost.py:1705"}, "properties": {"repobilityId": "de0a93b1be93f61c", "scanner": "scanner-primary", "fingerprint": "4008ef5c28cfa3dc", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/ghost/ghost.py"}, "region": {"startLine": 1705}}}]}, {"ruleId": "scanner-a48a988a021a7aa1", "level": "error", "message": {"text": "Flask mutation route `submit_reply` without `@login_required` \u2014 src/ghost/ghost.py:1903"}, "properties": {"repobilityId": "dbd2dc56b0674c4d", "scanner": "scanner-primary", "fingerprint": "a48a988a021a7aa1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.flask.unauth_route"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/ghost/ghost.py"}, "region": {"startLine": 1903}}}]}, {"ruleId": "scanner-e7b81429024d51b4", "level": "note", "message": {"text": "Unused endpoint: ANY /webhook/ghost/post-updated"}, "properties": {"repobilityId": "9a28cb2ddd72f0f9", "scanner": "scanner-primary", "fingerprint": "e7b81429024d51b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4251ecbee32aad0f", "level": "note", "message": {"text": "Unused endpoint: ANY /webhook/ghost/post-deleted"}, "properties": {"repobilityId": "471db89c2b2e2ba2", "scanner": "scanner-primary", "fingerprint": "4251ecbee32aad0f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-295dd7707969febb", "level": "note", "message": {"text": "Unused endpoint: ANY /webhook/ghost"}, "properties": {"repobilityId": "f96061f5c119c590", "scanner": "scanner-primary", "fingerprint": "295dd7707969febb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-756c043982929740", "level": "note", "message": {"text": "Unused endpoint: ANY /api/interactions/<ghost_post_id>"}, "properties": {"repobilityId": "a6de3614c12d3c49", "scanner": "scanner-primary", "fingerprint": "756c043982929740", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-46654e9d800bbd3c", "level": "note", "message": {"text": "Unused endpoint: ANY /api/interactions/<ghost_post_id>/sync"}, "properties": {"repobilityId": "77ddc2c81661a62a", "scanner": "scanner-primary", "fingerprint": "46654e9d800bbd3c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cfe4110a447e2406", "level": "note", "message": {"text": "Unused endpoint: ANY /api/webmentions"}, "properties": {"repobilityId": "04b8571ac46d9263", "scanner": "scanner-primary", "fingerprint": "cfe4110a447e2406", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d9c6a5276cedbdb4", "level": "note", "message": {"text": "Unused endpoint: ANY /webmention"}, "properties": {"repobilityId": "1fc41782dd286192", "scanner": "scanner-primary", "fingerprint": "d9c6a5276cedbdb4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d57824e0af5fb341", "level": "note", "message": {"text": "Unused endpoint: ANY /api/webmention/reply"}, "properties": {"repobilityId": "0fc4b72f754b0133", "scanner": "scanner-primary", "fingerprint": "d57824e0af5fb341", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5ba335b4a01426dd", "level": "note", "message": {"text": "Unused endpoint: ANY /reply/<reply_id>"}, "properties": {"repobilityId": "7104eedc6198a4a5", "scanner": "scanner-primary", "fingerprint": "5ba335b4a01426dd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}