{"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-215e8b30b5cc2225", "name": "Possibly dead Python function: mark_exited", "shortDescription": {"text": "Possibly dead Python function: mark_exited"}, "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-f6c0bd3943957231", "name": "Possibly dead Python function: list_all_periods_for_admin", "shortDescription": {"text": "Possibly dead Python function: list_all_periods_for_admin"}, "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-efe60e42b23a0730", "name": "Possibly dead Python function: lookup_by_api_key", "shortDescription": {"text": "Possibly dead Python function: lookup_by_api_key"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a68ab835810222bc", "name": "Possibly dead Python function: list_aggregate_for_admin", "shortDescription": {"text": "Possibly dead Python function: list_aggregate_for_admin"}, "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-b544ae764a01ac89", "name": "Possibly dead Python function: reconcile_all_admins", "shortDescription": {"text": "Possibly dead Python function: reconcile_all_admins"}, "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-501dc0de8453da0d", "name": "Possibly dead Python function: smtp_configured", "shortDescription": {"text": "Possibly dead Python function: smtp_configured"}, "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-0f8edff43489f4cd", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SendSignal.tsx:346", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SendSignal.tsx:346"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-23f01613cb4b02b7", "name": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/SendSignal.tsx:727", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/SendSignal.tsx:727"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-708a430014521206", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SignalHistory.tsx:503", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SignalHistory.tsx:503"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-389dc2b119131511", "name": "Icon-only button without accessible name \u2014 frontend/src/pages/SuperAdmin.tsx:241", "shortDescription": {"text": "Icon-only button without accessible name \u2014 frontend/src/pages/SuperAdmin.tsx:241"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-793bfa131b170c73", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-bullseye-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-bullseye-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4b44b4f0579689ff", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim-bullseye", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim-bullseye"}, "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-32d46a29707b548f", "name": "Very large file: frontend/src/pages/Positions.tsx (1509 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/Positions.tsx (1509 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-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "1 test file(s) for 65 source file(s) (ratio 0.02). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0e8a76eb13fd3249", "name": "Node manifest has dependencies but no lockfile: frontend/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: frontend/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "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-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 47 placeholder/mock markers across 10 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "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-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bea357a6497a2d5d", "name": "Agent authority lacks a verifier contract: CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f862a221d8591b4e", "name": "Commented-code block (5 lines) in app.py:104", "shortDescription": {"text": "Commented-code block (5 lines) in app.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-b0659393ccc6a939", "name": "Legacy-named symbol `alphago_publisher_v1` in utils/crypto.py:34", "shortDescription": {"text": "Legacy-named symbol `alphago_publisher_v1` in utils/crypto.py:34"}, "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-1613edf1e3913754", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/PromoCodes.tsx:115", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/PromoCodes.tsx:115"}, "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-c352c4a450ada4a5", "name": "Commented-code block (5 lines) in frontend/src/pages/SignalHistory.tsx:99", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/pages/SignalHistory.tsx:99"}, "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-b9a4ddb54c718943", "name": "Commented-code block (8 lines) in blueprints/signals.py:44", "shortDescription": {"text": "Commented-code block (8 lines) in blueprints/signals.py:44"}, "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-d8c2c0b0a2d8bbbd", "name": "Network/subprocess call without timeout or try/except \u2014 blueprints/docs.py:232", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 blueprints/docs.py:232"}, "fullDescription": {"text": "`requests.post(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4bfddbcd36983d66", "name": "Commented-code block (7 lines) in blueprints/subscribers.py:247", "shortDescription": {"text": "Commented-code block (7 lines) in blueprints/subscribers.py:247"}, "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-bb7c812ef558aefb", "name": "Commented-code block (5 lines) in blueprints/auth.py:148", "shortDescription": {"text": "Commented-code block (5 lines) in blueprints/auth.py:148"}, "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-45b87cbb56b80318", "name": "Commented-code block (5 lines) in blueprints/service.py:134", "shortDescription": {"text": "Commented-code block (5 lines) in blueprints/service.py:134"}, "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-bf93a75bf246fbf0", "name": "Commented-code block (5 lines) in database/infrastructure_db.py:46", "shortDescription": {"text": "Commented-code block (5 lines) in database/infrastructure_db.py:46"}, "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-7a25a5f92a16aaac", "name": "Commented-code block (7 lines) in database/models.py:187", "shortDescription": {"text": "Commented-code block (7 lines) in database/models.py:187"}, "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-c6947ca3722ff1bd", "name": "Commented-code block (5 lines) in database/positions_db.py:90", "shortDescription": {"text": "Commented-code block (5 lines) in database/positions_db.py:90"}, "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-9e618732956cac02", "name": "Commented-code block (8 lines) in services/fan_out.py:640", "shortDescription": {"text": "Commented-code block (8 lines) in services/fan_out.py:640"}, "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-022e6399d1ef2beb", "name": "12 env vars used in code but missing from .env.example", "shortDescription": {"text": "12 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `DISABLE_RECONCILE_CRON`, `FLASK_DEBUG`, `HSOL_MONGO_DB`, `HSOL_MONGO_URI`, `HSOL_OWNER_ADMIN_EMAIL`, `MONGO_URI`, `PROBE_ALLOWED_ORIGIN_SUFFIXES`, `PROVISIONER_SHARED_SECRET` + 4 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nblueprints/auth.py:wrapper, blueprints/auth.py:wrapper\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\ndatabase/positions_db.py:query_aggregates_for_admin, database/positions_db.py:query_by_subscriber_for_admin, database/positions_db.py:query_broker_only_for_admin\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-7826b1984c9271bf", "name": "JS PATCH `/api/admin/infrastructure/servers/${encodeURIComponent(id)}` admin endpoint without auth \u2014 frontend/src/api/in", "shortDescription": {"text": "JS PATCH `/api/admin/infrastructure/servers/${encodeURIComponent(id)}` admin endpoint without auth \u2014 frontend/src/api/infrastructure.ts:107"}, "fullDescription": {"text": "Admin-scoped JS route with no recognizable auth: no middleware-position guard, no router-level guard above it in this file, and no inline permission call within the first 15 lines of the handler. If auth is applied where this router is mounted, dismiss with reason `by_design` or tag the route `// public-by-design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8efe5c433eb695de", "name": "JS POST `/api/admin/infrastructure/servers` admin endpoint without auth \u2014 frontend/src/api/infrastructure.ts:132", "shortDescription": {"text": "JS POST `/api/admin/infrastructure/servers` admin endpoint without auth \u2014 frontend/src/api/infrastructure.ts:132"}, "fullDescription": {"text": "Admin-scoped JS route with no recognizable auth: no middleware-position guard, no router-level guard above it in this file, and no inline permission call within the first 15 lines of the handler. If auth is applied where this router is mounted, dismiss with reason `by_design` or tag the route `// public-by-design`."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24116"}, "properties": {"repository": "alpha112233/alphago_publisher", "repoUrl": "https://github.com/alpha112233/alphago_publisher", "branch": "main"}, "results": [{"ruleId": "scanner-215e8b30b5cc2225", "level": "note", "message": {"text": "Possibly dead Python function: mark_exited"}, "properties": {"repobilityId": "5c26fb3b2870e3b4", "scanner": "scanner-primary", "fingerprint": "215e8b30b5cc2225", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "database/signals_db.py:74"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f6c0bd3943957231", "level": "note", "message": {"text": "Possibly dead Python function: list_all_periods_for_admin"}, "properties": {"repobilityId": "cc279f3caac0a960", "scanner": "scanner-primary", "fingerprint": "f6c0bd3943957231", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "database/metering_db.py:67"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-efe60e42b23a0730", "level": "note", "message": {"text": "Possibly dead Python function: lookup_by_api_key"}, "properties": {"repobilityId": "c754067134577858", "scanner": "scanner-primary", "fingerprint": "efe60e42b23a0730", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "database/api_creds_db.py:30"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a68ab835810222bc", "level": "note", "message": {"text": "Possibly dead Python function: list_aggregate_for_admin"}, "properties": {"repobilityId": "2b84902a2fa4dc4c", "scanner": "scanner-primary", "fingerprint": "a68ab835810222bc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "database/positions_db.py:162"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b544ae764a01ac89", "level": "note", "message": {"text": "Possibly dead Python function: reconcile_all_admins"}, "properties": {"repobilityId": "ca049f9fcb2cb942", "scanner": "scanner-primary", "fingerprint": "b544ae764a01ac89", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/reconcile.py:111"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-501dc0de8453da0d", "level": "note", "message": {"text": "Possibly dead Python function: smtp_configured"}, "properties": {"repobilityId": "5901788fe0a4c01e", "scanner": "scanner-primary", "fingerprint": "501dc0de8453da0d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/email.py:37"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0f8edff43489f4cd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SendSignal.tsx:346"}, "properties": {"repobilityId": "a91f8ef436589a9e", "scanner": "scanner-primary", "fingerprint": "0f8edff43489f4cd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-23f01613cb4b02b7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 frontend/src/pages/SendSignal.tsx:727"}, "properties": {"repobilityId": "20da2523e0710350", "scanner": "scanner-primary", "fingerprint": "23f01613cb4b02b7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-708a430014521206", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/SignalHistory.tsx:503"}, "properties": {"repobilityId": "10485673e9b944d7", "scanner": "scanner-primary", "fingerprint": "708a430014521206", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-389dc2b119131511", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 frontend/src/pages/SuperAdmin.tsx:241"}, "properties": {"repobilityId": "f2f7a7976e4a5e89", "scanner": "scanner-primary", "fingerprint": "389dc2b119131511", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-793bfa131b170c73", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-bullseye-slim"}, "properties": {"repobilityId": "f8d5ced6b8a34a43", "scanner": "scanner-primary", "fingerprint": "793bfa131b170c73", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-4b44b4f0579689ff", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim-bullseye"}, "properties": {"repobilityId": "c93817985563d7f6", "scanner": "scanner-primary", "fingerprint": "4b44b4f0579689ff", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-32d46a29707b548f", "level": "note", "message": {"text": "Very large file: frontend/src/pages/Positions.tsx (1509 lines)"}, "properties": {"repobilityId": "7bf91bec82549c58", "scanner": "scanner-primary", "fingerprint": "32d46a29707b548f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "a4d583745b7e624f", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-0e8a76eb13fd3249", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: frontend/package.json"}, "properties": {"repobilityId": "d8c65da5b68ee95b", "scanner": "scanner-primary", "fingerprint": "0e8a76eb13fd3249", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "0e20bc56a260721d", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "963a8d6e05de875f", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "8fb419c760ba1306", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "b23cf9bef3c1cc3b", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "e422e48118f7583e", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-bea357a6497a2d5d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "properties": {"repobilityId": "aae72df3934829ac", "scanner": "scanner-primary", "fingerprint": "bea357a6497a2d5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f862a221d8591b4e", "level": "none", "message": {"text": "Commented-code block (5 lines) in app.py:104"}, "properties": {"repobilityId": "17d824b226f4f562", "scanner": "scanner-primary", "fingerprint": "f862a221d8591b4e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b0659393ccc6a939", "level": "note", "message": {"text": "Legacy-named symbol `alphago_publisher_v1` in utils/crypto.py:34"}, "properties": {"repobilityId": "b95cb4f7a7d35689", "scanner": "scanner-primary", "fingerprint": "b0659393ccc6a939", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1613edf1e3913754", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/PromoCodes.tsx:115"}, "properties": {"repobilityId": "d5f84b89cbdf3037", "scanner": "scanner-primary", "fingerprint": "1613edf1e3913754", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c352c4a450ada4a5", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/pages/SignalHistory.tsx:99"}, "properties": {"repobilityId": "0ac0843e4c159a07", "scanner": "scanner-primary", "fingerprint": "c352c4a450ada4a5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9a4ddb54c718943", "level": "none", "message": {"text": "Commented-code block (8 lines) in blueprints/signals.py:44"}, "properties": {"repobilityId": "b85ac686eba49d05", "scanner": "scanner-primary", "fingerprint": "b9a4ddb54c718943", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d8c2c0b0a2d8bbbd", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 blueprints/docs.py:232"}, "properties": {"repobilityId": "21ec3ae09dfa6281", "scanner": "scanner-primary", "fingerprint": "d8c2c0b0a2d8bbbd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4bfddbcd36983d66", "level": "none", "message": {"text": "Commented-code block (7 lines) in blueprints/subscribers.py:247"}, "properties": {"repobilityId": "8df48b04f334b791", "scanner": "scanner-primary", "fingerprint": "4bfddbcd36983d66", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bb7c812ef558aefb", "level": "none", "message": {"text": "Commented-code block (5 lines) in blueprints/auth.py:148"}, "properties": {"repobilityId": "753a310519b219ee", "scanner": "scanner-primary", "fingerprint": "bb7c812ef558aefb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-45b87cbb56b80318", "level": "none", "message": {"text": "Commented-code block (5 lines) in blueprints/service.py:134"}, "properties": {"repobilityId": "9d635a0e7781a517", "scanner": "scanner-primary", "fingerprint": "45b87cbb56b80318", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bf93a75bf246fbf0", "level": "none", "message": {"text": "Commented-code block (5 lines) in database/infrastructure_db.py:46"}, "properties": {"repobilityId": "47a00116223737c8", "scanner": "scanner-primary", "fingerprint": "bf93a75bf246fbf0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7a25a5f92a16aaac", "level": "none", "message": {"text": "Commented-code block (7 lines) in database/models.py:187"}, "properties": {"repobilityId": "b34d1fef88137f54", "scanner": "scanner-primary", "fingerprint": "7a25a5f92a16aaac", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c6947ca3722ff1bd", "level": "none", "message": {"text": "Commented-code block (5 lines) in database/positions_db.py:90"}, "properties": {"repobilityId": "af3f701cecdf81e1", "scanner": "scanner-primary", "fingerprint": "c6947ca3722ff1bd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e618732956cac02", "level": "none", "message": {"text": "Commented-code block (8 lines) in services/fan_out.py:640"}, "properties": {"repobilityId": "cab97fcfad7c8661", "scanner": "scanner-primary", "fingerprint": "9e618732956cac02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-022e6399d1ef2beb", "level": "note", "message": {"text": "12 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "7bf4178327da75a2", "scanner": "scanner-primary", "fingerprint": "022e6399d1ef2beb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "e62a2060dd7d195d", "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": "04c28aca9aa29e94", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "9e4f134e1033de4e", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-7826b1984c9271bf", "level": "error", "message": {"text": "JS PATCH `/api/admin/infrastructure/servers/${encodeURIComponent(id)}` admin endpoint without auth \u2014 frontend/src/api/infrastructure.ts:107"}, "properties": {"repobilityId": "7ae766c124a0b926", "scanner": "scanner-primary", "fingerprint": "7826b1984c9271bf", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/api/infrastructure.ts"}, "region": {"startLine": 107}}}]}, {"ruleId": "scanner-8efe5c433eb695de", "level": "error", "message": {"text": "JS POST `/api/admin/infrastructure/servers` admin endpoint without auth \u2014 frontend/src/api/infrastructure.ts:132"}, "properties": {"repobilityId": "3d093a6ecf90faf7", "scanner": "scanner-primary", "fingerprint": "8efe5c433eb695de", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.js.admin_unauth"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/api/infrastructure.ts"}, "region": {"startLine": 132}}}]}]}]}