{"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-70e364b2eec298a4", "name": "Possibly dead Python function: verify_api_def_access", "shortDescription": {"text": "Possibly dead Python function: verify_api_def_access"}, "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-1ad647408adea08c", "name": "Possibly dead Python function: optimize", "shortDescription": {"text": "Possibly dead Python function: optimize"}, "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-ecafa50d801d852e", "name": "Possibly dead Python function: run_customize_job", "shortDescription": {"text": "Possibly dead Python function: run_customize_job"}, "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-518986bad36384e6", "name": "Possibly dead Python function: resume_customize_job", "shortDescription": {"text": "Possibly dead Python function: resume_customize_job"}, "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-715ca8a193fde689", "name": "Possibly dead Python function: clear_piaozone_token_cache", "shortDescription": {"text": "Possibly dead Python function: clear_piaozone_token_cache"}, "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-d4570bacb2791c17", "name": "Possibly dead Python function: infer", "shortDescription": {"text": "Possibly dead Python function: infer"}, "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-893d059cee4632da", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-44d01e462159f9fe", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-900eae68fde673a4", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-db13438b84449cbd", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-e04cd4a5bc29d1c6", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-597cf8d19345bae2", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-a599feba5a979895", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-e69032e01454dd71", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-f06870a89fa4999b", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-a718b7df987825de", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-1afc3d479e3e5908", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-b71e8fe4cb79f31e", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-bb89d7745d45fce8", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-1d6eb901e63b5c75", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-28c38401a6bd46a9", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-8807e3ffbb6b9493", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-8ae4de36cbe35bcd", "name": "Possibly dead Python function: upgrade", "shortDescription": {"text": "Possibly dead Python function: upgrade"}, "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-95a2fffb239202ad", "name": "Possibly dead Python function: downgrade", "shortDescription": {"text": "Possibly dead Python function: downgrade"}, "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-9e4fe0878a32ac4d", "name": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/components/fields/FieldEditorPanel.tsx:22", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/components/fields/FieldEditorPanel.tsx:22"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-29cb5b7f4a7b3748", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/api/ApiPreviewPanel.tsx:149", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/api/ApiPreviewPanel.tsx:149"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7deddd8be7e2dec6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/workspace-v2/DarkJsonViewer.tsx:222", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/workspace-v2/DarkJsonViewer.tsx:222"}, "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-cb6600e4ad296d4c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/workspace-v2/OptimizationProcessPanel.tsx:8", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/workspace-v2/OptimizationProcessPanel.tsx:849"}, "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-c28b195085f9b903", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/workspace-v2/DocumentThumbnailColumn.tsx:11", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/workspace-v2/DocumentThumbnailColumn.tsx:113"}, "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-be859ac5eeb547fb", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/workspace-v2/WorkspaceHeader.tsx:148", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/workspace-v2/WorkspaceHeader.tsx:148"}, "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-ab98aa749e50648d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/workspace-v2/DarkFieldViewer.tsx:226", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/workspace-v2/DarkFieldViewer.tsx:226"}, "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-1f66ad88286ca30a", "name": "Dockerfile runs as root: backend/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: backend/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-8cd20d539467d2c5", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fc6fcb6c5576feac", "name": "Insecure pattern 'direct_innerhtml_assignment' in prototyype.html:674", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in prototyype.html:674"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3c43b8c5c85d7d49", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/api/ApiPreviewPanel.tsx:149", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/api/ApiPreviewPanel.tsx:149"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4d4f5bfaa26f2bd4", "name": "Very large file: frontend/src/stores/workspace-store.ts (1397 lines)", "shortDescription": {"text": "Very large file: frontend/src/stores/workspace-store.ts (1397 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-473a9cc4d67550d6", "name": "Very large file: frontend/src/components/workspace-v2/OptimizationProcessPanel.tsx (1396 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/workspace-v2/OptimizationProcessPanel.tsx (1396 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-16a8fa33a0381523", "name": "Very large file: frontend/src/components/workspace-v2/DarkFieldViewer.tsx (2315 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/workspace-v2/DarkFieldViewer.tsx (2315 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-0d1400fecb8286bb", "name": "Very large file: backend/app/ocr_optimizer/service/customer_iteration.py (2260 lines)", "shortDescription": {"text": "Very large file: backend/app/ocr_optimizer/service/customer_iteration.py (2260 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": "26 tests / 165 src (ratio 0.16)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 20 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 105 placeholder/mock markers across 45 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. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-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-d0e3a28310337686", "name": "Commented-code block (5 lines) in frontend/src/stores/workspace-store.ts:162", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/stores/workspace-store.ts:162"}, "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-185cd08037e5b7a3", "name": "Commented-code block (5 lines) in frontend/src/components/workspace-v2/OptimizationProcessPanel.tsx:148", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/components/workspace-v2/OptimizationProcessPanel.tsx: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-3ff4b2d9827df150", "name": "Commented-code block (8 lines) in frontend/src/components/workspace-v2/DarkDocumentViewer.tsx:144", "shortDescription": {"text": "Commented-code block (8 lines) in frontend/src/components/workspace-v2/DarkDocumentViewer.tsx:144"}, "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-a458bcd154e9b7eb", "name": "Commented-code block (7 lines) in frontend/src/components/workspace-v2/DarkFieldViewer.tsx:810", "shortDescription": {"text": "Commented-code block (7 lines) in frontend/src/components/workspace-v2/DarkFieldViewer.tsx:810"}, "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-fc32a3088834e79c", "name": "Commented-code block (5 lines) in frontend/src/lib/api-client.ts:31", "shortDescription": {"text": "Commented-code block (5 lines) in frontend/src/lib/api-client.ts:31"}, "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-b711157db5020dee", "name": "Legacy-named symbol `test_field_rule_of_reads_persisted_copy` in backend/tests/test_field_rule.py:71", "shortDescription": {"text": "Legacy-named symbol `test_field_rule_of_reads_persisted_copy` in backend/tests/test_field_rule.py:71"}, "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-5215492b9c8a473a", "name": "Legacy-named symbol `__rename_old` in backend/tests/test_pending_edits.py:633", "shortDescription": {"text": "Legacy-named symbol `__rename_old` in backend/tests/test_pending_edits.py:633"}, "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-6829ed3188fb636d", "name": "Commented-code block (8 lines) in backend/app/models/api_definition.py:88", "shortDescription": {"text": "Commented-code block (8 lines) in backend/app/models/api_definition.py:88"}, "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-12b9e1a5d8aedb7e", "name": "Commented-code block (5 lines) in backend/app/ocr_optimizer/models.py:118", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/ocr_optimizer/models.py:118"}, "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-ea22c82f569a7a30", "name": "Commented-code block (5 lines) in backend/app/ocr_optimizer/reflection/reflector.py:39", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/ocr_optimizer/reflection/reflector.py:39"}, "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-7884a0780602ef80", "name": "Commented-code block (5 lines) in backend/app/ocr_optimizer/eval/golden_loop.py:69", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/ocr_optimizer/eval/golden_loop.py:69"}, "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-16547373d5d60e61", "name": "Commented-code block (7 lines) in backend/app/ocr_optimizer/service/run_orchestrator.py:739", "shortDescription": {"text": "Commented-code block (7 lines) in backend/app/ocr_optimizer/service/run_orchestrator.py:739"}, "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-b2e33a81d3f70160", "name": "Commented-code block (7 lines) in backend/app/ocr_optimizer/service/composer.py:46", "shortDescription": {"text": "Commented-code block (7 lines) in backend/app/ocr_optimizer/service/composer.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-8bf32716866f69bc", "name": "Legacy-named symbol `__rename_old` in backend/app/ocr_optimizer/service/customer_iteration.py:1716", "shortDescription": {"text": "Legacy-named symbol `__rename_old` in backend/app/ocr_optimizer/service/customer_iteration.py:1716"}, "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-df8a7cca69502b66", "name": "Commented-code block (5 lines) in backend/app/ocr_optimizer/service/customer_iteration.py:239", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/ocr_optimizer/service/customer_iteration.py:239"}, "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-fba8c76ffe27fe7f", "name": "Commented-code block (5 lines) in backend/app/ocr_optimizer/service/template_loader.py:37", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/ocr_optimizer/service/template_loader.py: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-0bdb03da57bd997d", "name": "Commented-code block (5 lines) in backend/app/ocr_optimizer/service/preset_init.py:90", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/ocr_optimizer/service/preset_init.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-da962764abe1da57", "name": "Legacy-named symbol `collapsed_old` in backend/app/services/pending_edits_service.py:121", "shortDescription": {"text": "Legacy-named symbol `collapsed_old` in backend/app/services/pending_edits_service.py:121"}, "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-fa705c677a905fe5", "name": "Commented-code block (9 lines) in backend/app/services/pending_edits_service.py:319", "shortDescription": {"text": "Commented-code block (9 lines) in backend/app/services/pending_edits_service.py:319"}, "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-5c9bf5aa6091506c", "name": "Legacy-named symbol `api_deprecated` in backend/app/services/api_definition_service.py:407", "shortDescription": {"text": "Legacy-named symbol `api_deprecated` in backend/app/services/api_definition_service.py:407"}, "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-af053e959e1b7194", "name": "Commented-code block (6 lines) in backend/app/services/api_definition_service.py:344", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/services/api_definition_service.py:344"}, "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-47acb6a8388557d5", "name": "Commented-code block (5 lines) in backend/app/services/document_service.py:323", "shortDescription": {"text": "Commented-code block (5 lines) in backend/app/services/document_service.py:323"}, "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-51a6c6507ee9f77a", "name": "Commented-code block (6 lines) in backend/app/core/config.py:63", "shortDescription": {"text": "Commented-code block (6 lines) in backend/app/core/config.py:63"}, "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-0ceb9dc26875d9fd", "name": "Legacy-named symbol `api_deprecated` in backend/app/core/exceptions.py:65", "shortDescription": {"text": "Legacy-named symbol `api_deprecated` in backend/app/core/exceptions.py:65"}, "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-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:\nbackend/app/abstractions/storage.py:save, backend/app/abstractions/storage.py:save\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-02525d39071dd2c7", "name": "Near-duplicate function bodies in 5 places", "shortDescription": {"text": "Near-duplicate function bodies in 5 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/app/processors/mock_processor.py:process_document, backend/app/processors/gemini_processor.py:process_document, backend/app/processors/base.py:process_document, backend/app/processors/piaozone_processor.py:process_document\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-049cf4369c9c06ab", "name": "Frontend route `/workspace/api/:apiDefinitionId` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/workspace/api/:apiDefinitionId` has no Link/navigate to it \u2014 frontend/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-1c1529a8b30efbe0", "name": "Frontend route `/workspace/:documentId` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/workspace/:documentId` has no Link/navigate to it \u2014 frontend/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-d09e2fbb36c2790e", "name": "Frontend route `api-keys` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `api-keys` has no Link/navigate to it \u2014 frontend/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-9f637b9b79a6cdc3", "name": "Frontend route `traffic` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `traffic` has no Link/navigate to it \u2014 frontend/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-2408492a23c48dc3", "name": "Frontend route `billing` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `billing` has no Link/navigate to it \u2014 frontend/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-800f16a42a897ed4", "name": "Frontend route `ocr-optimizer` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `ocr-optimizer` has no Link/navigate to it \u2014 frontend/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-16c98e1312fbeb0a", "name": "Frontend route `system-admins` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `system-admins` has no Link/navigate to it \u2014 frontend/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-a86e7b1f274fd3d3", "name": "Frontend route `country-templates` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `country-templates` has no Link/navigate to it \u2014 frontend/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-bd0da8ca886ef8fc", "name": "FastAPI PUT `save_agent` without auth dependency \u2014 backend/app/api/v1/reflection_agents.py:64", "shortDescription": {"text": "FastAPI PUT `save_agent` without auth dependency \u2014 backend/app/api/v1/reflection_agents.py:64"}, "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-95b81098916801d5", "name": "FastAPI POST `_create` without auth dependency \u2014 backend/app/api/v1/conversations.py:31", "shortDescription": {"text": "FastAPI POST `_create` without auth dependency \u2014 backend/app/api/v1/conversations.py:31"}, "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-81c19d4d357b18e4", "name": "FastAPI POST `_send_message` without auth dependency \u2014 backend/app/api/v1/conversations.py:46", "shortDescription": {"text": "FastAPI POST `_send_message` without auth dependency \u2014 backend/app/api/v1/conversations.py:46"}, "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-e7baffd7e4a70f5d", "name": "FastAPI PUT `_update_schema` without auth dependency \u2014 backend/app/api/v1/conversations.py:56", "shortDescription": {"text": "FastAPI PUT `_update_schema` without auth dependency \u2014 backend/app/api/v1/conversations.py:56"}, "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-1edcf2ae00c9cbca", "name": "FastAPI POST `_rollback` without auth dependency \u2014 backend/app/api/v1/conversations.py:66", "shortDescription": {"text": "FastAPI POST `_rollback` without auth dependency \u2014 backend/app/api/v1/conversations.py:66"}, "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-4d939162211f1c04", "name": "FastAPI DELETE `_delete` without auth dependency \u2014 backend/app/api/v1/conversations.py:71", "shortDescription": {"text": "FastAPI DELETE `_delete` without auth dependency \u2014 backend/app/api/v1/conversations.py:71"}, "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-01c84643ced5e697", "name": "FastAPI POST `extract_document` without auth dependency \u2014 backend/app/api/v1/extract.py:25", "shortDescription": {"text": "FastAPI POST `extract_document` without auth dependency \u2014 backend/app/api/v1/extract.py:25"}, "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-2838e052dc0851e9", "name": "FastAPI POST `resume_customize_job_endpoint` without auth dependency \u2014 backend/app/api/v1/api_defs.py:531", "shortDescription": {"text": "FastAPI POST `resume_customize_job_endpoint` without auth dependency \u2014 backend/app/api/v1/api_defs.py:531"}, "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-64a9bc98c2c281b4", "name": "FastAPI POST `create_system_admin` without auth dependency \u2014 backend/app/api/v1/admin_users.py:42", "shortDescription": {"text": "FastAPI POST `create_system_admin` without auth dependency \u2014 backend/app/api/v1/admin_users.py:42"}, "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-6b2a5361f8b6e6b9", "name": "FastAPI POST `post_init` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:82", "shortDescription": {"text": "FastAPI POST `post_init` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:82"}, "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-bc0ab04f8127b2f2", "name": "FastAPI PATCH `activate` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:132", "shortDescription": {"text": "FastAPI PATCH `activate` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:132"}, "fullDescription": {"text": "`@router.patch` 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-50b2e88d021f035e", "name": "FastAPI POST `trigger_optimize` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:150", "shortDescription": {"text": "FastAPI POST `trigger_optimize` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:150"}, "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-6f7f80195ce29fa8", "name": "FastAPI POST `trigger_advance` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:181", "shortDescription": {"text": "FastAPI POST `trigger_advance` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:181"}, "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-b73f1019a31958cd", "name": "FastAPI POST `trigger_finalize` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:205", "shortDescription": {"text": "FastAPI POST `trigger_finalize` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:205"}, "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-78ef7f8ec77b464f", "name": "FastAPI POST `trigger_abort` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:220", "shortDescription": {"text": "FastAPI POST `trigger_abort` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:220"}, "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-2b9ab8283d3b321d", "name": "FastAPI POST `post_manual_patch` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:234", "shortDescription": {"text": "FastAPI POST `post_manual_patch` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:234"}, "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-bb093bb00a32fbb3", "name": "FastAPI POST `create_skill` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:281", "shortDescription": {"text": "FastAPI POST `create_skill` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:281"}, "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-d106eab919a0dece", "name": "FastAPI POST `attach_skill` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:297", "shortDescription": {"text": "FastAPI POST `attach_skill` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:297"}, "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-e782b0ca919abd3d", "name": "Unused endpoint: GET /reflection-agents/countries", "shortDescription": {"text": "Unused endpoint: GET /reflection-agents/countries"}, "fullDescription": {"text": "`backend/app/api/v1/reflection_agents.py` declares `GET /reflection-agents/countries` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4793695249c286d3", "name": "Unused endpoint: GET /reflection-agents/{country}", "shortDescription": {"text": "Unused endpoint: GET /reflection-agents/{country}"}, "fullDescription": {"text": "`backend/app/api/v1/reflection_agents.py` declares `GET /reflection-agents/{country}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-15d02a2afc645589", "name": "Unused endpoint: PUT /reflection-agents/{country}/{kind}", "shortDescription": {"text": "Unused endpoint: PUT /reflection-agents/{country}/{kind}"}, "fullDescription": {"text": "`backend/app/api/v1/reflection_agents.py` declares `PUT /reflection-agents/{country}/{kind}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4ea8a76f49cdceb4", "name": "Unused endpoint: GET /country-templates", "shortDescription": {"text": "Unused endpoint: GET /country-templates"}, "fullDescription": {"text": "`backend/app/api/v1/platform_templates.py` declares `GET /country-templates` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-001db17cbe704638", "name": "Unused endpoint: GET /golden/{country}/seeds", "shortDescription": {"text": "Unused endpoint: GET /golden/{country}/seeds"}, "fullDescription": {"text": "`backend/app/api/v1/platform_templates.py` declares `GET /golden/{country}/seeds` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-64858c47dc029138", "name": "Unused endpoint: GET /golden/{country}/seeds/{seed_id}/file", "shortDescription": {"text": "Unused endpoint: GET /golden/{country}/seeds/{seed_id}/file"}, "fullDescription": {"text": "`backend/app/api/v1/platform_templates.py` declares `GET /golden/{country}/seeds/{seed_id}/file` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-15968cb67ab0b918", "name": "Unused endpoint: POST /golden/{country}/evaluate", "shortDescription": {"text": "Unused endpoint: POST /golden/{country}/evaluate"}, "fullDescription": {"text": "`backend/app/api/v1/platform_templates.py` declares `POST /golden/{country}/evaluate` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-889152c5f9b2096a", "name": "Unused endpoint: GET /golden/{country}/evaluation", "shortDescription": {"text": "Unused endpoint: GET /golden/{country}/evaluation"}, "fullDescription": {"text": "`backend/app/api/v1/platform_templates.py` declares `GET /golden/{country}/evaluation` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-841e50bf821e4158", "name": "Unused endpoint: GET /users", "shortDescription": {"text": "Unused endpoint: GET /users"}, "fullDescription": {"text": "`backend/app/api/v1/tenant_users.py` declares `GET /users` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1bca8100a44f7f25", "name": "Unused endpoint: POST /users", "shortDescription": {"text": "Unused endpoint: POST /users"}, "fullDescription": {"text": "`backend/app/api/v1/tenant_users.py` declares `POST /users` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`backend/app/api/v1/api_keys.py` declares `POST /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`backend/app/api/v1/api_keys.py` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6570594a7b6f1211", "name": "Unused endpoint: PUT /{key_id}", "shortDescription": {"text": "Unused endpoint: PUT /{key_id}"}, "fullDescription": {"text": "`backend/app/api/v1/api_keys.py` declares `PUT /{key_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-38f0a0bf734e5bcc", "name": "Unused endpoint: DELETE /{key_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{key_id}"}, "fullDescription": {"text": "`backend/app/api/v1/api_keys.py` declares `DELETE /{key_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-69f497da676def28", "name": "Unused endpoint: POST /{key_id}/rotate", "shortDescription": {"text": "Unused endpoint: POST /{key_id}/rotate"}, "fullDescription": {"text": "`backend/app/api/v1/api_keys.py` declares `POST /{key_id}/rotate` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-618721b912bad1c2", "name": "Unused endpoint: POST /login", "shortDescription": {"text": "Unused endpoint: POST /login"}, "fullDescription": {"text": "`backend/app/api/v1/auth.py` declares `POST /login` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7952846d57642272", "name": "Unused endpoint: POST /login/code", "shortDescription": {"text": "Unused endpoint: POST /login/code"}, "fullDescription": {"text": "`backend/app/api/v1/auth.py` declares `POST /login/code` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd1dc91abf32142d", "name": "Unused endpoint: GET /me", "shortDescription": {"text": "Unused endpoint: GET /me"}, "fullDescription": {"text": "`backend/app/api/v1/auth.py` declares `GET /me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4fe9bb486644f008", "name": "Unused endpoint: POST /change-password", "shortDescription": {"text": "Unused endpoint: POST /change-password"}, "fullDescription": {"text": "`backend/app/api/v1/auth.py` declares `POST /change-password` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eb4965f4d227f8b3", "name": "Unused endpoint: GET /{conversation_id}", "shortDescription": {"text": "Unused endpoint: GET /{conversation_id}"}, "fullDescription": {"text": "`backend/app/api/v1/conversations.py` declares `GET /{conversation_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5e44869ee7800ad1", "name": "Unused endpoint: POST /{conversation_id}/messages", "shortDescription": {"text": "Unused endpoint: POST /{conversation_id}/messages"}, "fullDescription": {"text": "`backend/app/api/v1/conversations.py` declares `POST /{conversation_id}/messages` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e60037f5de1574b4", "name": "Unused endpoint: GET /{conversation_id}/schema", "shortDescription": {"text": "Unused endpoint: GET /{conversation_id}/schema"}, "fullDescription": {"text": "`backend/app/api/v1/conversations.py` declares `GET /{conversation_id}/schema` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ad97b466317d9b18", "name": "Unused endpoint: PUT /{conversation_id}/schema", "shortDescription": {"text": "Unused endpoint: PUT /{conversation_id}/schema"}, "fullDescription": {"text": "`backend/app/api/v1/conversations.py` declares `PUT /{conversation_id}/schema` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-75cecfa596c7f8ca", "name": "Unused endpoint: GET /{conversation_id}/schema/history", "shortDescription": {"text": "Unused endpoint: GET /{conversation_id}/schema/history"}, "fullDescription": {"text": "`backend/app/api/v1/conversations.py` declares `GET /{conversation_id}/schema/history` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f6a4ffa5fadd0ccf", "name": "Unused endpoint: POST /{conversation_id}/rollback/{version}", "shortDescription": {"text": "Unused endpoint: POST /{conversation_id}/rollback/{version}"}, "fullDescription": {"text": "`backend/app/api/v1/conversations.py` declares `POST /{conversation_id}/rollback/{version}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ad72d180247f16e2", "name": "Unused endpoint: DELETE /{conversation_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{conversation_id}"}, "fullDescription": {"text": "`backend/app/api/v1/conversations.py` declares `DELETE /{conversation_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-52c85377cc38e474", "name": "Unused endpoint: POST /batch", "shortDescription": {"text": "Unused endpoint: POST /batch"}, "fullDescription": {"text": "`backend/app/api/v1/annotations.py` declares `POST /batch` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e6b186a005a557b7", "name": "Unused endpoint: PATCH /batch", "shortDescription": {"text": "Unused endpoint: PATCH /batch"}, "fullDescription": {"text": "`backend/app/api/v1/annotations.py` declares `PATCH /batch` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5a2d33bf0e90bfca", "name": "Unused endpoint: PATCH /{annotation_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{annotation_id}"}, "fullDescription": {"text": "`backend/app/api/v1/annotations.py` declares `PATCH /{annotation_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c7a806fb0681009d", "name": "Unused endpoint: DELETE /{annotation_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{annotation_id}"}, "fullDescription": {"text": "`backend/app/api/v1/annotations.py` declares `DELETE /{annotation_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7175a4c44ec5d614", "name": "Unused endpoint: GET /{template_id}", "shortDescription": {"text": "Unused endpoint: GET /{template_id}"}, "fullDescription": {"text": "`backend/app/api/v1/templates.py` declares `GET /{template_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ec6297a1948072ed", "name": "Unused endpoint: POST /{template_id}/subscribe", "shortDescription": {"text": "Unused endpoint: POST /{template_id}/subscribe"}, "fullDescription": {"text": "`backend/app/api/v1/templates.py` declares `POST /{template_id}/subscribe` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-232c9f73459adaeb", "name": "Unused endpoint: POST /{api_code}", "shortDescription": {"text": "Unused endpoint: POST /{api_code}"}, "fullDescription": {"text": "`backend/app/api/v1/extract.py` declares `POST /{api_code}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dffa4db9a31a15c8", "name": "Unused endpoint: GET /{api_def_id}", "shortDescription": {"text": "Unused endpoint: GET /{api_def_id}"}, "fullDescription": {"text": "`backend/app/api/v1/api_defs.py` declares `GET /{api_def_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6b6ea3b002a3a00d", "name": "Unused endpoint: PUT /{api_def_id}", "shortDescription": {"text": "Unused endpoint: PUT /{api_def_id}"}, "fullDescription": {"text": "`backend/app/api/v1/api_defs.py` declares `PUT /{api_def_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e870de186e490cd2", "name": "Unused endpoint: PATCH /{api_def_id}/status", "shortDescription": {"text": "Unused endpoint: PATCH /{api_def_id}/status"}, "fullDescription": {"text": "`backend/app/api/v1/api_defs.py` declares `PATCH /{api_def_id}/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a52485852faa07b4", "name": "Unused endpoint: GET /{api_def_id}/pending-edits", "shortDescription": {"text": "Unused endpoint: GET /{api_def_id}/pending-edits"}, "fullDescription": {"text": "`backend/app/api/v1/api_defs.py` declares `GET /{api_def_id}/pending-edits` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d9df41f17955f2f9", "name": "Unused endpoint: DELETE /{api_def_id}/pending-edits", "shortDescription": {"text": "Unused endpoint: DELETE /{api_def_id}/pending-edits"}, "fullDescription": {"text": "`backend/app/api/v1/api_defs.py` declares `DELETE /{api_def_id}/pending-edits` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ffc4e0ce7565248b", "name": "Unused endpoint: POST /{api_def_id}/pending-edits/commit-draft", "shortDescription": {"text": "Unused endpoint: POST /{api_def_id}/pending-edits/commit-draft"}, "fullDescription": {"text": "`backend/app/api/v1/api_defs.py` declares `POST /{api_def_id}/pending-edits/commit-draft` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-86e2915a13a5762a", "name": "Unused endpoint: GET /{api_def_id}/required-fields", "shortDescription": {"text": "Unused endpoint: GET /{api_def_id}/required-fields"}, "fullDescription": {"text": "`backend/app/api/v1/api_defs.py` declares `GET /{api_def_id}/required-fields` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6c47c9f430fc24f8", "name": "Unused endpoint: GET /{api_def_id}/versions", "shortDescription": {"text": "Unused endpoint: GET /{api_def_id}/versions"}, "fullDescription": {"text": "`backend/app/api/v1/api_defs.py` declares `GET /{api_def_id}/versions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f39629d234a21cb8", "name": "Unused endpoint: GET /{api_def_id}/docs", "shortDescription": {"text": "Unused endpoint: GET /{api_def_id}/docs"}, "fullDescription": {"text": "`backend/app/api/v1/api_defs.py` declares `GET /{api_def_id}/docs` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-53213e5e5f954db8", "name": "Unused endpoint: GET /{api_def_id}/stats", "shortDescription": {"text": "Unused endpoint: GET /{api_def_id}/stats"}, "fullDescription": {"text": "`backend/app/api/v1/api_defs.py` declares `GET /{api_def_id}/stats` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0fdae85abcd0724b", "name": "Unused endpoint: DELETE /{api_def_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{api_def_id}"}, "fullDescription": {"text": "`backend/app/api/v1/api_defs.py` declares `DELETE /{api_def_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dc6a58caeabd9f23", "name": "Unused endpoint: GET /{api_def_id}/documents", "shortDescription": {"text": "Unused endpoint: GET /{api_def_id}/documents"}, "fullDescription": {"text": "`backend/app/api/v1/api_defs.py` declares `GET /{api_def_id}/documents` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-279aa9c997c803e5", "name": "Unused endpoint: POST /{api_def_id}/documents", "shortDescription": {"text": "Unused endpoint: POST /{api_def_id}/documents"}, "fullDescription": {"text": "`backend/app/api/v1/api_defs.py` declares `POST /{api_def_id}/documents` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-558fabac76dfd4d8", "name": "Unused endpoint: DELETE /{api_def_id}/documents/{document_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{api_def_id}/documents/{document_id}"}, "fullDescription": {"text": "`backend/app/api/v1/api_defs.py` declares `DELETE /{api_def_id}/documents/{document_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ca6de728514bf514", "name": "Unused endpoint: GET /{api_def_id}/samples-review", "shortDescription": {"text": "Unused endpoint: GET /{api_def_id}/samples-review"}, "fullDescription": {"text": "`backend/app/api/v1/api_defs.py` declares `GET /{api_def_id}/samples-review` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-781ce530b8bb2326", "name": "Unused endpoint: POST /{api_def_id}/samples/{document_id}/confirm-gt", "shortDescription": {"text": "Unused endpoint: POST /{api_def_id}/samples/{document_id}/confirm-gt"}, "fullDescription": {"text": "`backend/app/api/v1/api_defs.py` declares `POST /{api_def_id}/samples/{document_id}/confirm-gt` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-97016c2eebff234c", "name": "Unused endpoint: POST /{api_def_id}/samples/{document_id}/retry-ocr", "shortDescription": {"text": "Unused endpoint: POST /{api_def_id}/samples/{document_id}/retry-ocr"}, "fullDescription": {"text": "`backend/app/api/v1/api_defs.py` declares `POST /{api_def_id}/samples/{document_id}/retry-ocr` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/19400"}, "properties": {"repository": "ShaoBingGe/doc_api", "repoUrl": "https://github.com/ShaoBingGe/doc_api", "branch": "main"}, "results": [{"ruleId": "scanner-70e364b2eec298a4", "level": "note", "message": {"text": "Possibly dead Python function: verify_api_def_access"}, "properties": {"repobilityId": "1a0e731c6cff1c46", "scanner": "scanner-primary", "fingerprint": "70e364b2eec298a4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/ocr_optimizer/router.py:54"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1ad647408adea08c", "level": "note", "message": {"text": "Possibly dead Python function: optimize"}, "properties": {"repobilityId": "6ba6a4713b3d9a2b", "scanner": "scanner-primary", "fingerprint": "1ad647408adea08c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/ocr_optimizer/service/run_orchestrator.py:446"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ecafa50d801d852e", "level": "note", "message": {"text": "Possibly dead Python function: run_customize_job"}, "properties": {"repobilityId": "67ea622180e4d62d", "scanner": "scanner-primary", "fingerprint": "ecafa50d801d852e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/ocr_optimizer/service/customer_iteration.py:621"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-518986bad36384e6", "level": "note", "message": {"text": "Possibly dead Python function: resume_customize_job"}, "properties": {"repobilityId": "3959d2d236cbd605", "scanner": "scanner-primary", "fingerprint": "518986bad36384e6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/ocr_optimizer/service/customer_iteration.py:643"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-715ca8a193fde689", "level": "note", "message": {"text": "Possibly dead Python function: clear_piaozone_token_cache"}, "properties": {"repobilityId": "594c43691e1e4009", "scanner": "scanner-primary", "fingerprint": "715ca8a193fde689", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/processors/piaozone_token.py:113"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d4570bacb2791c17", "level": "note", "message": {"text": "Possibly dead Python function: infer"}, "properties": {"repobilityId": "dc40e29e5a1ba2c0", "scanner": "scanner-primary", "fingerprint": "d4570bacb2791c17", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/services/schema_generator.py:163"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-893d059cee4632da", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "893d059cee4632da", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/0002_design_v2_compliance.py:25"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-44d01e462159f9fe", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "44d01e462159f9fe", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/0002_design_v2_compliance.py:54"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-900eae68fde673a4", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "900eae68fde673a4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/a1b2c3d4e5f6_paused_review_skills.py:29"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-db13438b84449cbd", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "db13438b84449cbd", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/a1b2c3d4e5f6_paused_review_skills.py:114"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e04cd4a5bc29d1c6", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "e04cd4a5bc29d1c6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/c5d8a9b1f2e4_country_template_flow.py:30"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-597cf8d19345bae2", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "597cf8d19345bae2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/c5d8a9b1f2e4_country_template_flow.py:40"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a599feba5a979895", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "a599feba5a979895", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/f8a4c2e91d10_ocr_optimizer_tables.py:21"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e69032e01454dd71", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "e69032e01454dd71", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/f8a4c2e91d10_ocr_optimizer_tables.py:154"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f06870a89fa4999b", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "f06870a89fa4999b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/e2601813cfca_add_prompt_versions.py:22"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a718b7df987825de", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "a718b7df987825de", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/e2601813cfca_add_prompt_versions.py:40"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1afc3d479e3e5908", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "1afc3d479e3e5908", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/e7d4b91c8a02_promote_global_rules.py:49"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b71e8fe4cb79f31e", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "b71e8fe4cb79f31e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/e7d4b91c8a02_promote_global_rules.py:116"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bb89d7745d45fce8", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "bb89d7745d45fce8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/f2c8b3a9d104_add_pending_edits.py:48"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1d6eb901e63b5c75", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "1d6eb901e63b5c75", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/f2c8b3a9d104_add_pending_edits.py:53"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-28c38401a6bd46a9", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "28c38401a6bd46a9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/d6e9a2b4f1c8_customize_jobs.py:27"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8807e3ffbb6b9493", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "8807e3ffbb6b9493", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/d6e9a2b4f1c8_customize_jobs.py:61"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8ae4de36cbe35bcd", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "8ae4de36cbe35bcd", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/d8d98191e643_add_usage_records.py:22"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-95a2fffb239202ad", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "95a2fffb239202ad", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/alembic/versions/d8d98191e643_add_usage_records.py:44"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9e4fe0878a32ac4d", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 frontend/src/components/fields/FieldEditorPanel.tsx:22"}, "properties": {"repobilityId": "e11653e0e1959476", "scanner": "scanner-primary", "fingerprint": "9e4fe0878a32ac4d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-29cb5b7f4a7b3748", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/api/ApiPreviewPanel.tsx:149"}, "properties": {"repobilityId": "e2ee29d1c21b8e9a", "scanner": "scanner-primary", "fingerprint": "29cb5b7f4a7b3748", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-7deddd8be7e2dec6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/workspace-v2/DarkJsonViewer.tsx:222"}, "properties": {"repobilityId": "886883910a5505a4", "scanner": "scanner-primary", "fingerprint": "7deddd8be7e2dec6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cb6600e4ad296d4c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/workspace-v2/OptimizationProcessPanel.tsx:849"}, "properties": {"repobilityId": "39ee26a8f2f6881d", "scanner": "scanner-primary", "fingerprint": "cb6600e4ad296d4c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c28b195085f9b903", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/workspace-v2/DocumentThumbnailColumn.tsx:113"}, "properties": {"repobilityId": "06aded0149538bd3", "scanner": "scanner-primary", "fingerprint": "c28b195085f9b903", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-be859ac5eeb547fb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/workspace-v2/WorkspaceHeader.tsx:148"}, "properties": {"repobilityId": "ac0beb2c183bcd27", "scanner": "scanner-primary", "fingerprint": "be859ac5eeb547fb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ab98aa749e50648d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/workspace-v2/DarkFieldViewer.tsx:226"}, "properties": {"repobilityId": "0191e82deb5f1394", "scanner": "scanner-primary", "fingerprint": "ab98aa749e50648d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1f66ad88286ca30a", "level": "warning", "message": {"text": "Dockerfile runs as root: backend/Dockerfile"}, "properties": {"repobilityId": "7afd2b0e8a8c9eeb", "scanner": "scanner-primary", "fingerprint": "1f66ad88286ca30a", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-8cd20d539467d2c5", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "properties": {"repobilityId": "06b87ac9439092d6", "scanner": "scanner-primary", "fingerprint": "8cd20d539467d2c5", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-fc6fcb6c5576feac", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in prototyype.html:674"}, "properties": {"repobilityId": "d4172d6fae6ec51e", "scanner": "scanner-primary", "fingerprint": "fc6fcb6c5576feac", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "prototyype.html"}, "region": {"startLine": 674}}}]}, {"ruleId": "scanner-3c43b8c5c85d7d49", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/api/ApiPreviewPanel.tsx:149"}, "properties": {"repobilityId": "3568bc0361deedc4", "scanner": "scanner-primary", "fingerprint": "3c43b8c5c85d7d49", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/api/ApiPreviewPanel.tsx"}, "region": {"startLine": 149}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-4d4f5bfaa26f2bd4", "level": "note", "message": {"text": "Very large file: frontend/src/stores/workspace-store.ts (1397 lines)"}, "properties": {"repobilityId": "3e9c97430033d26a", "scanner": "scanner-primary", "fingerprint": "4d4f5bfaa26f2bd4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-473a9cc4d67550d6", "level": "note", "message": {"text": "Very large file: frontend/src/components/workspace-v2/OptimizationProcessPanel.tsx (1396 lines)"}, "properties": {"repobilityId": "3c2e81a8bdf22cd4", "scanner": "scanner-primary", "fingerprint": "473a9cc4d67550d6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-16a8fa33a0381523", "level": "note", "message": {"text": "Very large file: frontend/src/components/workspace-v2/DarkFieldViewer.tsx (2315 lines)"}, "properties": {"repobilityId": "f3518db09c7462b0", "scanner": "scanner-primary", "fingerprint": "16a8fa33a0381523", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0d1400fecb8286bb", "level": "note", "message": {"text": "Very large file: backend/app/ocr_optimizer/service/customer_iteration.py (2260 lines)"}, "properties": {"repobilityId": "d8bef9c8d2846cd9", "scanner": "scanner-primary", "fingerprint": "0d1400fecb8286bb", "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-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "194cb04384e0c652", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "05662dc83c603d96", "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": "a04fc5a3c1a74a8b", "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": "e0076abd15ba4765", "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": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "8f3102b97e5b5df3", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "4ef32f99615c304d", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "eae8983528fd387d", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "284f49da287304e1", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "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-d0e3a28310337686", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/stores/workspace-store.ts:162"}, "properties": {"repobilityId": "df6aa85b3c112a29", "scanner": "scanner-primary", "fingerprint": "d0e3a28310337686", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-185cd08037e5b7a3", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/components/workspace-v2/OptimizationProcessPanel.tsx:148"}, "properties": {"repobilityId": "138fa52023767d22", "scanner": "scanner-primary", "fingerprint": "185cd08037e5b7a3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3ff4b2d9827df150", "level": "none", "message": {"text": "Commented-code block (8 lines) in frontend/src/components/workspace-v2/DarkDocumentViewer.tsx:144"}, "properties": {"repobilityId": "0df17303de0fdb66", "scanner": "scanner-primary", "fingerprint": "3ff4b2d9827df150", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a458bcd154e9b7eb", "level": "none", "message": {"text": "Commented-code block (7 lines) in frontend/src/components/workspace-v2/DarkFieldViewer.tsx:810"}, "properties": {"repobilityId": "d1f480d6642e6788", "scanner": "scanner-primary", "fingerprint": "a458bcd154e9b7eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fc32a3088834e79c", "level": "none", "message": {"text": "Commented-code block (5 lines) in frontend/src/lib/api-client.ts:31"}, "properties": {"repobilityId": "b4c25a861078441e", "scanner": "scanner-primary", "fingerprint": "fc32a3088834e79c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b711157db5020dee", "level": "note", "message": {"text": "Legacy-named symbol `test_field_rule_of_reads_persisted_copy` in backend/tests/test_field_rule.py:71"}, "properties": {"repobilityId": "44c59d63b7e6e0fa", "scanner": "scanner-primary", "fingerprint": "b711157db5020dee", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5215492b9c8a473a", "level": "note", "message": {"text": "Legacy-named symbol `__rename_old` in backend/tests/test_pending_edits.py:633"}, "properties": {"repobilityId": "946c48fdc2b29a6e", "scanner": "scanner-primary", "fingerprint": "5215492b9c8a473a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6829ed3188fb636d", "level": "none", "message": {"text": "Commented-code block (8 lines) in backend/app/models/api_definition.py:88"}, "properties": {"repobilityId": "21ff61afd2dbf4d8", "scanner": "scanner-primary", "fingerprint": "6829ed3188fb636d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-12b9e1a5d8aedb7e", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/ocr_optimizer/models.py:118"}, "properties": {"repobilityId": "12fbc0b250da727f", "scanner": "scanner-primary", "fingerprint": "12b9e1a5d8aedb7e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea22c82f569a7a30", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/ocr_optimizer/reflection/reflector.py:39"}, "properties": {"repobilityId": "cbd1ddb4daa6fbc8", "scanner": "scanner-primary", "fingerprint": "ea22c82f569a7a30", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7884a0780602ef80", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/ocr_optimizer/eval/golden_loop.py:69"}, "properties": {"repobilityId": "fee0b134b6ec1226", "scanner": "scanner-primary", "fingerprint": "7884a0780602ef80", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-16547373d5d60e61", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/app/ocr_optimizer/service/run_orchestrator.py:739"}, "properties": {"repobilityId": "b3ea8dbdc2c04931", "scanner": "scanner-primary", "fingerprint": "16547373d5d60e61", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2e33a81d3f70160", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/app/ocr_optimizer/service/composer.py:46"}, "properties": {"repobilityId": "cf18d4ae92e175bc", "scanner": "scanner-primary", "fingerprint": "b2e33a81d3f70160", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8bf32716866f69bc", "level": "note", "message": {"text": "Legacy-named symbol `__rename_old` in backend/app/ocr_optimizer/service/customer_iteration.py:1716"}, "properties": {"repobilityId": "6bfcd6e61e2778e5", "scanner": "scanner-primary", "fingerprint": "8bf32716866f69bc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-df8a7cca69502b66", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/ocr_optimizer/service/customer_iteration.py:239"}, "properties": {"repobilityId": "695c00529f164505", "scanner": "scanner-primary", "fingerprint": "df8a7cca69502b66", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fba8c76ffe27fe7f", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/ocr_optimizer/service/template_loader.py:37"}, "properties": {"repobilityId": "7bea30e1db00175b", "scanner": "scanner-primary", "fingerprint": "fba8c76ffe27fe7f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0bdb03da57bd997d", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/ocr_optimizer/service/preset_init.py:90"}, "properties": {"repobilityId": "3e678be987423554", "scanner": "scanner-primary", "fingerprint": "0bdb03da57bd997d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-da962764abe1da57", "level": "note", "message": {"text": "Legacy-named symbol `collapsed_old` in backend/app/services/pending_edits_service.py:121"}, "properties": {"repobilityId": "64d292b0a5c3fbea", "scanner": "scanner-primary", "fingerprint": "da962764abe1da57", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fa705c677a905fe5", "level": "none", "message": {"text": "Commented-code block (9 lines) in backend/app/services/pending_edits_service.py:319"}, "properties": {"repobilityId": "1a2cfad9b39e0cc9", "scanner": "scanner-primary", "fingerprint": "fa705c677a905fe5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5c9bf5aa6091506c", "level": "note", "message": {"text": "Legacy-named symbol `api_deprecated` in backend/app/services/api_definition_service.py:407"}, "properties": {"repobilityId": "11bd0b3afdbe3aef", "scanner": "scanner-primary", "fingerprint": "5c9bf5aa6091506c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-af053e959e1b7194", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/services/api_definition_service.py:344"}, "properties": {"repobilityId": "44153d1e06ff25de", "scanner": "scanner-primary", "fingerprint": "af053e959e1b7194", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-47acb6a8388557d5", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/app/services/document_service.py:323"}, "properties": {"repobilityId": "86a442c033afb515", "scanner": "scanner-primary", "fingerprint": "47acb6a8388557d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-51a6c6507ee9f77a", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/app/core/config.py:63"}, "properties": {"repobilityId": "85faac88df08f01e", "scanner": "scanner-primary", "fingerprint": "51a6c6507ee9f77a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0ceb9dc26875d9fd", "level": "note", "message": {"text": "Legacy-named symbol `api_deprecated` in backend/app/core/exceptions.py:65"}, "properties": {"repobilityId": "ebb5633b336ceacc", "scanner": "scanner-primary", "fingerprint": "0ceb9dc26875d9fd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "2dd20b72e20a5f6a", "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": "ae5d76e722c5eb25", "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": "9ef88453111f6ccd", "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": "9d06822e4e6f6520", "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": "7314fc34514608b7", "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": "d2bf2fbafb4fc97c", "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": "13b28ccf05573ecc", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "3fc498dedc93dd84", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "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": "e5ceb64cf459d166", "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": "ccb6eb6dd7055efe", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-049cf4369c9c06ab", "level": "warning", "message": {"text": "Frontend route `/workspace/api/:apiDefinitionId` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "1329a6430b6e76db", "scanner": "scanner-primary", "fingerprint": "049cf4369c9c06ab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1c1529a8b30efbe0", "level": "warning", "message": {"text": "Frontend route `/workspace/:documentId` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "fc1a6aaa7d8f2db9", "scanner": "scanner-primary", "fingerprint": "1c1529a8b30efbe0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d09e2fbb36c2790e", "level": "warning", "message": {"text": "Frontend route `api-keys` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "5020df2a8d1011a4", "scanner": "scanner-primary", "fingerprint": "d09e2fbb36c2790e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9f637b9b79a6cdc3", "level": "warning", "message": {"text": "Frontend route `traffic` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "f3d678bbf90c6c06", "scanner": "scanner-primary", "fingerprint": "9f637b9b79a6cdc3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2408492a23c48dc3", "level": "warning", "message": {"text": "Frontend route `billing` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "532e92b1130b97db", "scanner": "scanner-primary", "fingerprint": "2408492a23c48dc3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-800f16a42a897ed4", "level": "warning", "message": {"text": "Frontend route `ocr-optimizer` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "7ba0a0e6e9dbbbcd", "scanner": "scanner-primary", "fingerprint": "800f16a42a897ed4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-16c98e1312fbeb0a", "level": "warning", "message": {"text": "Frontend route `system-admins` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "314e383f4d304e73", "scanner": "scanner-primary", "fingerprint": "16c98e1312fbeb0a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a86e7b1f274fd3d3", "level": "warning", "message": {"text": "Frontend route `country-templates` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "38e4718597596aa8", "scanner": "scanner-primary", "fingerprint": "a86e7b1f274fd3d3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bd0da8ca886ef8fc", "level": "error", "message": {"text": "FastAPI PUT `save_agent` without auth dependency \u2014 backend/app/api/v1/reflection_agents.py:64"}, "properties": {"repobilityId": "9cbbd077585fafca", "scanner": "scanner-primary", "fingerprint": "bd0da8ca886ef8fc", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/reflection_agents.py"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-95b81098916801d5", "level": "error", "message": {"text": "FastAPI POST `_create` without auth dependency \u2014 backend/app/api/v1/conversations.py:31"}, "properties": {"repobilityId": "88d0033502b18b5d", "scanner": "scanner-primary", "fingerprint": "95b81098916801d5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/conversations.py"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-81c19d4d357b18e4", "level": "error", "message": {"text": "FastAPI POST `_send_message` without auth dependency \u2014 backend/app/api/v1/conversations.py:46"}, "properties": {"repobilityId": "9f47e26ab6234303", "scanner": "scanner-primary", "fingerprint": "81c19d4d357b18e4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/conversations.py"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-e7baffd7e4a70f5d", "level": "error", "message": {"text": "FastAPI PUT `_update_schema` without auth dependency \u2014 backend/app/api/v1/conversations.py:56"}, "properties": {"repobilityId": "dc26faf7a3e47ca7", "scanner": "scanner-primary", "fingerprint": "e7baffd7e4a70f5d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/conversations.py"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-1edcf2ae00c9cbca", "level": "error", "message": {"text": "FastAPI POST `_rollback` without auth dependency \u2014 backend/app/api/v1/conversations.py:66"}, "properties": {"repobilityId": "5979b624a36c7428", "scanner": "scanner-primary", "fingerprint": "1edcf2ae00c9cbca", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/conversations.py"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-4d939162211f1c04", "level": "error", "message": {"text": "FastAPI DELETE `_delete` without auth dependency \u2014 backend/app/api/v1/conversations.py:71"}, "properties": {"repobilityId": "d9da82175f44ec22", "scanner": "scanner-primary", "fingerprint": "4d939162211f1c04", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/conversations.py"}, "region": {"startLine": 71}}}]}, {"ruleId": "scanner-01c84643ced5e697", "level": "error", "message": {"text": "FastAPI POST `extract_document` without auth dependency \u2014 backend/app/api/v1/extract.py:25"}, "properties": {"repobilityId": "0291fbf4dd4d5966", "scanner": "scanner-primary", "fingerprint": "01c84643ced5e697", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/extract.py"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-2838e052dc0851e9", "level": "error", "message": {"text": "FastAPI POST `resume_customize_job_endpoint` without auth dependency \u2014 backend/app/api/v1/api_defs.py:531"}, "properties": {"repobilityId": "09804d05d4b0f7e8", "scanner": "scanner-primary", "fingerprint": "2838e052dc0851e9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/api_defs.py"}, "region": {"startLine": 531}}}]}, {"ruleId": "scanner-64a9bc98c2c281b4", "level": "error", "message": {"text": "FastAPI POST `create_system_admin` without auth dependency \u2014 backend/app/api/v1/admin_users.py:42"}, "properties": {"repobilityId": "1b77c870c75cd8fb", "scanner": "scanner-primary", "fingerprint": "64a9bc98c2c281b4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/api/v1/admin_users.py"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-6b2a5361f8b6e6b9", "level": "error", "message": {"text": "FastAPI POST `post_init` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:82"}, "properties": {"repobilityId": "68d60dd246fbd043", "scanner": "scanner-primary", "fingerprint": "6b2a5361f8b6e6b9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/ocr_optimizer/router.py"}, "region": {"startLine": 82}}}]}, {"ruleId": "scanner-bc0ab04f8127b2f2", "level": "error", "message": {"text": "FastAPI PATCH `activate` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:132"}, "properties": {"repobilityId": "b2186f3bd6ce3a30", "scanner": "scanner-primary", "fingerprint": "bc0ab04f8127b2f2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/ocr_optimizer/router.py"}, "region": {"startLine": 132}}}]}, {"ruleId": "scanner-50b2e88d021f035e", "level": "error", "message": {"text": "FastAPI POST `trigger_optimize` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:150"}, "properties": {"repobilityId": "1a851fa3cf760a47", "scanner": "scanner-primary", "fingerprint": "50b2e88d021f035e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/ocr_optimizer/router.py"}, "region": {"startLine": 150}}}]}, {"ruleId": "scanner-6f7f80195ce29fa8", "level": "error", "message": {"text": "FastAPI POST `trigger_advance` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:181"}, "properties": {"repobilityId": "5ad6c64bb0738b38", "scanner": "scanner-primary", "fingerprint": "6f7f80195ce29fa8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/ocr_optimizer/router.py"}, "region": {"startLine": 181}}}]}, {"ruleId": "scanner-b73f1019a31958cd", "level": "error", "message": {"text": "FastAPI POST `trigger_finalize` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:205"}, "properties": {"repobilityId": "69cf7e45234866f1", "scanner": "scanner-primary", "fingerprint": "b73f1019a31958cd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/ocr_optimizer/router.py"}, "region": {"startLine": 205}}}]}, {"ruleId": "scanner-78ef7f8ec77b464f", "level": "error", "message": {"text": "FastAPI POST `trigger_abort` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:220"}, "properties": {"repobilityId": "9f811497d95853f3", "scanner": "scanner-primary", "fingerprint": "78ef7f8ec77b464f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/ocr_optimizer/router.py"}, "region": {"startLine": 220}}}]}, {"ruleId": "scanner-2b9ab8283d3b321d", "level": "error", "message": {"text": "FastAPI POST `post_manual_patch` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:234"}, "properties": {"repobilityId": "207b539fca8410fd", "scanner": "scanner-primary", "fingerprint": "2b9ab8283d3b321d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/ocr_optimizer/router.py"}, "region": {"startLine": 234}}}]}, {"ruleId": "scanner-bb093bb00a32fbb3", "level": "error", "message": {"text": "FastAPI POST `create_skill` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:281"}, "properties": {"repobilityId": "d293b561247ee1b9", "scanner": "scanner-primary", "fingerprint": "bb093bb00a32fbb3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/ocr_optimizer/router.py"}, "region": {"startLine": 281}}}]}, {"ruleId": "scanner-d106eab919a0dece", "level": "error", "message": {"text": "FastAPI POST `attach_skill` without auth dependency \u2014 backend/app/ocr_optimizer/router.py:297"}, "properties": {"repobilityId": "5f0f0d7de2ec3a2a", "scanner": "scanner-primary", "fingerprint": "d106eab919a0dece", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app/ocr_optimizer/router.py"}, "region": {"startLine": 297}}}]}, {"ruleId": "scanner-e782b0ca919abd3d", "level": "note", "message": {"text": "Unused endpoint: GET /reflection-agents/countries"}, "properties": {"repobilityId": "4f8d2f8e5f588284", "scanner": "scanner-primary", "fingerprint": "e782b0ca919abd3d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4793695249c286d3", "level": "note", "message": {"text": "Unused endpoint: GET /reflection-agents/{country}"}, "properties": {"repobilityId": "998793f835cc8a9c", "scanner": "scanner-primary", "fingerprint": "4793695249c286d3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-15d02a2afc645589", "level": "note", "message": {"text": "Unused endpoint: PUT /reflection-agents/{country}/{kind}"}, "properties": {"repobilityId": "ab96391b56e826c7", "scanner": "scanner-primary", "fingerprint": "15d02a2afc645589", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4ea8a76f49cdceb4", "level": "note", "message": {"text": "Unused endpoint: GET /country-templates"}, "properties": {"repobilityId": "cdd1c62e15fcc78f", "scanner": "scanner-primary", "fingerprint": "4ea8a76f49cdceb4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-001db17cbe704638", "level": "note", "message": {"text": "Unused endpoint: GET /golden/{country}/seeds"}, "properties": {"repobilityId": "8e90463f3aef86f8", "scanner": "scanner-primary", "fingerprint": "001db17cbe704638", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-64858c47dc029138", "level": "note", "message": {"text": "Unused endpoint: GET /golden/{country}/seeds/{seed_id}/file"}, "properties": {"repobilityId": "1c4d5e566b95b866", "scanner": "scanner-primary", "fingerprint": "64858c47dc029138", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-15968cb67ab0b918", "level": "note", "message": {"text": "Unused endpoint: POST /golden/{country}/evaluate"}, "properties": {"repobilityId": "d8d79560da2e5f5a", "scanner": "scanner-primary", "fingerprint": "15968cb67ab0b918", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-889152c5f9b2096a", "level": "note", "message": {"text": "Unused endpoint: GET /golden/{country}/evaluation"}, "properties": {"repobilityId": "26729e809a99c65e", "scanner": "scanner-primary", "fingerprint": "889152c5f9b2096a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-841e50bf821e4158", "level": "note", "message": {"text": "Unused endpoint: GET /users"}, "properties": {"repobilityId": "81526ac4f0efba3f", "scanner": "scanner-primary", "fingerprint": "841e50bf821e4158", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1bca8100a44f7f25", "level": "note", "message": {"text": "Unused endpoint: POST /users"}, "properties": {"repobilityId": "22fc6454ac9e0e8b", "scanner": "scanner-primary", "fingerprint": "1bca8100a44f7f25", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "c4bc91f3b5f086fe", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "c270a6d5de4ec9e3", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6570594a7b6f1211", "level": "note", "message": {"text": "Unused endpoint: PUT /{key_id}"}, "properties": {"repobilityId": "d65083dd19f30823", "scanner": "scanner-primary", "fingerprint": "6570594a7b6f1211", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-38f0a0bf734e5bcc", "level": "note", "message": {"text": "Unused endpoint: DELETE /{key_id}"}, "properties": {"repobilityId": "cc245967529dc404", "scanner": "scanner-primary", "fingerprint": "38f0a0bf734e5bcc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-69f497da676def28", "level": "note", "message": {"text": "Unused endpoint: POST /{key_id}/rotate"}, "properties": {"repobilityId": "c1f3b606e0d1379a", "scanner": "scanner-primary", "fingerprint": "69f497da676def28", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-618721b912bad1c2", "level": "note", "message": {"text": "Unused endpoint: POST /login"}, "properties": {"repobilityId": "7c038357f469cb5e", "scanner": "scanner-primary", "fingerprint": "618721b912bad1c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7952846d57642272", "level": "note", "message": {"text": "Unused endpoint: POST /login/code"}, "properties": {"repobilityId": "7c339a2db20235c7", "scanner": "scanner-primary", "fingerprint": "7952846d57642272", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "23b9fafe4ca337ea", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4fe9bb486644f008", "level": "note", "message": {"text": "Unused endpoint: POST /change-password"}, "properties": {"repobilityId": "3bf34dd680dfb0f0", "scanner": "scanner-primary", "fingerprint": "4fe9bb486644f008", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eb4965f4d227f8b3", "level": "note", "message": {"text": "Unused endpoint: GET /{conversation_id}"}, "properties": {"repobilityId": "789b3fae6b194fe9", "scanner": "scanner-primary", "fingerprint": "eb4965f4d227f8b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5e44869ee7800ad1", "level": "note", "message": {"text": "Unused endpoint: POST /{conversation_id}/messages"}, "properties": {"repobilityId": "e0ef495171c1e21b", "scanner": "scanner-primary", "fingerprint": "5e44869ee7800ad1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e60037f5de1574b4", "level": "note", "message": {"text": "Unused endpoint: GET /{conversation_id}/schema"}, "properties": {"repobilityId": "7e27d75c215ad348", "scanner": "scanner-primary", "fingerprint": "e60037f5de1574b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ad97b466317d9b18", "level": "note", "message": {"text": "Unused endpoint: PUT /{conversation_id}/schema"}, "properties": {"repobilityId": "64c117a8a21d525d", "scanner": "scanner-primary", "fingerprint": "ad97b466317d9b18", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-75cecfa596c7f8ca", "level": "note", "message": {"text": "Unused endpoint: GET /{conversation_id}/schema/history"}, "properties": {"repobilityId": "b401925d4daf30be", "scanner": "scanner-primary", "fingerprint": "75cecfa596c7f8ca", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f6a4ffa5fadd0ccf", "level": "note", "message": {"text": "Unused endpoint: POST /{conversation_id}/rollback/{version}"}, "properties": {"repobilityId": "9271eb98cad2e61d", "scanner": "scanner-primary", "fingerprint": "f6a4ffa5fadd0ccf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ad72d180247f16e2", "level": "note", "message": {"text": "Unused endpoint: DELETE /{conversation_id}"}, "properties": {"repobilityId": "2f51dbf6abe9733f", "scanner": "scanner-primary", "fingerprint": "ad72d180247f16e2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-52c85377cc38e474", "level": "note", "message": {"text": "Unused endpoint: POST /batch"}, "properties": {"repobilityId": "974e75421963c329", "scanner": "scanner-primary", "fingerprint": "52c85377cc38e474", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e6b186a005a557b7", "level": "note", "message": {"text": "Unused endpoint: PATCH /batch"}, "properties": {"repobilityId": "356cc384278ce538", "scanner": "scanner-primary", "fingerprint": "e6b186a005a557b7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5a2d33bf0e90bfca", "level": "note", "message": {"text": "Unused endpoint: PATCH /{annotation_id}"}, "properties": {"repobilityId": "dfa830e87998d108", "scanner": "scanner-primary", "fingerprint": "5a2d33bf0e90bfca", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c7a806fb0681009d", "level": "note", "message": {"text": "Unused endpoint: DELETE /{annotation_id}"}, "properties": {"repobilityId": "7f6f38fae948515d", "scanner": "scanner-primary", "fingerprint": "c7a806fb0681009d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7175a4c44ec5d614", "level": "note", "message": {"text": "Unused endpoint: GET /{template_id}"}, "properties": {"repobilityId": "c74b661c0db1d2bc", "scanner": "scanner-primary", "fingerprint": "7175a4c44ec5d614", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec6297a1948072ed", "level": "note", "message": {"text": "Unused endpoint: POST /{template_id}/subscribe"}, "properties": {"repobilityId": "1cf5b1d37da295a6", "scanner": "scanner-primary", "fingerprint": "ec6297a1948072ed", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-232c9f73459adaeb", "level": "note", "message": {"text": "Unused endpoint: POST /{api_code}"}, "properties": {"repobilityId": "a6ce75cfade2680e", "scanner": "scanner-primary", "fingerprint": "232c9f73459adaeb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dffa4db9a31a15c8", "level": "note", "message": {"text": "Unused endpoint: GET /{api_def_id}"}, "properties": {"repobilityId": "3b087be282ad799b", "scanner": "scanner-primary", "fingerprint": "dffa4db9a31a15c8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6b6ea3b002a3a00d", "level": "note", "message": {"text": "Unused endpoint: PUT /{api_def_id}"}, "properties": {"repobilityId": "e6b95c143f1e8526", "scanner": "scanner-primary", "fingerprint": "6b6ea3b002a3a00d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e870de186e490cd2", "level": "note", "message": {"text": "Unused endpoint: PATCH /{api_def_id}/status"}, "properties": {"repobilityId": "c6be3ddfb6f98b29", "scanner": "scanner-primary", "fingerprint": "e870de186e490cd2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a52485852faa07b4", "level": "note", "message": {"text": "Unused endpoint: GET /{api_def_id}/pending-edits"}, "properties": {"repobilityId": "97f4ca051994bae6", "scanner": "scanner-primary", "fingerprint": "a52485852faa07b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d9df41f17955f2f9", "level": "note", "message": {"text": "Unused endpoint: DELETE /{api_def_id}/pending-edits"}, "properties": {"repobilityId": "3cab5615256f6aa5", "scanner": "scanner-primary", "fingerprint": "d9df41f17955f2f9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ffc4e0ce7565248b", "level": "note", "message": {"text": "Unused endpoint: POST /{api_def_id}/pending-edits/commit-draft"}, "properties": {"repobilityId": "5f308e0800041849", "scanner": "scanner-primary", "fingerprint": "ffc4e0ce7565248b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-86e2915a13a5762a", "level": "note", "message": {"text": "Unused endpoint: GET /{api_def_id}/required-fields"}, "properties": {"repobilityId": "def9e7ce810d9a74", "scanner": "scanner-primary", "fingerprint": "86e2915a13a5762a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6c47c9f430fc24f8", "level": "note", "message": {"text": "Unused endpoint: GET /{api_def_id}/versions"}, "properties": {"repobilityId": "042909b49d609b1a", "scanner": "scanner-primary", "fingerprint": "6c47c9f430fc24f8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f39629d234a21cb8", "level": "note", "message": {"text": "Unused endpoint: GET /{api_def_id}/docs"}, "properties": {"repobilityId": "da3e6ac3f47e63e1", "scanner": "scanner-primary", "fingerprint": "f39629d234a21cb8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-53213e5e5f954db8", "level": "note", "message": {"text": "Unused endpoint: GET /{api_def_id}/stats"}, "properties": {"repobilityId": "77c2b214c2330f1f", "scanner": "scanner-primary", "fingerprint": "53213e5e5f954db8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0fdae85abcd0724b", "level": "note", "message": {"text": "Unused endpoint: DELETE /{api_def_id}"}, "properties": {"repobilityId": "53e5372f47cb7c67", "scanner": "scanner-primary", "fingerprint": "0fdae85abcd0724b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dc6a58caeabd9f23", "level": "note", "message": {"text": "Unused endpoint: GET /{api_def_id}/documents"}, "properties": {"repobilityId": "1c8f2347eacf67cc", "scanner": "scanner-primary", "fingerprint": "dc6a58caeabd9f23", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-279aa9c997c803e5", "level": "note", "message": {"text": "Unused endpoint: POST /{api_def_id}/documents"}, "properties": {"repobilityId": "d8d00c38b98db165", "scanner": "scanner-primary", "fingerprint": "279aa9c997c803e5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-558fabac76dfd4d8", "level": "note", "message": {"text": "Unused endpoint: DELETE /{api_def_id}/documents/{document_id}"}, "properties": {"repobilityId": "77e527e832a73ab8", "scanner": "scanner-primary", "fingerprint": "558fabac76dfd4d8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca6de728514bf514", "level": "note", "message": {"text": "Unused endpoint: GET /{api_def_id}/samples-review"}, "properties": {"repobilityId": "6716aa349abe442c", "scanner": "scanner-primary", "fingerprint": "ca6de728514bf514", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-781ce530b8bb2326", "level": "note", "message": {"text": "Unused endpoint: POST /{api_def_id}/samples/{document_id}/confirm-gt"}, "properties": {"repobilityId": "f44a024fa2ea55b6", "scanner": "scanner-primary", "fingerprint": "781ce530b8bb2326", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-97016c2eebff234c", "level": "note", "message": {"text": "Unused endpoint: POST /{api_def_id}/samples/{document_id}/retry-ocr"}, "properties": {"repobilityId": "5fef18fc8693f8a0", "scanner": "scanner-primary", "fingerprint": "97016c2eebff234c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}