{"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-6f5d5ab05de22716", "name": "Possibly dead Python function: parse_datetime_value", "shortDescription": {"text": "Possibly dead Python function: parse_datetime_value"}, "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-d5e3161ea648fd2e", "name": "Possibly dead Python function: decorator", "shortDescription": {"text": "Possibly dead Python function: decorator"}, "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-d7231ff50c6fd79b", "name": "Possibly dead Python function: lookup_user", "shortDescription": {"text": "Possibly dead Python function: lookup_user"}, "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-8820958c120e26c1", "name": "Possibly dead Python function: send_message", "shortDescription": {"text": "Possibly dead Python function: send_message"}, "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-e1e4e29bb82ff741", "name": "TODO/FIXME marker in shipping code \u2014 src/components/DateRange.tsx:118", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/DateRange.tsx:118"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-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-835eae4c7f17a2f8", "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-a6354df94fa06a9a", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.13", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.13"}, "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-3c3a2fa289037b1b", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-python@v6 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-266162aa2c525a31", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-python@v6 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-e4d1768f3ce1e1c9", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-python@v6 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-93afed2afb1d3d4a", "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@v6 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-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-python@v6 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-cb639d9a10a47b23", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7bf94b3f644ad363", "name": "Very large file: tests/test_disallow_self_add_constraint.py (1994 lines)", "shortDescription": {"text": "Very large file: tests/test_disallow_self_add_constraint.py (1994 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-cce165a377121290", "name": "Very large file: tests/test_role_request.py (1491 lines)", "shortDescription": {"text": "Very large file: tests/test_role_request.py (1491 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-233a46c14890ad74", "name": "Very large file: tests/test_role.py (1659 lines)", "shortDescription": {"text": "Very large file: tests/test_role.py (1659 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-e41f7cf72af2b57e", "name": "Very large file: tests/test_group.py (1722 lines)", "shortDescription": {"text": "Very large file: tests/test_group.py (1722 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-da48031df526c5eb", "name": "Very large file: tests/test_require_reason_constraint.py (1528 lines)", "shortDescription": {"text": "Very large file: tests/test_require_reason_constraint.py (1528 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-6ee7ee2797c39253", "name": "Very large file: tests/test_group_request.py (2564 lines)", "shortDescription": {"text": "Very large file: tests/test_group_request.py (2564 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-2ad610134d4ab961", "name": "Very large file: tests/test_app_group_lifecycle_plugin.py (2090 lines)", "shortDescription": {"text": "Very large file: tests/test_app_group_lifecycle_plugin.py (2090 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-12e737f22545d760", "name": "Very large file: api/models/core_models.py (1259 lines)", "shortDescription": {"text": "Very large file: api/models/core_models.py (1259 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-c5b210ec2659afb0", "name": "Very large file: api/mcp/tools.py (1468 lines)", "shortDescription": {"text": "Very large file: api/mcp/tools.py (1468 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-85537989e1e212ee", "name": "Very large file: src/api/apiComponents.ts (3347 lines)", "shortDescription": {"text": "Very large file: src/api/apiComponents.ts (3347 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-b69357a64886281a", "name": "Very large file: src/pages/group_requests/Read.tsx (1089 lines)", "shortDescription": {"text": "Very large file: src/pages/group_requests/Read.tsx (1089 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "41 tests / 215 src (ratio 0.19)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-09bad5ab1f174fc5", "name": "34 TODO/FIXME markers", "shortDescription": {"text": "34 TODO/FIXME markers"}, "fullDescription": {"text": "High count of TODO/FIXME/HACK markers \u2014 track them as issues so they're not forgotten."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "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-17f08aa594dbf12d", "name": "Commented-code block (5 lines) in vite.config.ts:37", "shortDescription": {"text": "Commented-code block (5 lines) in vite.config.ts:37"}, "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-2fb6656af6ee5310", "name": "Commented-code block (5 lines) in setup.py:9", "shortDescription": {"text": "Commented-code block (5 lines) in setup.py:9"}, "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-b430548edeed3eb9", "name": "Commented-code block (7 lines) in tests/conftest.py:55", "shortDescription": {"text": "Commented-code block (7 lines) in tests/conftest.py:55"}, "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-585ddcad0458c3cc", "name": "Legacy-named symbol `u_old` in tests/test_audit.py:420", "shortDescription": {"text": "Legacy-named symbol `u_old` in tests/test_audit.py:420"}, "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-807f7dc6f1faec10", "name": "Commented-code block (6 lines) in tests/test_oidc.py:131", "shortDescription": {"text": "Commented-code block (6 lines) in tests/test_oidc.py:131"}, "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-22cc6539f9753767", "name": "Legacy-named symbol `grouped_tomorrow_old` in api/syncer.py:474", "shortDescription": {"text": "Legacy-named symbol `grouped_tomorrow_old` in api/syncer.py:474"}, "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-488388919a06f0a3", "name": "Commented-code block (8 lines) in api/config.py:104", "shortDescription": {"text": "Commented-code block (8 lines) in api/config.py:104"}, "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-6605e72c9f63314c", "name": "Commented-code block (5 lines) in api/app.py:131", "shortDescription": {"text": "Commented-code block (5 lines) in api/app.py:131"}, "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-18fe6601e20a015e", "name": "Commented-code block (5 lines) in api/manage.py:38", "shortDescription": {"text": "Commented-code block (5 lines) in api/manage.py:38"}, "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-8f266b024b33cb70", "name": "Commented-code block (8 lines) in api/schemas/core_schemas.py:129", "shortDescription": {"text": "Commented-code block (8 lines) in api/schemas/core_schemas.py:129"}, "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-e61e3d2ebbe90070", "name": "Commented-code block (6 lines) in api/schemas/requests_schemas.py:52", "shortDescription": {"text": "Commented-code block (6 lines) in api/schemas/requests_schemas.py:52"}, "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-2c6b7c594f430189", "name": "Commented-code block (5 lines) in api/operations/approve_access_request.py:29", "shortDescription": {"text": "Commented-code block (5 lines) in api/operations/approve_access_request.py:29"}, "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-9d1c0b071b23e3f6", "name": "Commented-code block (6 lines) in api/operations/create_role_request.py:58", "shortDescription": {"text": "Commented-code block (6 lines) in api/operations/create_role_request.py:58"}, "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-c08eda31d4f5d450", "name": "Commented-code block (6 lines) in api/auth/dependencies.py:124", "shortDescription": {"text": "Commented-code block (6 lines) in api/auth/dependencies.py:124"}, "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-cccd748099f9ae8f", "name": "Commented-code block (7 lines) in api/auth/cloudflare.py:26", "shortDescription": {"text": "Commented-code block (7 lines) in api/auth/cloudflare.py:26"}, "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-b9e5cc9f4ca99518", "name": "Commented-code block (6 lines) in api/routers/health.py:18", "shortDescription": {"text": "Commented-code block (6 lines) in api/routers/health.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-aad74cbed7a33835", "name": "Commented-code block (6 lines) in api/routers/audit.py:185", "shortDescription": {"text": "Commented-code block (6 lines) in api/routers/audit.py:185"}, "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-d510fe0c0edf4f31", "name": "Commented-code block (5 lines) in api/routers/roles.py:47", "shortDescription": {"text": "Commented-code block (5 lines) in api/routers/roles.py:47"}, "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-0de5c59c484f3716", "name": "Commented-code block (6 lines) in api/routers/role_requests.py:129", "shortDescription": {"text": "Commented-code block (6 lines) in api/routers/role_requests.py:129"}, "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-b7c58fce73da122b", "name": "Commented-code block (5 lines) in api/routers/access_requests.py:41", "shortDescription": {"text": "Commented-code block (5 lines) in api/routers/access_requests.py:41"}, "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-c3609235fec4cd99", "name": "Commented-code block (6 lines) in api/routers/groups.py:312", "shortDescription": {"text": "Commented-code block (6 lines) in api/routers/groups.py:312"}, "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-7346ca69d83bd652", "name": "Commented-code block (7 lines) in api/mcp/server.py:92", "shortDescription": {"text": "Commented-code block (7 lines) in api/mcp/server.py:92"}, "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-6d00dd070cf604f7", "name": "Commented-code block (5 lines) in api/mcp/prompts.py:23", "shortDescription": {"text": "Commented-code block (5 lines) in api/mcp/prompts.py:23"}, "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-b8286e2004964191", "name": "Commented-code block (5 lines) in api/mcp/tools.py:141", "shortDescription": {"text": "Commented-code block (5 lines) in api/mcp/tools.py:141"}, "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-fdbf1b747a40c02a", "name": "Commented-code block (6 lines) in api/mcp/auth/__init__.py:25", "shortDescription": {"text": "Commented-code block (6 lines) in api/mcp/auth/__init__.py:25"}, "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-6b6f6d37fab15e67", "name": "Commented-code block (6 lines) in api/mcp/auth/cloudflare.py:151", "shortDescription": {"text": "Commented-code block (6 lines) in api/mcp/auth/cloudflare.py:151"}, "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-731a2bb158bfd313", "name": "Commented-code block (5 lines) in src/helpers.tsx:21", "shortDescription": {"text": "Commented-code block (5 lines) in src/helpers.tsx:21"}, "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-b5dcf266f389ee61", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/api/apiFetcher.ts:66", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/api/apiFetcher.ts:66"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-83d6f7360bcf7c61", "name": "Commented-code block (5 lines) in src/pages/roles/AddGroups.tsx:151", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/roles/AddGroups.tsx:151"}, "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-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\napi/middleware.py:dispatch, api/middleware.py:dispatch, api/middleware.py:dispatch, api/middleware.py:dispatch\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-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:\napi/exception_handlers.py:request_validation_handler, api/exception_handlers.py:pydantic_validation_handler\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-05f0860d0fb0cad3", "name": "Frontend route `/users/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/users/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-40a501a936c1b770", "name": "Frontend route `/users/:id/audit` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/users/:id/audit` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e1796d589d966c33", "name": "Frontend route `/groups/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/groups/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7f5fd1f180d8a8f7", "name": "Frontend route `/groups/:id/audit` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/groups/:id/audit` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8c2e9222095bb81a", "name": "Frontend route `/roles/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/roles/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-618a142358542653", "name": "Frontend route `/roles/:id/audit` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/roles/:id/audit` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0b560fc09267b93f", "name": "Frontend route `/apps/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/apps/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a873a871ec5c2181", "name": "Frontend route `/requests/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/requests/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f777137d3e4da6c4", "name": "Frontend route `/tags` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/tags` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-39bd645ac2c731c7", "name": "Frontend route `/tags/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/tags/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-89f460b8a13e2625", "name": "Frontend route `/role-requests/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/role-requests/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-12555cfaf6ac27ab", "name": "Frontend route `/group-requests/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/group-requests/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-21a038af57765020", "name": "FastAPI POST `post_group_request` without auth dependency \u2014 api/routers/group_requests.py:158", "shortDescription": {"text": "FastAPI POST `post_group_request` without auth dependency \u2014 api/routers/group_requests.py:158"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2b4acc48ed923080", "name": "FastAPI PUT `put_group_request` without auth dependency \u2014 api/routers/group_requests.py:222", "shortDescription": {"text": "FastAPI PUT `put_group_request` without auth dependency \u2014 api/routers/group_requests.py:222"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8f8cef584eff4628", "name": "FastAPI PUT `put_role_members` without auth dependency \u2014 api/routers/roles.py:131", "shortDescription": {"text": "FastAPI PUT `put_role_members` without auth dependency \u2014 api/routers/roles.py:131"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-19f467bd2fb90d62", "name": "FastAPI POST `post_role_request` without auth dependency \u2014 api/routers/role_requests.py:347", "shortDescription": {"text": "FastAPI POST `post_role_request` without auth dependency \u2014 api/routers/role_requests.py:347"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-86736f4eb1afb909", "name": "FastAPI PUT `put_role_request` without auth dependency \u2014 api/routers/role_requests.py:399", "shortDescription": {"text": "FastAPI PUT `put_role_request` without auth dependency \u2014 api/routers/role_requests.py:399"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8abce838e0d3c746", "name": "FastAPI POST `post_access_request` without auth dependency \u2014 api/routers/access_requests.py:207", "shortDescription": {"text": "FastAPI POST `post_access_request` without auth dependency \u2014 api/routers/access_requests.py:207"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6768b873f4c17be3", "name": "FastAPI PUT `put_access_request` without auth dependency \u2014 api/routers/access_requests.py:257", "shortDescription": {"text": "FastAPI PUT `put_access_request` without auth dependency \u2014 api/routers/access_requests.py:257"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-700c17fa07293d68", "name": "FastAPI POST `post_group` without auth dependency \u2014 api/routers/groups.py:140", "shortDescription": {"text": "FastAPI POST `post_group` without auth dependency \u2014 api/routers/groups.py:140"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a3bc78027762a0a3", "name": "FastAPI PUT `put_group` without auth dependency \u2014 api/routers/groups.py:201", "shortDescription": {"text": "FastAPI PUT `put_group` without auth dependency \u2014 api/routers/groups.py:201"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ab5a46442dc31633", "name": "FastAPI DELETE `delete_group` without auth dependency \u2014 api/routers/groups.py:414", "shortDescription": {"text": "FastAPI DELETE `delete_group` without auth dependency \u2014 api/routers/groups.py:414"}, "fullDescription": {"text": "`@router.delete` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3170c9bb0be30720", "name": "FastAPI PUT `put_group_members` without auth dependency \u2014 api/routers/groups.py:468", "shortDescription": {"text": "FastAPI PUT `put_group_members` without auth dependency \u2014 api/routers/groups.py:468"}, "fullDescription": {"text": "`@router.put` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-57081655997c3a8b", "name": "FastAPI POST `post_sentry` without auth dependency \u2014 api/routers/bugs.py:30", "shortDescription": {"text": "FastAPI POST `post_sentry` without auth dependency \u2014 api/routers/bugs.py:30"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/25427"}, "properties": {"repository": "discord/access", "repoUrl": "https://github.com/discord/access", "branch": "main"}, "results": [{"ruleId": "scanner-6f5d5ab05de22716", "level": "note", "message": {"text": "Possibly dead Python function: parse_datetime_value"}, "properties": {"repobilityId": "642d118958db3db2", "scanner": "scanner-primary", "fingerprint": "6f5d5ab05de22716", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/schemas/datetimes.py:36"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d5e3161ea648fd2e", "level": "note", "message": {"text": "Possibly dead Python function: decorator"}, "properties": {"repobilityId": "ffbcbc9bc189af1c", "scanner": "scanner-primary", "fingerprint": "d5e3161ea648fd2e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/mcp/auth/__init__.py:155"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d7231ff50c6fd79b", "level": "note", "message": {"text": "Possibly dead Python function: lookup_user"}, "properties": {"repobilityId": "87e09cd731678956", "scanner": "scanner-primary", "fingerprint": "d7231ff50c6fd79b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "examples/plugins/notifications_slack/notifications.py:242"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8820958c120e26c1", "level": "note", "message": {"text": "Possibly dead Python function: send_message"}, "properties": {"repobilityId": "1249251570e4ca4d", "scanner": "scanner-primary", "fingerprint": "8820958c120e26c1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "examples/plugins/notifications_slack/notifications.py:289"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e1e4e29bb82ff741", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/DateRange.tsx:118"}, "properties": {"repobilityId": "da9507a8743bc806", "scanner": "scanner-primary", "fingerprint": "e1e4e29bb82ff741", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"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-835eae4c7f17a2f8", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "c35924a040ab7bdc", "scanner": "scanner-primary", "fingerprint": "835eae4c7f17a2f8", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-a6354df94fa06a9a", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.13"}, "properties": {"repobilityId": "0f666d5d25019332", "scanner": "scanner-primary", "fingerprint": "a6354df94fa06a9a", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-3c3a2fa289037b1b", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "5e39693655d71627", "scanner": "scanner-primary", "fingerprint": "3c3a2fa289037b1b", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/db-migrations.yml"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-266162aa2c525a31", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "fe33aafb64ea7991", "scanner": "scanner-primary", "fingerprint": "266162aa2c525a31", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/lint.yml"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-e4d1768f3ce1e1c9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "cb8b77f9a1037736", "scanner": "scanner-primary", "fingerprint": "e4d1768f3ce1e1c9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/openapi-client-drift.yml"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-e4d1768f3ce1e1c9", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6b5f7201d27e9f3c", "scanner": "scanner-primary", "fingerprint": "e4d1768f3ce1e1c9", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/openapi-client-drift.yml"}, "region": {"startLine": 43}}}]}, {"ruleId": "scanner-93afed2afb1d3d4a", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "4a0f5811b54252f8", "scanner": "scanner-primary", "fingerprint": "93afed2afb1d3d4a", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-image.yml"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-93afed2afb1d3d4a", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e571417a264793fd", "scanner": "scanner-primary", "fingerprint": "93afed2afb1d3d4a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-image.yml"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-93afed2afb1d3d4a", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f7085d79d57646f4", "scanner": "scanner-primary", "fingerprint": "93afed2afb1d3d4a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-image.yml"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-93afed2afb1d3d4a", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "0337b922bc19646e", "scanner": "scanner-primary", "fingerprint": "93afed2afb1d3d4a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/docker-image.yml"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1b0add4759a308ec", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "b86179956da3a4a8", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7bf94b3f644ad363", "level": "note", "message": {"text": "Very large file: tests/test_disallow_self_add_constraint.py (1994 lines)"}, "properties": {"repobilityId": "f3c0f680da243fd2", "scanner": "scanner-primary", "fingerprint": "7bf94b3f644ad363", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cce165a377121290", "level": "note", "message": {"text": "Very large file: tests/test_role_request.py (1491 lines)"}, "properties": {"repobilityId": "3cc690690c2947e0", "scanner": "scanner-primary", "fingerprint": "cce165a377121290", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-233a46c14890ad74", "level": "note", "message": {"text": "Very large file: tests/test_role.py (1659 lines)"}, "properties": {"repobilityId": "16d67cb7e5407c40", "scanner": "scanner-primary", "fingerprint": "233a46c14890ad74", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e41f7cf72af2b57e", "level": "note", "message": {"text": "Very large file: tests/test_group.py (1722 lines)"}, "properties": {"repobilityId": "d4e6430a55ccd916", "scanner": "scanner-primary", "fingerprint": "e41f7cf72af2b57e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-da48031df526c5eb", "level": "note", "message": {"text": "Very large file: tests/test_require_reason_constraint.py (1528 lines)"}, "properties": {"repobilityId": "5c856dae599cef8f", "scanner": "scanner-primary", "fingerprint": "da48031df526c5eb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6ee7ee2797c39253", "level": "note", "message": {"text": "Very large file: tests/test_group_request.py (2564 lines)"}, "properties": {"repobilityId": "3bb26ca752e63d73", "scanner": "scanner-primary", "fingerprint": "6ee7ee2797c39253", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2ad610134d4ab961", "level": "note", "message": {"text": "Very large file: tests/test_app_group_lifecycle_plugin.py (2090 lines)"}, "properties": {"repobilityId": "c72414215d9c8d3f", "scanner": "scanner-primary", "fingerprint": "2ad610134d4ab961", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-12e737f22545d760", "level": "note", "message": {"text": "Very large file: api/models/core_models.py (1259 lines)"}, "properties": {"repobilityId": "96514b875744d0c5", "scanner": "scanner-primary", "fingerprint": "12e737f22545d760", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c5b210ec2659afb0", "level": "note", "message": {"text": "Very large file: api/mcp/tools.py (1468 lines)"}, "properties": {"repobilityId": "0c2e3bd76632042b", "scanner": "scanner-primary", "fingerprint": "c5b210ec2659afb0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-85537989e1e212ee", "level": "note", "message": {"text": "Very large file: src/api/apiComponents.ts (3347 lines)"}, "properties": {"repobilityId": "dfd2ab312b62f470", "scanner": "scanner-primary", "fingerprint": "85537989e1e212ee", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b69357a64886281a", "level": "note", "message": {"text": "Very large file: src/pages/group_requests/Read.tsx (1089 lines)"}, "properties": {"repobilityId": "68f1ea1e08a24689", "scanner": "scanner-primary", "fingerprint": "b69357a64886281a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-09bad5ab1f174fc5", "level": "note", "message": {"text": "34 TODO/FIXME markers"}, "properties": {"repobilityId": "4b38c118003e07d2", "scanner": "scanner-primary", "fingerprint": "09bad5ab1f174fc5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["maintenance"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "917c99a14766b577", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-17f08aa594dbf12d", "level": "none", "message": {"text": "Commented-code block (5 lines) in vite.config.ts:37"}, "properties": {"repobilityId": "9c49f5abda76786f", "scanner": "scanner-primary", "fingerprint": "17f08aa594dbf12d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2fb6656af6ee5310", "level": "none", "message": {"text": "Commented-code block (5 lines) in setup.py:9"}, "properties": {"repobilityId": "0346d2b90cdb3bb0", "scanner": "scanner-primary", "fingerprint": "2fb6656af6ee5310", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b430548edeed3eb9", "level": "none", "message": {"text": "Commented-code block (7 lines) in tests/conftest.py:55"}, "properties": {"repobilityId": "aeb9321ee23ae256", "scanner": "scanner-primary", "fingerprint": "b430548edeed3eb9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-585ddcad0458c3cc", "level": "note", "message": {"text": "Legacy-named symbol `u_old` in tests/test_audit.py:420"}, "properties": {"repobilityId": "a43f83b7eda4862b", "scanner": "scanner-primary", "fingerprint": "585ddcad0458c3cc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-807f7dc6f1faec10", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/test_oidc.py:131"}, "properties": {"repobilityId": "90b48a8ebcb1a10b", "scanner": "scanner-primary", "fingerprint": "807f7dc6f1faec10", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-22cc6539f9753767", "level": "note", "message": {"text": "Legacy-named symbol `grouped_tomorrow_old` in api/syncer.py:474"}, "properties": {"repobilityId": "6e51143819a29f4c", "scanner": "scanner-primary", "fingerprint": "22cc6539f9753767", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-488388919a06f0a3", "level": "none", "message": {"text": "Commented-code block (8 lines) in api/config.py:104"}, "properties": {"repobilityId": "4abe907572978c1a", "scanner": "scanner-primary", "fingerprint": "488388919a06f0a3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6605e72c9f63314c", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/app.py:131"}, "properties": {"repobilityId": "291e30c4abb84437", "scanner": "scanner-primary", "fingerprint": "6605e72c9f63314c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-18fe6601e20a015e", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/manage.py:38"}, "properties": {"repobilityId": "56d9f94af9566ce0", "scanner": "scanner-primary", "fingerprint": "18fe6601e20a015e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8f266b024b33cb70", "level": "none", "message": {"text": "Commented-code block (8 lines) in api/schemas/core_schemas.py:129"}, "properties": {"repobilityId": "05d3330c396cc74e", "scanner": "scanner-primary", "fingerprint": "8f266b024b33cb70", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e61e3d2ebbe90070", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/schemas/requests_schemas.py:52"}, "properties": {"repobilityId": "a02df012d44a9986", "scanner": "scanner-primary", "fingerprint": "e61e3d2ebbe90070", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c6b7c594f430189", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/operations/approve_access_request.py:29"}, "properties": {"repobilityId": "d5a82dd5ed9a11c4", "scanner": "scanner-primary", "fingerprint": "2c6b7c594f430189", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9d1c0b071b23e3f6", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/operations/create_role_request.py:58"}, "properties": {"repobilityId": "2d25b7d01081f664", "scanner": "scanner-primary", "fingerprint": "9d1c0b071b23e3f6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c08eda31d4f5d450", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/auth/dependencies.py:124"}, "properties": {"repobilityId": "1460e7a049401e1a", "scanner": "scanner-primary", "fingerprint": "c08eda31d4f5d450", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cccd748099f9ae8f", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/auth/cloudflare.py:26"}, "properties": {"repobilityId": "a38251c2eb52cf55", "scanner": "scanner-primary", "fingerprint": "cccd748099f9ae8f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9e5cc9f4ca99518", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/routers/health.py:18"}, "properties": {"repobilityId": "d0671c75c439d84f", "scanner": "scanner-primary", "fingerprint": "b9e5cc9f4ca99518", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aad74cbed7a33835", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/routers/audit.py:185"}, "properties": {"repobilityId": "e77bb362ccc383da", "scanner": "scanner-primary", "fingerprint": "aad74cbed7a33835", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d510fe0c0edf4f31", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/routers/roles.py:47"}, "properties": {"repobilityId": "95556bf21a980454", "scanner": "scanner-primary", "fingerprint": "d510fe0c0edf4f31", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0de5c59c484f3716", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/routers/role_requests.py:129"}, "properties": {"repobilityId": "66e009337f04916a", "scanner": "scanner-primary", "fingerprint": "0de5c59c484f3716", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b7c58fce73da122b", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/routers/access_requests.py:41"}, "properties": {"repobilityId": "eecab056d56b0217", "scanner": "scanner-primary", "fingerprint": "b7c58fce73da122b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c3609235fec4cd99", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/routers/groups.py:312"}, "properties": {"repobilityId": "e28928bc4dea9144", "scanner": "scanner-primary", "fingerprint": "c3609235fec4cd99", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7346ca69d83bd652", "level": "none", "message": {"text": "Commented-code block (7 lines) in api/mcp/server.py:92"}, "properties": {"repobilityId": "b1e3a7998c3f638a", "scanner": "scanner-primary", "fingerprint": "7346ca69d83bd652", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6d00dd070cf604f7", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/mcp/prompts.py:23"}, "properties": {"repobilityId": "5515f7266855e1f6", "scanner": "scanner-primary", "fingerprint": "6d00dd070cf604f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b8286e2004964191", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/mcp/tools.py:141"}, "properties": {"repobilityId": "402920a8980b82d1", "scanner": "scanner-primary", "fingerprint": "b8286e2004964191", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fdbf1b747a40c02a", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/mcp/auth/__init__.py:25"}, "properties": {"repobilityId": "3383b45adba413e1", "scanner": "scanner-primary", "fingerprint": "fdbf1b747a40c02a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b6f6d37fab15e67", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/mcp/auth/cloudflare.py:151"}, "properties": {"repobilityId": "ed4eb20fcf082db5", "scanner": "scanner-primary", "fingerprint": "6b6f6d37fab15e67", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-731a2bb158bfd313", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/helpers.tsx:21"}, "properties": {"repobilityId": "3f8692f0941e1663", "scanner": "scanner-primary", "fingerprint": "731a2bb158bfd313", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b5dcf266f389ee61", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/api/apiFetcher.ts:66"}, "properties": {"repobilityId": "86ffd9cd3522e1f9", "scanner": "scanner-primary", "fingerprint": "b5dcf266f389ee61", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-83d6f7360bcf7c61", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/roles/AddGroups.tsx:151"}, "properties": {"repobilityId": "cb4cfbd3809e500a", "scanner": "scanner-primary", "fingerprint": "83d6f7360bcf7c61", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "5b2a786055fef929", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "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": "999fbb6f84c5192c", "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": "7ea130fa40ee3477", "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": "e045ef9dc7963e75", "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": "df27b39307992915", "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": "417539330434bc98", "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": "bdd8112ed115779b", "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": "ae32b08ee67f1b12", "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": "f0c850fa153e0517", "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": "bae226bfa0807548", "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": "33666e34c048535d", "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": "e28eb01fa835c6c2", "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": "6379784ef7c6e098", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "35e69acbda89d3f1", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "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": "492bb4510a0b6e8c", "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": "abdbf62111fb4941", "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": "f601bff5b1d0376e", "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": "a1cb6ad1f191f924", "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": "ba959516d81c4a4e", "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": "0e10570e8cc15ba3", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-05f0860d0fb0cad3", "level": "warning", "message": {"text": "Frontend route `/users/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "3d6f19a711e32df7", "scanner": "scanner-primary", "fingerprint": "05f0860d0fb0cad3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-40a501a936c1b770", "level": "warning", "message": {"text": "Frontend route `/users/:id/audit` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "1115246292d88623", "scanner": "scanner-primary", "fingerprint": "40a501a936c1b770", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e1796d589d966c33", "level": "warning", "message": {"text": "Frontend route `/groups/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "d7ab1a1b157e83af", "scanner": "scanner-primary", "fingerprint": "e1796d589d966c33", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7f5fd1f180d8a8f7", "level": "warning", "message": {"text": "Frontend route `/groups/:id/audit` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "02a8c9645c271065", "scanner": "scanner-primary", "fingerprint": "7f5fd1f180d8a8f7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8c2e9222095bb81a", "level": "warning", "message": {"text": "Frontend route `/roles/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "4dbeab6503ca618c", "scanner": "scanner-primary", "fingerprint": "8c2e9222095bb81a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-618a142358542653", "level": "warning", "message": {"text": "Frontend route `/roles/:id/audit` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "93f77008f2730399", "scanner": "scanner-primary", "fingerprint": "618a142358542653", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0b560fc09267b93f", "level": "warning", "message": {"text": "Frontend route `/apps/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "da8a23eadd2f6b3e", "scanner": "scanner-primary", "fingerprint": "0b560fc09267b93f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a873a871ec5c2181", "level": "warning", "message": {"text": "Frontend route `/requests/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "2e57d13fa8eb04b6", "scanner": "scanner-primary", "fingerprint": "a873a871ec5c2181", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f777137d3e4da6c4", "level": "warning", "message": {"text": "Frontend route `/tags` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "2f8a420070338a9e", "scanner": "scanner-primary", "fingerprint": "f777137d3e4da6c4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-39bd645ac2c731c7", "level": "warning", "message": {"text": "Frontend route `/tags/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "4de83f7cd460d80a", "scanner": "scanner-primary", "fingerprint": "39bd645ac2c731c7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-89f460b8a13e2625", "level": "warning", "message": {"text": "Frontend route `/role-requests/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "a012454d2a633153", "scanner": "scanner-primary", "fingerprint": "89f460b8a13e2625", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-12555cfaf6ac27ab", "level": "warning", "message": {"text": "Frontend route `/group-requests/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "e370bc401137ebcd", "scanner": "scanner-primary", "fingerprint": "12555cfaf6ac27ab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-21a038af57765020", "level": "error", "message": {"text": "FastAPI POST `post_group_request` without auth dependency \u2014 api/routers/group_requests.py:158"}, "properties": {"repobilityId": "3d7c7729c6015797", "scanner": "scanner-primary", "fingerprint": "21a038af57765020", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/routers/group_requests.py"}, "region": {"startLine": 158}}}]}, {"ruleId": "scanner-2b4acc48ed923080", "level": "error", "message": {"text": "FastAPI PUT `put_group_request` without auth dependency \u2014 api/routers/group_requests.py:222"}, "properties": {"repobilityId": "0ca7db576a731adf", "scanner": "scanner-primary", "fingerprint": "2b4acc48ed923080", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/routers/group_requests.py"}, "region": {"startLine": 222}}}]}, {"ruleId": "scanner-8f8cef584eff4628", "level": "error", "message": {"text": "FastAPI PUT `put_role_members` without auth dependency \u2014 api/routers/roles.py:131"}, "properties": {"repobilityId": "740cb79d4ccc0928", "scanner": "scanner-primary", "fingerprint": "8f8cef584eff4628", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/routers/roles.py"}, "region": {"startLine": 131}}}]}, {"ruleId": "scanner-19f467bd2fb90d62", "level": "error", "message": {"text": "FastAPI POST `post_role_request` without auth dependency \u2014 api/routers/role_requests.py:347"}, "properties": {"repobilityId": "2360562838cdecd8", "scanner": "scanner-primary", "fingerprint": "19f467bd2fb90d62", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/routers/role_requests.py"}, "region": {"startLine": 347}}}]}, {"ruleId": "scanner-86736f4eb1afb909", "level": "error", "message": {"text": "FastAPI PUT `put_role_request` without auth dependency \u2014 api/routers/role_requests.py:399"}, "properties": {"repobilityId": "5665a033b63de3af", "scanner": "scanner-primary", "fingerprint": "86736f4eb1afb909", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/routers/role_requests.py"}, "region": {"startLine": 399}}}]}, {"ruleId": "scanner-8abce838e0d3c746", "level": "error", "message": {"text": "FastAPI POST `post_access_request` without auth dependency \u2014 api/routers/access_requests.py:207"}, "properties": {"repobilityId": "31ce14857667a5e2", "scanner": "scanner-primary", "fingerprint": "8abce838e0d3c746", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/routers/access_requests.py"}, "region": {"startLine": 207}}}]}, {"ruleId": "scanner-6768b873f4c17be3", "level": "error", "message": {"text": "FastAPI PUT `put_access_request` without auth dependency \u2014 api/routers/access_requests.py:257"}, "properties": {"repobilityId": "7b2d9c8bdf03861a", "scanner": "scanner-primary", "fingerprint": "6768b873f4c17be3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/routers/access_requests.py"}, "region": {"startLine": 257}}}]}, {"ruleId": "scanner-700c17fa07293d68", "level": "error", "message": {"text": "FastAPI POST `post_group` without auth dependency \u2014 api/routers/groups.py:140"}, "properties": {"repobilityId": "b373b50a8baf75db", "scanner": "scanner-primary", "fingerprint": "700c17fa07293d68", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/routers/groups.py"}, "region": {"startLine": 140}}}]}, {"ruleId": "scanner-a3bc78027762a0a3", "level": "error", "message": {"text": "FastAPI PUT `put_group` without auth dependency \u2014 api/routers/groups.py:201"}, "properties": {"repobilityId": "25f5dcad27230c5c", "scanner": "scanner-primary", "fingerprint": "a3bc78027762a0a3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/routers/groups.py"}, "region": {"startLine": 201}}}]}, {"ruleId": "scanner-ab5a46442dc31633", "level": "error", "message": {"text": "FastAPI DELETE `delete_group` without auth dependency \u2014 api/routers/groups.py:414"}, "properties": {"repobilityId": "db30647a06c7ed25", "scanner": "scanner-primary", "fingerprint": "ab5a46442dc31633", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/routers/groups.py"}, "region": {"startLine": 414}}}]}, {"ruleId": "scanner-3170c9bb0be30720", "level": "error", "message": {"text": "FastAPI PUT `put_group_members` without auth dependency \u2014 api/routers/groups.py:468"}, "properties": {"repobilityId": "c83892b089e08f73", "scanner": "scanner-primary", "fingerprint": "3170c9bb0be30720", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/routers/groups.py"}, "region": {"startLine": 468}}}]}, {"ruleId": "scanner-57081655997c3a8b", "level": "error", "message": {"text": "FastAPI POST `post_sentry` without auth dependency \u2014 api/routers/bugs.py:30"}, "properties": {"repobilityId": "e7c6bcc7e6521d7b", "scanner": "scanner-primary", "fingerprint": "57081655997c3a8b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/routers/bugs.py"}, "region": {"startLine": 30}}}]}]}]}