{"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-7a068705898845f8", "name": "Possibly dead Python function: reorder_slides", "shortDescription": {"text": "Possibly dead Python function: reorder_slides"}, "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-8f01f0bf7f38eec1", "name": "Possibly dead Python function: delete_shape_by_run_text", "shortDescription": {"text": "Possibly dead Python function: delete_shape_by_run_text"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e818ad4e1289414f", "name": "Possibly dead Python function: highlight_runs", "shortDescription": {"text": "Possibly dead Python function: highlight_runs"}, "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-a8a95a6c1e8cf087", "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-40370fe6358046fe", "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-708093a5ba37781c", "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-de8999eb0c0e5e6b", "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-37aae87ab50fba9a", "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-741854aa448a800c", "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-8ae9b4fc036c130e", "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-bf2ad7200d102b12", "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-82eb3f027815621b", "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-9d2bf5b7dbd2d75e", "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-99199bdc7363c413", "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-60e7917a5d7993f1", "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-34b2bb60213a1268", "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-a95ad61611e21686", "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-9999de276cfc2989", "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-b087050e30a6f88b", "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-21eb27b1fc5a9a26", "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-98a6448656cc8486", "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-a5ee5b918c2e6745", "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-222c4cc8cb510471", "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-56afa78547bf5c29", "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-29e365258ec52154", "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-3d89ff9e6013e65e", "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-1049a7bb5c48550c", "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-4c6613c0a85351ac", "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-0eff8aec7a392d80", "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-26ec818fb28af04a", "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-d5cab246671b73ee", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/v1/src/components/coverage-heatmap.tsx:62", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/v1/src/components/coverage-heatmap.tsx:62"}, "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-e766025ba595eef1", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/v1/src/components/ui/chart.tsx:73", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/v1/src/components/ui/chart.tsx:73"}, "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-4bc0330946981869", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/feed-event-item.tsx:55", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/feed-event-item.tsx:55"}, "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-dc6d455871f49078", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/project-card.tsx:27", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/project-card.tsx:27"}, "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-957ab50d556faa4b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/ui/chart.tsx:73", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/ui/chart.tsx:73"}, "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-422ee5530678ebc6", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/routes/domains.$id.tsx:271", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/routes/domains.$id.tsx:271"}, "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-7765d85c41e8cb89", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/routes/register.tsx:412", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/routes/register.tsx:412"}, "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-15703fc9dd44d488", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/routes/projects.index.tsx:108", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/routes/projects.index.tsx:108"}, "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-79b36836aaed6d78", "name": "Dockerfile runs as root: frontend/v1/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: frontend/v1/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-a17a360aeeb4831e", "name": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-81934d9685193efa", "name": "Dockerfile runs as root: backend/v1/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: backend/v1/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-df2530d7d9c7d416", "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-9b267739450460e8", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/v1/src/components/ui/chart.tsx:73", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/v1/src/components/ui/chart.tsx:73"}, "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-7bd6c7d9d93c4875", "name": "Possible secret in frontend/v1/src/pages/LoginPage.tsx", "shortDescription": {"text": "Possible secret in frontend/v1/src/pages/LoginPage.tsx"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-df167bff2a7fdacb", "name": "Possible secret in frontend/v1/e2e/helpers.ts", "shortDescription": {"text": "Possible secret in frontend/v1/e2e/helpers.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-7d1e47f7fafdc7a3", "name": "Insecure pattern 'local_storage_auth_token' in frontend/v1/e2e/login.spec.ts:36", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/v1/e2e/login.spec.ts:36"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2cbfd0b402a69372", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/ui/chart.tsx:73", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/ui/chart.tsx:73"}, "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-26a303c8babc6a1e", "name": "Possible secret in backend/v1/src/obione/cli/seed_demo.py", "shortDescription": {"text": "Possible secret in backend/v1/src/obione/cli/seed_demo.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-f7c34b3506afc4a2", "name": "Very large file: frontend/src/routes/projects.$id.tsx (1929 lines)", "shortDescription": {"text": "Very large file: frontend/src/routes/projects.$id.tsx (1929 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-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 74 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 135 placeholder/mock markers across 61 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-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. 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-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.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-cedadc5432427311", "name": "Agent authority lacks a verifier contract: .claude/skills/apresentacao-poli/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/apresentacao-poli/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ce6c7c8e9bfb31f2", "name": "Agent authority lacks a verifier contract: .claude/skills/apresentacao-poli/references/anti-patterns.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/apresentacao-poli/references/anti-patterns.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-834e6577f45b8ae2", "name": "Agent authority lacks a verifier contract: .claude/skills/documento-poli/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/documento-poli/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4583b9282c1f6823", "name": "Commented-code block (6 lines) in frontend/vite.config.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/vite.config.ts:1"}, "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-2f707c6d5a75ef54", "name": "Commented-code block (6 lines) in frontend/v1/src/test/setup.ts:22", "shortDescription": {"text": "Commented-code block (6 lines) in frontend/v1/src/test/setup.ts:22"}, "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-53c7cba6a89f9bcc", "name": "Legacy-named symbol `statusCodeToLegacy` in frontend/src/routes/projects.$id.tsx:136", "shortDescription": {"text": "Legacy-named symbol `statusCodeToLegacy` in frontend/src/routes/projects.$id.tsx:136"}, "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-76947a9eb58a4b65", "name": "Legacy-named symbol `statusCodeToLegacy` in frontend/src/routes/domains.$id.tsx:54", "shortDescription": {"text": "Legacy-named symbol `statusCodeToLegacy` in frontend/src/routes/domains.$id.tsx:54"}, "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-e27c5343424bcebb", "name": "Legacy-named symbol `statusCodeToLegacy` in frontend/src/routes/index.tsx:18", "shortDescription": {"text": "Legacy-named symbol `statusCodeToLegacy` in frontend/src/routes/index.tsx:18"}, "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-edcd2c619b958a78", "name": "Legacy-named symbol `statusCodeToLegacy` in frontend/src/routes/projects.index.tsx:32", "shortDescription": {"text": "Legacy-named symbol `statusCodeToLegacy` in frontend/src/routes/projects.index.tsx:32"}, "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-476381ecfa48cb71", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/apiClient.ts:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/apiClient.ts:74"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a9a5ccdd7a7dd64e", "name": "Legacy-named symbol `pagina_text_old` in .claude/skills/apresentacao-poli/scripts/build_status_report_template.py:160", "shortDescription": {"text": "Legacy-named symbol `pagina_text_old` in .claude/skills/apresentacao-poli/scripts/build_status_report_template.py:160"}, "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-28bfd52a874c62b1", "name": "Network/subprocess call without timeout or try/except \u2014 .claude/skills/documento-poli/scripts/build_doc_pdf.py:47", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 .claude/skills/documento-poli/scripts/build_doc_pdf.py:47"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-926e3300c4f03521", "name": "Stub function `rollback` (body is just `pass`/`return`) \u2014 backend/v1/src/obione/unit_of_work.py:142", "shortDescription": {"text": "Stub function `rollback` (body is just `pass`/`return`) \u2014 backend/v1/src/obione/unit_of_work.py:142"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f7d9d48c09bbe672", "name": "Commented-code block (8 lines) in atividades/apresentacoes/build_sr1_pptx.py:876", "shortDescription": {"text": "Commented-code block (8 lines) in atividades/apresentacoes/build_sr1_pptx.py:876"}, "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-319e66a630e14977", "name": "2 env vars used in code but missing from .env.example", "shortDescription": {"text": "2 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `CI`, `DEV`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/v1/src/obione/unit_of_work.py:commit, backend/v1/src/obione/unit_of_work.py:commit, backend/v1/src/obione/unit_of_work.py:commit\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/v1/src/obione/synthesis/generator/port.py:synthesize, backend/v1/src/obione/extractions/llm/port.py:extract\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-3646433df3fd5805", "name": "Frontend route `/projects/:id` has no Link/navigate to it \u2014 frontend/v1/src/pages/ProjectDetailPage.test.tsx", "shortDescription": {"text": "Frontend route `/projects/:id` has no Link/navigate to it \u2014 frontend/v1/src/pages/ProjectDetailPage.test.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-08160b6799298065", "name": "Frontend route `/projects/:id/visibility` has no Link/navigate to it \u2014 frontend/v1/src/pages/ProjectVisibilityPage.test.", "shortDescription": {"text": "Frontend route `/projects/:id/visibility` has no Link/navigate to it \u2014 frontend/v1/src/pages/ProjectVisibilityPage.test.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-9b8b3a2eb3506b22", "name": "Frontend route `/restricted` has no Link/navigate to it \u2014 frontend/v1/src/components/require-role.test.tsx", "shortDescription": {"text": "Frontend route `/restricted` has no Link/navigate to it \u2014 frontend/v1/src/components/require-role.test.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-f5d5238f890130f0", "name": "FastAPI POST `create_project` without auth dependency \u2014 backend/v1/src/obione/projects/router.py:64", "shortDescription": {"text": "FastAPI POST `create_project` without auth dependency \u2014 backend/v1/src/obione/projects/router.py:64"}, "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-8282792634d6fd1d", "name": "FastAPI PATCH `update_project` without auth dependency \u2014 backend/v1/src/obione/projects/router.py:125", "shortDescription": {"text": "FastAPI PATCH `update_project` without auth dependency \u2014 backend/v1/src/obione/projects/router.py:125"}, "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-ba148893ec7bd2ac", "name": "FastAPI DELETE `delete_project` without auth dependency \u2014 backend/v1/src/obione/projects/router.py:133", "shortDescription": {"text": "FastAPI DELETE `delete_project` without auth dependency \u2014 backend/v1/src/obione/projects/router.py:133"}, "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-c7e0c7b902189527", "name": "FastAPI POST `add_client` without auth dependency \u2014 backend/v1/src/obione/projects/router.py:138", "shortDescription": {"text": "FastAPI POST `add_client` without auth dependency \u2014 backend/v1/src/obione/projects/router.py:138"}, "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-469a08ad5b6e6f18", "name": "FastAPI PUT `set_category` without auth dependency \u2014 backend/v1/src/obione/visibility/router.py:30", "shortDescription": {"text": "FastAPI PUT `set_category` without auth dependency \u2014 backend/v1/src/obione/visibility/router.py:30"}, "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-13cd377a2957eac0", "name": "FastAPI PUT `set_attribute` without auth dependency \u2014 backend/v1/src/obione/visibility/router.py:37", "shortDescription": {"text": "FastAPI PUT `set_attribute` without auth dependency \u2014 backend/v1/src/obione/visibility/router.py:37"}, "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-aa6835ce9d3810bd", "name": "FastAPI DELETE `delete_attribute_override` without auth dependency \u2014 backend/v1/src/obione/visibility/router.py:44", "shortDescription": {"text": "FastAPI DELETE `delete_attribute_override` without auth dependency \u2014 backend/v1/src/obione/visibility/router.py:44"}, "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-7363c3b2fe2e3826", "name": "FastAPI PUT `set_bulk` without auth dependency \u2014 backend/v1/src/obione/visibility/router.py:49", "shortDescription": {"text": "FastAPI PUT `set_bulk` without auth dependency \u2014 backend/v1/src/obione/visibility/router.py:49"}, "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-f132a3a5e41abbfd", "name": "FastAPI POST `submit_consultoria` without auth dependency \u2014 backend/v1/src/obione/likert/router.py:19", "shortDescription": {"text": "FastAPI POST `submit_consultoria` without auth dependency \u2014 backend/v1/src/obione/likert/router.py:19"}, "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-7f9ddd2eec7c5a2d", "name": "FastAPI POST `submit_client` without auth dependency \u2014 backend/v1/src/obione/likert/router.py:27", "shortDescription": {"text": "FastAPI POST `submit_client` without auth dependency \u2014 backend/v1/src/obione/likert/router.py:27"}, "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-87abf91ad8f3c4c7", "name": "FastAPI POST `create_extraction` without auth dependency \u2014 backend/v1/src/obione/extractions/router.py:31", "shortDescription": {"text": "FastAPI POST `create_extraction` without auth dependency \u2014 backend/v1/src/obione/extractions/router.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-d3f0a9e6279656f9", "name": "FastAPI POST `create_manual_extraction` without auth dependency \u2014 backend/v1/src/obione/extractions/router.py:100", "shortDescription": {"text": "FastAPI POST `create_manual_extraction` without auth dependency \u2014 backend/v1/src/obione/extractions/router.py:100"}, "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-801fd87da0263aad", "name": "Dangling fetch: GET /projects/${projectId}/observations (frontend/src/services/observationService.ts:55)", "shortDescription": {"text": "Dangling fetch: GET /projects/${projectId}/observations (frontend/src/services/observationService.ts:55)"}, "fullDescription": {"text": "`frontend/src/services/observationService.ts:55` calls `GET /projects/${projectId}/observations` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/projects/<p>/observations`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c05af63a0f68df15", "name": "Dangling fetch: GET /observations/${id} (frontend/src/services/observationService.ts:61)", "shortDescription": {"text": "Dangling fetch: GET /observations/${id} (frontend/src/services/observationService.ts:61)"}, "fullDescription": {"text": "`frontend/src/services/observationService.ts:61` calls `GET /observations/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/observations/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5773a36de3974504", "name": "Dangling fetch: POST /projects/${projectId}/observations (frontend/src/services/observationService.ts:72)", "shortDescription": {"text": "Dangling fetch: POST /projects/${projectId}/observations (frontend/src/services/observationService.ts:72)"}, "fullDescription": {"text": "`frontend/src/services/observationService.ts:72` calls `POST /projects/${projectId}/observations` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/projects/<p>/observations`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4394a8c06f551559", "name": "Dangling fetch: PUT /observations/${id} (frontend/src/services/observationService.ts:84)", "shortDescription": {"text": "Dangling fetch: PUT /observations/${id} (frontend/src/services/observationService.ts:84)"}, "fullDescription": {"text": "`frontend/src/services/observationService.ts:84` calls `PUT /observations/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/observations/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d544d5969a6e7188", "name": "Dangling fetch: PATCH /observations/${id}/analyze (frontend/src/services/observationService.ts:96)", "shortDescription": {"text": "Dangling fetch: PATCH /observations/${id}/analyze (frontend/src/services/observationService.ts:96)"}, "fullDescription": {"text": "`frontend/src/services/observationService.ts:96` calls `PATCH /observations/${id}/analyze` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/observations/<p>/analyze`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9a207e4116980243", "name": "Dangling fetch: GET /permissions (frontend/src/services/governanceService.ts:12)", "shortDescription": {"text": "Dangling fetch: GET /permissions (frontend/src/services/governanceService.ts:12)"}, "fullDescription": {"text": "`frontend/src/services/governanceService.ts:12` calls `GET /permissions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/permissions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c319484fd74177f2", "name": "Dangling fetch: GET /profile-permissions (frontend/src/services/governanceService.ts:17)", "shortDescription": {"text": "Dangling fetch: GET /profile-permissions (frontend/src/services/governanceService.ts:17)"}, "fullDescription": {"text": "`frontend/src/services/governanceService.ts:17` calls `GET /profile-permissions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/profile-permissions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-07bf02a7734e0a22", "name": "Dangling fetch: PUT /profile-permissions (frontend/src/services/governanceService.ts:26)", "shortDescription": {"text": "Dangling fetch: PUT /profile-permissions (frontend/src/services/governanceService.ts:26)"}, "fullDescription": {"text": "`frontend/src/services/governanceService.ts:26` calls `PUT /profile-permissions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/profile-permissions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dea3a9d142d61e45", "name": "Dangling fetch: GET /users/${id} (frontend/src/services/userService.ts:12)", "shortDescription": {"text": "Dangling fetch: GET /users/${id} (frontend/src/services/userService.ts:12)"}, "fullDescription": {"text": "`frontend/src/services/userService.ts:12` calls `GET /users/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/users/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-153ae95b0365606f", "name": "Dangling fetch: PUT /users/${id} (frontend/src/services/userService.ts:46)", "shortDescription": {"text": "Dangling fetch: PUT /users/${id} (frontend/src/services/userService.ts:46)"}, "fullDescription": {"text": "`frontend/src/services/userService.ts:46` calls `PUT /users/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/users/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-53b7c347b37216c4", "name": "Dangling fetch: GET /knowledge (frontend/src/services/knowledgeService.ts:95)", "shortDescription": {"text": "Dangling fetch: GET /knowledge (frontend/src/services/knowledgeService.ts:95)"}, "fullDescription": {"text": "`frontend/src/services/knowledgeService.ts:95` calls `GET /knowledge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/knowledge`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c9f409018352c2ee", "name": "Dangling fetch: GET /knowledge/${id} (frontend/src/services/knowledgeService.ts:101)", "shortDescription": {"text": "Dangling fetch: GET /knowledge/${id} (frontend/src/services/knowledgeService.ts:101)"}, "fullDescription": {"text": "`frontend/src/services/knowledgeService.ts:101` calls `GET /knowledge/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/knowledge/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d565d89bb113f719", "name": "Dangling fetch: GET /domains/${domainId}/knowledge (frontend/src/services/knowledgeService.ts:109)", "shortDescription": {"text": "Dangling fetch: GET /domains/${domainId}/knowledge (frontend/src/services/knowledgeService.ts:109)"}, "fullDescription": {"text": "`frontend/src/services/knowledgeService.ts:109` calls `GET /domains/${domainId}/knowledge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/domains/<p>/knowledge`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f328cf91ee3b5b4d", "name": "Dangling fetch: GET /projects/${projectId}/knowledge (frontend/src/services/knowledgeService.ts:114)", "shortDescription": {"text": "Dangling fetch: GET /projects/${projectId}/knowledge (frontend/src/services/knowledgeService.ts:114)"}, "fullDescription": {"text": "`frontend/src/services/knowledgeService.ts:114` calls `GET /projects/${projectId}/knowledge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/projects/<p>/knowledge`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d3f8fcc19bf2443d", "name": "Dangling fetch: GET /discussions/${discussionId}/knowledge (frontend/src/services/knowledgeService.ts:119)", "shortDescription": {"text": "Dangling fetch: GET /discussions/${discussionId}/knowledge (frontend/src/services/knowledgeService.ts:119)"}, "fullDescription": {"text": "`frontend/src/services/knowledgeService.ts:119` calls `GET /discussions/${discussionId}/knowledge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/discussions/<p>/knowledge`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6d8cd1311e1670ea", "name": "Dangling fetch: POST /knowledge (frontend/src/services/knowledgeService.ts:126)", "shortDescription": {"text": "Dangling fetch: POST /knowledge (frontend/src/services/knowledgeService.ts:126)"}, "fullDescription": {"text": "`frontend/src/services/knowledgeService.ts:126` calls `POST /knowledge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/knowledge`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-854f7cbf6c86463e", "name": "Dangling fetch: POST /discussions/${discussionId}/consolidate (frontend/src/services/knowledgeService.ts:137)", "shortDescription": {"text": "Dangling fetch: POST /discussions/${discussionId}/consolidate (frontend/src/services/knowledgeService.ts:137)"}, "fullDescription": {"text": "`frontend/src/services/knowledgeService.ts:137` calls `POST /discussions/${discussionId}/consolidate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/discussions/<p>/consolidate`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ad3ce0f2f4691c7a", "name": "Dangling fetch: GET /profiles (frontend/src/services/profileService.ts:7)", "shortDescription": {"text": "Dangling fetch: GET /profiles (frontend/src/services/profileService.ts:7)"}, "fullDescription": {"text": "`frontend/src/services/profileService.ts:7` calls `GET /profiles` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/profiles`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-93ec9ec590fdc623", "name": "Dangling fetch: GET /profiles/${code} (frontend/src/services/profileService.ts:13)", "shortDescription": {"text": "Dangling fetch: GET /profiles/${code} (frontend/src/services/profileService.ts:13)"}, "fullDescription": {"text": "`frontend/src/services/profileService.ts:13` calls `GET /profiles/${code}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/profiles/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-51e8c3be7d0a750f", "name": "Dangling fetch: GET /projects (frontend/src/services/projectService.ts:66)", "shortDescription": {"text": "Dangling fetch: GET /projects (frontend/src/services/projectService.ts:66)"}, "fullDescription": {"text": "`frontend/src/services/projectService.ts:66` calls `GET /projects` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/projects`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a844d7ef87865853", "name": "Dangling fetch: GET /projects/${id}/coverage (frontend/src/services/projectService.ts:88)", "shortDescription": {"text": "Dangling fetch: GET /projects/${id}/coverage (frontend/src/services/projectService.ts:88)"}, "fullDescription": {"text": "`frontend/src/services/projectService.ts:88` calls `GET /projects/${id}/coverage` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/projects/<p>/coverage`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d786b8cfdfedbbe4", "name": "Dangling fetch: GET /projects/${id} (frontend/src/services/projectService.ts:96)", "shortDescription": {"text": "Dangling fetch: GET /projects/${id} (frontend/src/services/projectService.ts:96)"}, "fullDescription": {"text": "`frontend/src/services/projectService.ts:96` calls `GET /projects/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/projects/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1bf362375c2d0599", "name": "Dangling fetch: GET /projects/domain/${domainId} (frontend/src/services/projectService.ts:104)", "shortDescription": {"text": "Dangling fetch: GET /projects/domain/${domainId} (frontend/src/services/projectService.ts:104)"}, "fullDescription": {"text": "`frontend/src/services/projectService.ts:104` calls `GET /projects/domain/${domainId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/projects/domain/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-07895f1a13653a23", "name": "Dangling fetch: POST /projects (frontend/src/services/projectService.ts:111)", "shortDescription": {"text": "Dangling fetch: POST /projects (frontend/src/services/projectService.ts:111)"}, "fullDescription": {"text": "`frontend/src/services/projectService.ts:111` calls `POST /projects` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/projects`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0d19cc569c89556e", "name": "Dangling fetch: PUT /projects/${id} (frontend/src/services/projectService.ts:120)", "shortDescription": {"text": "Dangling fetch: PUT /projects/${id} (frontend/src/services/projectService.ts:120)"}, "fullDescription": {"text": "`frontend/src/services/projectService.ts:120` calls `PUT /projects/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/projects/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1751f957fe3b9578", "name": "Dangling fetch: PATCH /projects/${id}/status (frontend/src/services/projectService.ts:135)", "shortDescription": {"text": "Dangling fetch: PATCH /projects/${id}/status (frontend/src/services/projectService.ts:135)"}, "fullDescription": {"text": "`frontend/src/services/projectService.ts:135` calls `PATCH /projects/${id}/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/projects/<p>/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5530253b0d2b0cc2", "name": "Dangling fetch: POST /projects/${id}/close-observation (frontend/src/services/projectService.ts:158)", "shortDescription": {"text": "Dangling fetch: POST /projects/${id}/close-observation (frontend/src/services/projectService.ts:158)"}, "fullDescription": {"text": "`frontend/src/services/projectService.ts:158` calls `POST /projects/${id}/close-observation` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/projects/<p>/close-observation`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-400620285ad8e840", "name": "Dangling fetch: GET /discussions (frontend/src/services/discussionService.ts:160)", "shortDescription": {"text": "Dangling fetch: GET /discussions (frontend/src/services/discussionService.ts:160)"}, "fullDescription": {"text": "`frontend/src/services/discussionService.ts:160` calls `GET /discussions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/discussions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ba7c428c7b6148e4", "name": "Dangling fetch: GET /discussions/${id} (frontend/src/services/discussionService.ts:166)", "shortDescription": {"text": "Dangling fetch: GET /discussions/${id} (frontend/src/services/discussionService.ts:166)"}, "fullDescription": {"text": "`frontend/src/services/discussionService.ts:166` calls `GET /discussions/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/discussions/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-669653f341928b39", "name": "Dangling fetch: GET /domains/${domainId}/discussions (frontend/src/services/discussionService.ts:174)", "shortDescription": {"text": "Dangling fetch: GET /domains/${domainId}/discussions (frontend/src/services/discussionService.ts:174)"}, "fullDescription": {"text": "`frontend/src/services/discussionService.ts:174` calls `GET /domains/${domainId}/discussions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/domains/<p>/discussions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0da2ef6b951e5b8c", "name": "Dangling fetch: GET /projects/${projectId}/discussions (frontend/src/services/discussionService.ts:179)", "shortDescription": {"text": "Dangling fetch: GET /projects/${projectId}/discussions (frontend/src/services/discussionService.ts:179)"}, "fullDescription": {"text": "`frontend/src/services/discussionService.ts:179` calls `GET /projects/${projectId}/discussions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/projects/<p>/discussions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-380e9635e3171735", "name": "Dangling fetch: POST /discussions (frontend/src/services/discussionService.ts:186)", "shortDescription": {"text": "Dangling fetch: POST /discussions (frontend/src/services/discussionService.ts:186)"}, "fullDescription": {"text": "`frontend/src/services/discussionService.ts:186` calls `POST /discussions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/discussions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-30ef37d18f84bc6e", "name": "Dangling fetch: POST /discussions/${discussionId}/contributions (frontend/src/services/discussionService.ts:198)", "shortDescription": {"text": "Dangling fetch: POST /discussions/${discussionId}/contributions (frontend/src/services/discussionService.ts:198)"}, "fullDescription": {"text": "`frontend/src/services/discussionService.ts:198` calls `POST /discussions/${discussionId}/contributions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/discussions/<p>/contributions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-829af54bd43094ab", "name": "Dangling fetch: POST /discussions/${id}/archive (frontend/src/services/discussionService.ts:228)", "shortDescription": {"text": "Dangling fetch: POST /discussions/${id}/archive (frontend/src/services/discussionService.ts:228)"}, "fullDescription": {"text": "`frontend/src/services/discussionService.ts:228` calls `POST /discussions/${id}/archive` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/discussions/<p>/archive`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1ceb6b1d8eb1ab49", "name": "Dangling fetch: POST /projects/${projectId}/ai/suggest-domain (frontend/src/services/aiService.ts:45)", "shortDescription": {"text": "Dangling fetch: POST /projects/${projectId}/ai/suggest-domain (frontend/src/services/aiService.ts:45)"}, "fullDescription": {"text": "`frontend/src/services/aiService.ts:45` calls `POST /projects/${projectId}/ai/suggest-domain` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/projects/<p>/ai/suggest-domain`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1ce73987c3197a7f", "name": "Dangling fetch: POST /projects/${projectId}/ai/suggest-observations (frontend/src/services/aiService.ts:50)", "shortDescription": {"text": "Dangling fetch: POST /projects/${projectId}/ai/suggest-observations (frontend/src/services/aiService.ts:50)"}, "fullDescription": {"text": "`frontend/src/services/aiService.ts:50` calls `POST /projects/${projectId}/ai/suggest-observations` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/projects/<p>/ai/suggest-observations`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d913c5642856e51a", "name": "Dangling fetch: POST /discussions/${discussionId}/ai/suggest-knowledge (frontend/src/services/aiService.ts:57)", "shortDescription": {"text": "Dangling fetch: POST /discussions/${discussionId}/ai/suggest-knowledge (frontend/src/services/aiService.ts:57)"}, "fullDescription": {"text": "`frontend/src/services/aiService.ts:57` calls `POST /discussions/${discussionId}/ai/suggest-knowledge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/discussions/<p>/ai/suggest-knowledge`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c964c35d8ba02f80", "name": "Dangling fetch: POST /domains/${domainId}/ai/synthesize (frontend/src/services/aiService.ts:64)", "shortDescription": {"text": "Dangling fetch: POST /domains/${domainId}/ai/synthesize (frontend/src/services/aiService.ts:64)"}, "fullDescription": {"text": "`frontend/src/services/aiService.ts:64` calls `POST /domains/${domainId}/ai/synthesize` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/domains/<p>/ai/synthesize`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1f2ff5270efa75cb", "name": "Dangling fetch: POST /ai/project-setup (frontend/src/services/aiService.ts:82)", "shortDescription": {"text": "Dangling fetch: POST /ai/project-setup (frontend/src/services/aiService.ts:82)"}, "fullDescription": {"text": "`frontend/src/services/aiService.ts:82` calls `POST /ai/project-setup` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/ai/project-setup`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c3db24ee2cc9ea7a", "name": "Dangling fetch: GET /ai/stats (frontend/src/services/aiService.ts:110)", "shortDescription": {"text": "Dangling fetch: GET /ai/stats (frontend/src/services/aiService.ts:110)"}, "fullDescription": {"text": "`frontend/src/services/aiService.ts:110` calls `GET /ai/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/ai/stats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9b3a08689286bc58", "name": "Dangling fetch: POST /auth/login (frontend/src/services/authService.ts:12)", "shortDescription": {"text": "Dangling fetch: POST /auth/login (frontend/src/services/authService.ts:12)"}, "fullDescription": {"text": "`frontend/src/services/authService.ts:12` calls `POST /auth/login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/login`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a2bd70783418da09", "name": "Dangling fetch: POST /auth/logout (frontend/src/services/authService.ts:33)", "shortDescription": {"text": "Dangling fetch: POST /auth/logout (frontend/src/services/authService.ts:33)"}, "fullDescription": {"text": "`frontend/src/services/authService.ts:33` calls `POST /auth/logout` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/logout`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a19cb5479749a51a", "name": "Dangling fetch: GET /auth/me (frontend/src/services/authService.ts:42)", "shortDescription": {"text": "Dangling fetch: GET /auth/me (frontend/src/services/authService.ts:42)"}, "fullDescription": {"text": "`frontend/src/services/authService.ts:42` calls `GET /auth/me` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f1ab2f89cbbf78a7", "name": "Dangling fetch: GET /phenomena (frontend/src/services/phenomenonService.ts:49)", "shortDescription": {"text": "Dangling fetch: GET /phenomena (frontend/src/services/phenomenonService.ts:49)"}, "fullDescription": {"text": "`frontend/src/services/phenomenonService.ts:49` calls `GET /phenomena` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/phenomena`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4a1ee9e8dfbeeb0f", "name": "Dangling fetch: GET /phenomena/${id} (frontend/src/services/phenomenonService.ts:55)", "shortDescription": {"text": "Dangling fetch: GET /phenomena/${id} (frontend/src/services/phenomenonService.ts:55)"}, "fullDescription": {"text": "`frontend/src/services/phenomenonService.ts:55` calls `GET /phenomena/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/phenomena/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-33ca834a69336eb4", "name": "Dangling fetch: GET /projects/${projectId}/phenomena (frontend/src/services/phenomenonService.ts:63)", "shortDescription": {"text": "Dangling fetch: GET /projects/${projectId}/phenomena (frontend/src/services/phenomenonService.ts:63)"}, "fullDescription": {"text": "`frontend/src/services/phenomenonService.ts:63` calls `GET /projects/${projectId}/phenomena` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/projects/<p>/phenomena`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-db43dadc1209c860", "name": "Dangling fetch: GET /domains/${domainId}/phenomena (frontend/src/services/phenomenonService.ts:68)", "shortDescription": {"text": "Dangling fetch: GET /domains/${domainId}/phenomena (frontend/src/services/phenomenonService.ts:68)"}, "fullDescription": {"text": "`frontend/src/services/phenomenonService.ts:68` calls `GET /domains/${domainId}/phenomena` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/domains/<p>/phenomena`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-efe16171c296306d", "name": "Dangling fetch: POST /phenomena (frontend/src/services/phenomenonService.ts:73)", "shortDescription": {"text": "Dangling fetch: POST /phenomena (frontend/src/services/phenomenonService.ts:73)"}, "fullDescription": {"text": "`frontend/src/services/phenomenonService.ts:73` calls `POST /phenomena` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/phenomena`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-942ef9ed1ec23c72", "name": "Dangling fetch: PUT /phenomena/${id} (frontend/src/services/phenomenonService.ts:85)", "shortDescription": {"text": "Dangling fetch: PUT /phenomena/${id} (frontend/src/services/phenomenonService.ts:85)"}, "fullDescription": {"text": "`frontend/src/services/phenomenonService.ts:85` calls `PUT /phenomena/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/phenomena/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c66ad4642a624ec8", "name": "Dangling fetch: GET /mpo/attributes (frontend/src/services/mpoAttributeService.ts:29)", "shortDescription": {"text": "Dangling fetch: GET /mpo/attributes (frontend/src/services/mpoAttributeService.ts:29)"}, "fullDescription": {"text": "`frontend/src/services/mpoAttributeService.ts:29` calls `GET /mpo/attributes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/mpo/attributes`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2429e3d211ced157", "name": "Dangling fetch: GET /mpo/categories (frontend/src/services/mpoAttributeService.ts:35)", "shortDescription": {"text": "Dangling fetch: GET /mpo/categories (frontend/src/services/mpoAttributeService.ts:35)"}, "fullDescription": {"text": "`frontend/src/services/mpoAttributeService.ts:35` calls `GET /mpo/categories` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/mpo/categories`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-98b9ff0bc9416873", "name": "Dangling fetch: GET /domains (frontend/src/services/domainService.ts:6)", "shortDescription": {"text": "Dangling fetch: GET /domains (frontend/src/services/domainService.ts:6)"}, "fullDescription": {"text": "`frontend/src/services/domainService.ts:6` calls `GET /domains` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/domains`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-65869e8763b73d9c", "name": "Dangling fetch: GET /domains/${id} (frontend/src/services/domainService.ts:12)", "shortDescription": {"text": "Dangling fetch: GET /domains/${id} (frontend/src/services/domainService.ts:12)"}, "fullDescription": {"text": "`frontend/src/services/domainService.ts:12` calls `GET /domains/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/domains/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4f3663e4b2cc7eaf", "name": "Dangling fetch: GET /domains/slug/${slug} (frontend/src/services/domainService.ts:21)", "shortDescription": {"text": "Dangling fetch: GET /domains/slug/${slug} (frontend/src/services/domainService.ts:21)"}, "fullDescription": {"text": "`frontend/src/services/domainService.ts:21` calls `GET /domains/slug/${slug}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/domains/slug/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b4d110c7fb706e7a", "name": "Dangling fetch: POST /domains (frontend/src/services/domainService.ts:29)", "shortDescription": {"text": "Dangling fetch: POST /domains (frontend/src/services/domainService.ts:29)"}, "fullDescription": {"text": "`frontend/src/services/domainService.ts:29` calls `POST /domains` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/domains`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-21e982c48a582a3b", "name": "Dangling fetch: PUT /domains/${id} (frontend/src/services/domainService.ts:68)", "shortDescription": {"text": "Dangling fetch: PUT /domains/${id} (frontend/src/services/domainService.ts:68)"}, "fullDescription": {"text": "`frontend/src/services/domainService.ts:68` calls `PUT /domains/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/domains/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fc0dd716a17d80ff", "name": "Dangling fetch: GET /community (frontend/src/services/communityService.ts:22)", "shortDescription": {"text": "Dangling fetch: GET /community (frontend/src/services/communityService.ts:22)"}, "fullDescription": {"text": "`frontend/src/services/communityService.ts:22` calls `GET /community` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/community`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c6a3a066349efe6f", "name": "Dangling fetch: GET /community/domains/slug/${slug} (frontend/src/services/communityService.ts:38)", "shortDescription": {"text": "Dangling fetch: GET /community/domains/slug/${slug} (frontend/src/services/communityService.ts:38)"}, "fullDescription": {"text": "`frontend/src/services/communityService.ts:38` calls `GET /community/domains/slug/${slug}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/community/domains/slug/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-64c731d9d627b46c", "name": "Dangling fetch: GET /community/domains/${domainId} (frontend/src/services/communityService.ts:60)", "shortDescription": {"text": "Dangling fetch: GET /community/domains/${domainId} (frontend/src/services/communityService.ts:60)"}, "fullDescription": {"text": "`frontend/src/services/communityService.ts:60` calls `GET /community/domains/${domainId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/community/domains/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`backend/v1/src/obione/main.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-970eb92d6ec2bfaa", "name": "Unused endpoint: POST /generate", "shortDescription": {"text": "Unused endpoint: POST /generate"}, "fullDescription": {"text": "`backend/v1/src/obione/synthesis/router.py` declares `POST /generate` 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-04a7ba60361cd075", "name": "Unused endpoint: GET /{synthesis_id}", "shortDescription": {"text": "Unused endpoint: GET /{synthesis_id}"}, "fullDescription": {"text": "`backend/v1/src/obione/synthesis/router.py` declares `GET /{synthesis_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-e0c19ca5aacf9c72", "name": "Unused endpoint: PATCH /{synthesis_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{synthesis_id}"}, "fullDescription": {"text": "`backend/v1/src/obione/synthesis/router.py` declares `PATCH /{synthesis_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-631dd507448fb06d", "name": "Unused endpoint: DELETE /{synthesis_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{synthesis_id}"}, "fullDescription": {"text": "`backend/v1/src/obione/synthesis/router.py` declares `DELETE /{synthesis_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-c9be1ce9b653b3c2", "name": "Unused endpoint: POST /{synthesis_id}/publish", "shortDescription": {"text": "Unused endpoint: POST /{synthesis_id}/publish"}, "fullDescription": {"text": "`backend/v1/src/obione/synthesis/router.py` declares `POST /{synthesis_id}/publish` 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/v1/src/obione/auth/router.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-fd1dc91abf32142d", "name": "Unused endpoint: GET /me", "shortDescription": {"text": "Unused endpoint: GET /me"}, "fullDescription": {"text": "`backend/v1/src/obione/auth/router.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-3f8670f2a29e2a18", "name": "Unused endpoint: GET /portfolio", "shortDescription": {"text": "Unused endpoint: GET /portfolio"}, "fullDescription": {"text": "`backend/v1/src/obione/projects/router.py` declares `GET /portfolio` 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/v1/src/obione/projects/router.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-106f3e7fc5f65e4f", "name": "Unused endpoint: GET /{project_id}", "shortDescription": {"text": "Unused endpoint: GET /{project_id}"}, "fullDescription": {"text": "`backend/v1/src/obione/projects/router.py` declares `GET /{project_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-a14db30d822db08d", "name": "Unused endpoint: GET /{project_id}/detail", "shortDescription": {"text": "Unused endpoint: GET /{project_id}/detail"}, "fullDescription": {"text": "`backend/v1/src/obione/projects/router.py` declares `GET /{project_id}/detail` 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-75726e5afbeebf0b", "name": "Unused endpoint: PATCH /{project_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{project_id}"}, "fullDescription": {"text": "`backend/v1/src/obione/projects/router.py` declares `PATCH /{project_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-b9174fa868399f10", "name": "Unused endpoint: DELETE /{project_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{project_id}"}, "fullDescription": {"text": "`backend/v1/src/obione/projects/router.py` declares `DELETE /{project_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-fbf417892d6f5832", "name": "Unused endpoint: POST /{project_id}/clients", "shortDescription": {"text": "Unused endpoint: POST /{project_id}/clients"}, "fullDescription": {"text": "`backend/v1/src/obione/projects/router.py` declares `POST /{project_id}/clients` 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-4cb73614b4fb642e", "name": "Unused endpoint: GET /db", "shortDescription": {"text": "Unused endpoint: GET /db"}, "fullDescription": {"text": "`backend/v1/src/obione/health/router.py` declares `GET /db` 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-27cc2bb73ad635b3", "name": "Unused endpoint: POST /suggest", "shortDescription": {"text": "Unused endpoint: POST /suggest"}, "fullDescription": {"text": "`backend/v1/src/obione/themes/router.py` declares `POST /suggest` 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-5293719d857b5a90", "name": "Unused endpoint: GET /suggestions", "shortDescription": {"text": "Unused endpoint: GET /suggestions"}, "fullDescription": {"text": "`backend/v1/src/obione/themes/router.py` declares `GET /suggestions` 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-bc1d09ed53a52a18", "name": "Unused endpoint: POST /suggestions/{suggestion_id}/accept", "shortDescription": {"text": "Unused endpoint: POST /suggestions/{suggestion_id}/accept"}, "fullDescription": {"text": "`backend/v1/src/obione/themes/router.py` declares `POST /suggestions/{suggestion_id}/accept` 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-a46dae1f3b7ca02c", "name": "Unused endpoint: GET /{draft_id}", "shortDescription": {"text": "Unused endpoint: GET /{draft_id}"}, "fullDescription": {"text": "`backend/v1/src/obione/drafts/router.py` declares `GET /{draft_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-ca4028d7dfab9150", "name": "Unused endpoint: PATCH /{draft_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{draft_id}"}, "fullDescription": {"text": "`backend/v1/src/obione/drafts/router.py` declares `PATCH /{draft_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-2307002220b0c610", "name": "Unused endpoint: DELETE /{draft_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{draft_id}"}, "fullDescription": {"text": "`backend/v1/src/obione/drafts/router.py` declares `DELETE /{draft_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-ff439cac602b7592", "name": "Unused endpoint: POST /{draft_id}/publish", "shortDescription": {"text": "Unused endpoint: POST /{draft_id}/publish"}, "fullDescription": {"text": "`backend/v1/src/obione/drafts/router.py` declares `POST /{draft_id}/publish` 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-952355067560af40", "name": "Unused endpoint: GET /cockpit", "shortDescription": {"text": "Unused endpoint: GET /cockpit"}, "fullDescription": {"text": "`backend/v1/src/obione/portfolio/router.py` declares `GET /cockpit` 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-d867635b02c2fa05", "name": "Unused endpoint: GET /cockpit/themes/{domain}", "shortDescription": {"text": "Unused endpoint: GET /cockpit/themes/{domain}"}, "fullDescription": {"text": "`backend/v1/src/obione/portfolio/router.py` declares `GET /cockpit/themes/{domain}` 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-85b644c90d989444", "name": "Unused endpoint: GET /coverage-matrix", "shortDescription": {"text": "Unused endpoint: GET /coverage-matrix"}, "fullDescription": {"text": "`backend/v1/src/obione/portfolio/router.py` declares `GET /coverage-matrix` 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-d8f7fcb06f19b788", "name": "Unused endpoint: PUT /categories/{category_key}", "shortDescription": {"text": "Unused endpoint: PUT /categories/{category_key}"}, "fullDescription": {"text": "`backend/v1/src/obione/visibility/router.py` declares `PUT /categories/{category_key}` 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-9f5188c921e956dc", "name": "Unused endpoint: PUT /attributes/{attribute_key}", "shortDescription": {"text": "Unused endpoint: PUT /attributes/{attribute_key}"}, "fullDescription": {"text": "`backend/v1/src/obione/visibility/router.py` declares `PUT /attributes/{attribute_key}` 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-40ae164f64f9dd4e", "name": "Unused endpoint: DELETE /attributes/{attribute_key}", "shortDescription": {"text": "Unused endpoint: DELETE /attributes/{attribute_key}"}, "fullDescription": {"text": "`backend/v1/src/obione/visibility/router.py` declares `DELETE /attributes/{attribute_key}` 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-67d28fa8cd6bb12f", "name": "Unused endpoint: PUT /", "shortDescription": {"text": "Unused endpoint: PUT /"}, "fullDescription": {"text": "`backend/v1/src/obione/visibility/router.py` declares `PUT /` 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-93e64087c77acacb", "name": "Unused endpoint: POST /consultoria", "shortDescription": {"text": "Unused endpoint: POST /consultoria"}, "fullDescription": {"text": "`backend/v1/src/obione/likert/router.py` declares `POST /consultoria` 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-c626c9f1365f67c6", "name": "Unused endpoint: POST /client", "shortDescription": {"text": "Unused endpoint: POST /client"}, "fullDescription": {"text": "`backend/v1/src/obione/likert/router.py` declares `POST /client` 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-8c6ae32b4b5f0d13", "name": "Unused endpoint: GET /responses", "shortDescription": {"text": "Unused endpoint: GET /responses"}, "fullDescription": {"text": "`backend/v1/src/obione/likert/router.py` declares `GET /responses` 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-e1b7bee247ffc801", "name": "Unused endpoint: GET /summary", "shortDescription": {"text": "Unused endpoint: GET /summary"}, "fullDescription": {"text": "`backend/v1/src/obione/likert/router.py` declares `GET /summary` 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-6fc0caa269292c44", "name": "Unused endpoint: GET /coverage", "shortDescription": {"text": "Unused endpoint: GET /coverage"}, "fullDescription": {"text": "`backend/v1/src/obione/extractions/router.py` declares `GET /coverage` 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-c7d5ac9949f6add1", "name": "Unused endpoint: GET /evaluation", "shortDescription": {"text": "Unused endpoint: GET /evaluation"}, "fullDescription": {"text": "`backend/v1/src/obione/extractions/router.py` declares `GET /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-af6608de4c7fbf85", "name": "Unused endpoint: POST /manual", "shortDescription": {"text": "Unused endpoint: POST /manual"}, "fullDescription": {"text": "`backend/v1/src/obione/extractions/router.py` declares `POST /manual` 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-40684cece77e9131", "name": "Unused endpoint: PATCH /{comment_id}", "shortDescription": {"text": "Unused endpoint: PATCH /{comment_id}"}, "fullDescription": {"text": "`backend/v1/src/obione/comments/router.py` declares `PATCH /{comment_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-f11060cc8edd5c0c", "name": "Unused endpoint: DELETE /{comment_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{comment_id}"}, "fullDescription": {"text": "`backend/v1/src/obione/comments/router.py` declares `DELETE /{comment_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/17828"}, "properties": {"repository": "raniel90/obione", "repoUrl": "https://github.com/raniel90/obione", "branch": "main"}, "results": [{"ruleId": "scanner-7a068705898845f8", "level": "note", "message": {"text": "Possibly dead Python function: reorder_slides"}, "properties": {"repobilityId": "73650e33cf3c0c19", "scanner": "scanner-primary", "fingerprint": "7a068705898845f8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/apresentacao-poli/scripts/pptx_helpers.py:127"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8f01f0bf7f38eec1", "level": "note", "message": {"text": "Possibly dead Python function: delete_shape_by_run_text"}, "properties": {"repobilityId": "73a498d2d3386e10", "scanner": "scanner-primary", "fingerprint": "8f01f0bf7f38eec1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/apresentacao-poli/scripts/pptx_helpers.py:161"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e818ad4e1289414f", "level": "note", "message": {"text": "Possibly dead Python function: highlight_runs"}, "properties": {"repobilityId": "1785d93194239f02", "scanner": "scanner-primary", "fingerprint": "e818ad4e1289414f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/apresentacao-poli/scripts/pptx_helpers.py:218"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a8a95a6c1e8cf087", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "a8a95a6c1e8cf087", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0012_drop_resumos_context.py:25"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-40370fe6358046fe", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "40370fe6358046fe", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0012_drop_resumos_context.py:30"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-708093a5ba37781c", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "708093a5ba37781c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0008_create_drafts.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-de8999eb0c0e5e6b", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "de8999eb0c0e5e6b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0008_create_drafts.py:84"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-37aae87ab50fba9a", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "37aae87ab50fba9a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0013_create_visibility_tables.py:25"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-741854aa448a800c", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "741854aa448a800c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0013_create_visibility_tables.py:80"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8ae9b4fc036c130e", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "8ae9b4fc036c130e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0006_create_likert_responses.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bf2ad7200d102b12", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "bf2ad7200d102b12", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0006_create_likert_responses.py:72"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-82eb3f027815621b", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "82eb3f027815621b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0010_extractions_add_source_description_hash.py:25"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9d2bf5b7dbd2d75e", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "9d2bf5b7dbd2d75e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0010_extractions_add_source_description_hash.py:32"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-99199bdc7363c413", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "99199bdc7363c413", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/6f8a539c0ec0_create_syntheses.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-60e7917a5d7993f1", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "60e7917a5d7993f1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/6f8a539c0ec0_create_syntheses.py:71"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-34b2bb60213a1268", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "34b2bb60213a1268", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0014_create_theme_suggestions.py:25"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a95ad61611e21686", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "a95ad61611e21686", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0014_create_theme_suggestions.py:68"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9999de276cfc2989", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "9999de276cfc2989", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0001_create_users.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b087050e30a6f88b", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "b087050e30a6f88b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0001_create_users.py:50"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-21eb27b1fc5a9a26", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "21eb27b1fc5a9a26", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0003_create_documents.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-98a6448656cc8486", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "98a6448656cc8486", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0003_create_documents.py:57"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a5ee5b918c2e6745", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "a5ee5b918c2e6745", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0002_create_projects.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-222c4cc8cb510471", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "222c4cc8cb510471", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0002_create_projects.py:81"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-56afa78547bf5c29", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "56afa78547bf5c29", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0009_project_description_required.py:24"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-29e365258ec52154", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "29e365258ec52154", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0009_project_description_required.py:39"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3d89ff9e6013e65e", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "3d89ff9e6013e65e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0011_drop_documents_context.py:26"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1049a7bb5c48550c", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "1049a7bb5c48550c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0011_drop_documents_context.py:36"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4c6613c0a85351ac", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "4c6613c0a85351ac", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0005_create_comments.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0eff8aec7a392d80", "level": "note", "message": {"text": "Possibly dead Python function: downgrade"}, "properties": {"repobilityId": "c03debbf11efa0c5", "scanner": "scanner-primary", "fingerprint": "0eff8aec7a392d80", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0005_create_comments.py:66"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-26ec818fb28af04a", "level": "note", "message": {"text": "Possibly dead Python function: upgrade"}, "properties": {"repobilityId": "cf0b8e5e6e2f8bc4", "scanner": "scanner-primary", "fingerprint": "26ec818fb28af04a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/alembic/versions/0007_create_resumos.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d5cab246671b73ee", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/v1/src/components/coverage-heatmap.tsx:62"}, "properties": {"repobilityId": "09bae498cd3b8293", "scanner": "scanner-primary", "fingerprint": "d5cab246671b73ee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e766025ba595eef1", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/v1/src/components/ui/chart.tsx:73"}, "properties": {"repobilityId": "98814fafdfa29a67", "scanner": "scanner-primary", "fingerprint": "e766025ba595eef1", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4bc0330946981869", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/feed-event-item.tsx:55"}, "properties": {"repobilityId": "bb98e4a97d8bc5bb", "scanner": "scanner-primary", "fingerprint": "4bc0330946981869", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dc6d455871f49078", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/project-card.tsx:27"}, "properties": {"repobilityId": "9c92274bdb2ecdbb", "scanner": "scanner-primary", "fingerprint": "dc6d455871f49078", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-957ab50d556faa4b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/ui/chart.tsx:73"}, "properties": {"repobilityId": "87d65db05fa624b0", "scanner": "scanner-primary", "fingerprint": "957ab50d556faa4b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-422ee5530678ebc6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/routes/domains.$id.tsx:271"}, "properties": {"repobilityId": "af5c441122a1321d", "scanner": "scanner-primary", "fingerprint": "422ee5530678ebc6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7765d85c41e8cb89", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/routes/register.tsx:412"}, "properties": {"repobilityId": "6bb6ead4daf9b2b5", "scanner": "scanner-primary", "fingerprint": "7765d85c41e8cb89", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-15703fc9dd44d488", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/routes/projects.index.tsx:108"}, "properties": {"repobilityId": "506bfe28e8cd6b7d", "scanner": "scanner-primary", "fingerprint": "15703fc9dd44d488", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-79b36836aaed6d78", "level": "warning", "message": {"text": "Dockerfile runs as root: frontend/v1/Dockerfile"}, "properties": {"repobilityId": "e74cacc1251899da", "scanner": "scanner-primary", "fingerprint": "79b36836aaed6d78", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-a17a360aeeb4831e", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "d967cd8fbd16ed3e", "scanner": "scanner-primary", "fingerprint": "a17a360aeeb4831e", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/v1/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-81934d9685193efa", "level": "warning", "message": {"text": "Dockerfile runs as root: backend/v1/Dockerfile"}, "properties": {"repobilityId": "eb0691507fe7d9f6", "scanner": "scanner-primary", "fingerprint": "81934d9685193efa", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-df2530d7d9c7d416", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "properties": {"repobilityId": "bbdb6357b651b304", "scanner": "scanner-primary", "fingerprint": "df2530d7d9c7d416", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/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-9b267739450460e8", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/v1/src/components/ui/chart.tsx:73"}, "properties": {"repobilityId": "40ce8d2acd022bc2", "scanner": "scanner-primary", "fingerprint": "9b267739450460e8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/v1/src/components/ui/chart.tsx"}, "region": {"startLine": 73}}}]}, {"ruleId": "scanner-7bd6c7d9d93c4875", "level": "error", "message": {"text": "Possible secret in frontend/v1/src/pages/LoginPage.tsx"}, "properties": {"repobilityId": "4e7b1618d84f7c4f", "scanner": "scanner-primary", "fingerprint": "7bd6c7d9d93c4875", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/v1/src/pages/LoginPage.tsx"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-df167bff2a7fdacb", "level": "error", "message": {"text": "Possible secret in frontend/v1/e2e/helpers.ts"}, "properties": {"repobilityId": "d0e258082b04b895", "scanner": "scanner-primary", "fingerprint": "df167bff2a7fdacb", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/v1/e2e/helpers.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-7d1e47f7fafdc7a3", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/v1/e2e/login.spec.ts:36"}, "properties": {"repobilityId": "9560000572423dda", "scanner": "scanner-primary", "fingerprint": "7d1e47f7fafdc7a3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/v1/e2e/login.spec.ts"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-2cbfd0b402a69372", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/ui/chart.tsx:73"}, "properties": {"repobilityId": "68d1eb3e4f8f564d", "scanner": "scanner-primary", "fingerprint": "2cbfd0b402a69372", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/ui/chart.tsx"}, "region": {"startLine": 73}}}]}, {"ruleId": "scanner-26a303c8babc6a1e", "level": "error", "message": {"text": "Possible secret in backend/v1/src/obione/cli/seed_demo.py"}, "properties": {"repobilityId": "7076020f0e26ccc8", "scanner": "scanner-primary", "fingerprint": "26a303c8babc6a1e", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/src/obione/cli/seed_demo.py"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-f7c34b3506afc4a2", "level": "note", "message": {"text": "Very large file: frontend/src/routes/projects.$id.tsx (1929 lines)"}, "properties": {"repobilityId": "19d76565576d147b", "scanner": "scanner-primary", "fingerprint": "f7c34b3506afc4a2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "e3fed3cea3649226", "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": "611d015a29b4cfbd", "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": "0720bbc32f31d1f3", "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": "9401bd8f2869ded5", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "41402731fe6dd0aa", "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": "20d3b9bdd222737f", "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": "c6e008ac024e9c34", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cedadc5432427311", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/apresentacao-poli/SKILL.md"}, "properties": {"repobilityId": "9d9e7a0e31883871", "scanner": "scanner-primary", "fingerprint": "cedadc5432427311", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/apresentacao-poli/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ce6c7c8e9bfb31f2", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/apresentacao-poli/references/anti-patterns.md"}, "properties": {"repobilityId": "2e1cfc1b4b35a51d", "scanner": "scanner-primary", "fingerprint": "ce6c7c8e9bfb31f2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/apresentacao-poli/references/anti-patterns.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-834e6577f45b8ae2", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/documento-poli/SKILL.md"}, "properties": {"repobilityId": "926045db8bd7a886", "scanner": "scanner-primary", "fingerprint": "834e6577f45b8ae2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/documento-poli/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4583b9282c1f6823", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/vite.config.ts:1"}, "properties": {"repobilityId": "6800d7887bf819af", "scanner": "scanner-primary", "fingerprint": "4583b9282c1f6823", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2f707c6d5a75ef54", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend/v1/src/test/setup.ts:22"}, "properties": {"repobilityId": "1ba397a3b85c98a9", "scanner": "scanner-primary", "fingerprint": "2f707c6d5a75ef54", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-53c7cba6a89f9bcc", "level": "note", "message": {"text": "Legacy-named symbol `statusCodeToLegacy` in frontend/src/routes/projects.$id.tsx:136"}, "properties": {"repobilityId": "5dd5e4009b6bbe64", "scanner": "scanner-primary", "fingerprint": "53c7cba6a89f9bcc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-76947a9eb58a4b65", "level": "note", "message": {"text": "Legacy-named symbol `statusCodeToLegacy` in frontend/src/routes/domains.$id.tsx:54"}, "properties": {"repobilityId": "49d68bea5df51033", "scanner": "scanner-primary", "fingerprint": "76947a9eb58a4b65", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e27c5343424bcebb", "level": "note", "message": {"text": "Legacy-named symbol `statusCodeToLegacy` in frontend/src/routes/index.tsx:18"}, "properties": {"repobilityId": "4263106242245f1c", "scanner": "scanner-primary", "fingerprint": "e27c5343424bcebb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-edcd2c619b958a78", "level": "note", "message": {"text": "Legacy-named symbol `statusCodeToLegacy` in frontend/src/routes/projects.index.tsx:32"}, "properties": {"repobilityId": "61496bc62999df95", "scanner": "scanner-primary", "fingerprint": "edcd2c619b958a78", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-476381ecfa48cb71", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/services/apiClient.ts:74"}, "properties": {"repobilityId": "93ef5d4bd7f69e89", "scanner": "scanner-primary", "fingerprint": "476381ecfa48cb71", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a9a5ccdd7a7dd64e", "level": "note", "message": {"text": "Legacy-named symbol `pagina_text_old` in .claude/skills/apresentacao-poli/scripts/build_status_report_template.py:160"}, "properties": {"repobilityId": "e79d6808a3010782", "scanner": "scanner-primary", "fingerprint": "a9a5ccdd7a7dd64e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-28bfd52a874c62b1", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 .claude/skills/documento-poli/scripts/build_doc_pdf.py:47"}, "properties": {"repobilityId": "9a9e139aee60d9a7", "scanner": "scanner-primary", "fingerprint": "28bfd52a874c62b1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-926e3300c4f03521", "level": "note", "message": {"text": "Stub function `rollback` (body is just `pass`/`return`) \u2014 backend/v1/src/obione/unit_of_work.py:142"}, "properties": {"repobilityId": "911adb08196fe738", "scanner": "scanner-primary", "fingerprint": "926e3300c4f03521", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-f7d9d48c09bbe672", "level": "none", "message": {"text": "Commented-code block (8 lines) in atividades/apresentacoes/build_sr1_pptx.py:876"}, "properties": {"repobilityId": "e066b6a2dd1c7e78", "scanner": "scanner-primary", "fingerprint": "f7d9d48c09bbe672", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-319e66a630e14977", "level": "none", "message": {"text": "2 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d838d1fc5d8231c9", "scanner": "scanner-primary", "fingerprint": "319e66a630e14977", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "e26d0dd9b65f4296", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "34bb596e998789b3", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "0f76a7f23d5626db", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "a15d6ef72974ae25", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "1699bed1ce2eb533", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "00de3087103ebbd6", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "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": "128f408ac7e99b64", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "63bfe06723c0e9e8", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "ba2815200ed9e39e", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "5124d0323970273c", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "5d70f8baf65a76fb", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "57ce8d47020770d7", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "130e9d027b4d4e6e", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "d7aaa21d3690cedf", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "6c9b6e9a068dafaa", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "c21a14720309ac75", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "a3a562b390c0b0d9", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "ade92d4cf7b1d990", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "7697d43763beb275", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "4480a80666cc2a42", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-3646433df3fd5805", "level": "warning", "message": {"text": "Frontend route `/projects/:id` has no Link/navigate to it \u2014 frontend/v1/src/pages/ProjectDetailPage.test.tsx"}, "properties": {"repobilityId": "a3e598efff275602", "scanner": "scanner-primary", "fingerprint": "3646433df3fd5805", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-08160b6799298065", "level": "warning", "message": {"text": "Frontend route `/projects/:id/visibility` has no Link/navigate to it \u2014 frontend/v1/src/pages/ProjectVisibilityPage.test.tsx"}, "properties": {"repobilityId": "e9c1a89e6b7faaec", "scanner": "scanner-primary", "fingerprint": "08160b6799298065", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9b8b3a2eb3506b22", "level": "warning", "message": {"text": "Frontend route `/restricted` has no Link/navigate to it \u2014 frontend/v1/src/components/require-role.test.tsx"}, "properties": {"repobilityId": "9207c07936c723d0", "scanner": "scanner-primary", "fingerprint": "9b8b3a2eb3506b22", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f5d5238f890130f0", "level": "error", "message": {"text": "FastAPI POST `create_project` without auth dependency \u2014 backend/v1/src/obione/projects/router.py:64"}, "properties": {"repobilityId": "ec1fb7ba477bc690", "scanner": "scanner-primary", "fingerprint": "f5d5238f890130f0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/src/obione/projects/router.py"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-8282792634d6fd1d", "level": "error", "message": {"text": "FastAPI PATCH `update_project` without auth dependency \u2014 backend/v1/src/obione/projects/router.py:125"}, "properties": {"repobilityId": "f832e7b911830fb7", "scanner": "scanner-primary", "fingerprint": "8282792634d6fd1d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/src/obione/projects/router.py"}, "region": {"startLine": 125}}}]}, {"ruleId": "scanner-ba148893ec7bd2ac", "level": "error", "message": {"text": "FastAPI DELETE `delete_project` without auth dependency \u2014 backend/v1/src/obione/projects/router.py:133"}, "properties": {"repobilityId": "854c99b32dfa3cfd", "scanner": "scanner-primary", "fingerprint": "ba148893ec7bd2ac", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/src/obione/projects/router.py"}, "region": {"startLine": 133}}}]}, {"ruleId": "scanner-c7e0c7b902189527", "level": "error", "message": {"text": "FastAPI POST `add_client` without auth dependency \u2014 backend/v1/src/obione/projects/router.py:138"}, "properties": {"repobilityId": "8b1ef42dc415e8ef", "scanner": "scanner-primary", "fingerprint": "c7e0c7b902189527", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/src/obione/projects/router.py"}, "region": {"startLine": 138}}}]}, {"ruleId": "scanner-469a08ad5b6e6f18", "level": "error", "message": {"text": "FastAPI PUT `set_category` without auth dependency \u2014 backend/v1/src/obione/visibility/router.py:30"}, "properties": {"repobilityId": "b584bb26d045c683", "scanner": "scanner-primary", "fingerprint": "469a08ad5b6e6f18", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/src/obione/visibility/router.py"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-13cd377a2957eac0", "level": "error", "message": {"text": "FastAPI PUT `set_attribute` without auth dependency \u2014 backend/v1/src/obione/visibility/router.py:37"}, "properties": {"repobilityId": "70209066143cfccc", "scanner": "scanner-primary", "fingerprint": "13cd377a2957eac0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/src/obione/visibility/router.py"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-aa6835ce9d3810bd", "level": "error", "message": {"text": "FastAPI DELETE `delete_attribute_override` without auth dependency \u2014 backend/v1/src/obione/visibility/router.py:44"}, "properties": {"repobilityId": "ed3b343d7890da2e", "scanner": "scanner-primary", "fingerprint": "aa6835ce9d3810bd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/src/obione/visibility/router.py"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-7363c3b2fe2e3826", "level": "error", "message": {"text": "FastAPI PUT `set_bulk` without auth dependency \u2014 backend/v1/src/obione/visibility/router.py:49"}, "properties": {"repobilityId": "13d87fbfe5b813b7", "scanner": "scanner-primary", "fingerprint": "7363c3b2fe2e3826", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/src/obione/visibility/router.py"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-f132a3a5e41abbfd", "level": "error", "message": {"text": "FastAPI POST `submit_consultoria` without auth dependency \u2014 backend/v1/src/obione/likert/router.py:19"}, "properties": {"repobilityId": "c90299513c2a8e03", "scanner": "scanner-primary", "fingerprint": "f132a3a5e41abbfd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/src/obione/likert/router.py"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-7f9ddd2eec7c5a2d", "level": "error", "message": {"text": "FastAPI POST `submit_client` without auth dependency \u2014 backend/v1/src/obione/likert/router.py:27"}, "properties": {"repobilityId": "f60051ffdb8fdcb7", "scanner": "scanner-primary", "fingerprint": "7f9ddd2eec7c5a2d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/src/obione/likert/router.py"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-87abf91ad8f3c4c7", "level": "error", "message": {"text": "FastAPI POST `create_extraction` without auth dependency \u2014 backend/v1/src/obione/extractions/router.py:31"}, "properties": {"repobilityId": "7d57e88cf94ffddd", "scanner": "scanner-primary", "fingerprint": "87abf91ad8f3c4c7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/src/obione/extractions/router.py"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-d3f0a9e6279656f9", "level": "error", "message": {"text": "FastAPI POST `create_manual_extraction` without auth dependency \u2014 backend/v1/src/obione/extractions/router.py:100"}, "properties": {"repobilityId": "7ea924c643390d10", "scanner": "scanner-primary", "fingerprint": "d3f0a9e6279656f9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/v1/src/obione/extractions/router.py"}, "region": {"startLine": 100}}}]}, {"ruleId": "scanner-801fd87da0263aad", "level": "error", "message": {"text": "Dangling fetch: GET /projects/${projectId}/observations (frontend/src/services/observationService.ts:55)"}, "properties": {"repobilityId": "849dd04b5adcad80", "scanner": "scanner-primary", "fingerprint": "801fd87da0263aad", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c05af63a0f68df15", "level": "error", "message": {"text": "Dangling fetch: GET /observations/${id} (frontend/src/services/observationService.ts:61)"}, "properties": {"repobilityId": "a44a732de72be9b3", "scanner": "scanner-primary", "fingerprint": "c05af63a0f68df15", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-5773a36de3974504", "level": "error", "message": {"text": "Dangling fetch: POST /projects/${projectId}/observations (frontend/src/services/observationService.ts:72)"}, "properties": {"repobilityId": "9ede24336e553318", "scanner": "scanner-primary", "fingerprint": "5773a36de3974504", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-4394a8c06f551559", "level": "error", "message": {"text": "Dangling fetch: PUT /observations/${id} (frontend/src/services/observationService.ts:84)"}, "properties": {"repobilityId": "11b60952400a2c2b", "scanner": "scanner-primary", "fingerprint": "4394a8c06f551559", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-d544d5969a6e7188", "level": "error", "message": {"text": "Dangling fetch: PATCH /observations/${id}/analyze (frontend/src/services/observationService.ts:96)"}, "properties": {"repobilityId": "e59d06badfe717f3", "scanner": "scanner-primary", "fingerprint": "d544d5969a6e7188", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-9a207e4116980243", "level": "error", "message": {"text": "Dangling fetch: GET /permissions (frontend/src/services/governanceService.ts:12)"}, "properties": {"repobilityId": "1b36768c93ef2b7f", "scanner": "scanner-primary", "fingerprint": "9a207e4116980243", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c319484fd74177f2", "level": "error", "message": {"text": "Dangling fetch: GET /profile-permissions (frontend/src/services/governanceService.ts:17)"}, "properties": {"repobilityId": "f25d32ac7f02eee9", "scanner": "scanner-primary", "fingerprint": "c319484fd74177f2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-07bf02a7734e0a22", "level": "error", "message": {"text": "Dangling fetch: PUT /profile-permissions (frontend/src/services/governanceService.ts:26)"}, "properties": {"repobilityId": "c769290916d3e522", "scanner": "scanner-primary", "fingerprint": "07bf02a7734e0a22", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-dea3a9d142d61e45", "level": "error", "message": {"text": "Dangling fetch: GET /users/${id} (frontend/src/services/userService.ts:12)"}, "properties": {"repobilityId": "010146fa53aa96fd", "scanner": "scanner-primary", "fingerprint": "dea3a9d142d61e45", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-153ae95b0365606f", "level": "error", "message": {"text": "Dangling fetch: PUT /users/${id} (frontend/src/services/userService.ts:46)"}, "properties": {"repobilityId": "4439aa078c0600b6", "scanner": "scanner-primary", "fingerprint": "153ae95b0365606f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-53b7c347b37216c4", "level": "error", "message": {"text": "Dangling fetch: GET /knowledge (frontend/src/services/knowledgeService.ts:95)"}, "properties": {"repobilityId": "f6477c9fc37962a5", "scanner": "scanner-primary", "fingerprint": "53b7c347b37216c4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c9f409018352c2ee", "level": "error", "message": {"text": "Dangling fetch: GET /knowledge/${id} (frontend/src/services/knowledgeService.ts:101)"}, "properties": {"repobilityId": "195af117c5b8a086", "scanner": "scanner-primary", "fingerprint": "c9f409018352c2ee", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-d565d89bb113f719", "level": "error", "message": {"text": "Dangling fetch: GET /domains/${domainId}/knowledge (frontend/src/services/knowledgeService.ts:109)"}, "properties": {"repobilityId": "c5ad518883b4dd35", "scanner": "scanner-primary", "fingerprint": "d565d89bb113f719", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-f328cf91ee3b5b4d", "level": "error", "message": {"text": "Dangling fetch: GET /projects/${projectId}/knowledge (frontend/src/services/knowledgeService.ts:114)"}, "properties": {"repobilityId": "abf39f677b61ea71", "scanner": "scanner-primary", "fingerprint": "f328cf91ee3b5b4d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-d3f8fcc19bf2443d", "level": "error", "message": {"text": "Dangling fetch: GET /discussions/${discussionId}/knowledge (frontend/src/services/knowledgeService.ts:119)"}, "properties": {"repobilityId": "a6ec7ad981e0d701", "scanner": "scanner-primary", "fingerprint": "d3f8fcc19bf2443d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-6d8cd1311e1670ea", "level": "error", "message": {"text": "Dangling fetch: POST /knowledge (frontend/src/services/knowledgeService.ts:126)"}, "properties": {"repobilityId": "9977d589a7211ebe", "scanner": "scanner-primary", "fingerprint": "6d8cd1311e1670ea", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-854f7cbf6c86463e", "level": "error", "message": {"text": "Dangling fetch: POST /discussions/${discussionId}/consolidate (frontend/src/services/knowledgeService.ts:137)"}, "properties": {"repobilityId": "83d5c142f2813c5a", "scanner": "scanner-primary", "fingerprint": "854f7cbf6c86463e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-ad3ce0f2f4691c7a", "level": "error", "message": {"text": "Dangling fetch: GET /profiles (frontend/src/services/profileService.ts:7)"}, "properties": {"repobilityId": "5d4005ea3c0915dc", "scanner": "scanner-primary", "fingerprint": "ad3ce0f2f4691c7a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-93ec9ec590fdc623", "level": "error", "message": {"text": "Dangling fetch: GET /profiles/${code} (frontend/src/services/profileService.ts:13)"}, "properties": {"repobilityId": "df946cbe9e42d1aa", "scanner": "scanner-primary", "fingerprint": "93ec9ec590fdc623", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-51e8c3be7d0a750f", "level": "error", "message": {"text": "Dangling fetch: GET /projects (frontend/src/services/projectService.ts:66)"}, "properties": {"repobilityId": "ab4f951e190600a2", "scanner": "scanner-primary", "fingerprint": "51e8c3be7d0a750f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-a844d7ef87865853", "level": "error", "message": {"text": "Dangling fetch: GET /projects/${id}/coverage (frontend/src/services/projectService.ts:88)"}, "properties": {"repobilityId": "c44f289f1b362e02", "scanner": "scanner-primary", "fingerprint": "a844d7ef87865853", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-d786b8cfdfedbbe4", "level": "error", "message": {"text": "Dangling fetch: GET /projects/${id} (frontend/src/services/projectService.ts:96)"}, "properties": {"repobilityId": "64442b4b61f8e28c", "scanner": "scanner-primary", "fingerprint": "d786b8cfdfedbbe4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-1bf362375c2d0599", "level": "error", "message": {"text": "Dangling fetch: GET /projects/domain/${domainId} (frontend/src/services/projectService.ts:104)"}, "properties": {"repobilityId": "0cf8d0fef71c66dd", "scanner": "scanner-primary", "fingerprint": "1bf362375c2d0599", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-07895f1a13653a23", "level": "error", "message": {"text": "Dangling fetch: POST /projects (frontend/src/services/projectService.ts:111)"}, "properties": {"repobilityId": "6d06a0ce07cd7bfe", "scanner": "scanner-primary", "fingerprint": "07895f1a13653a23", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-0d19cc569c89556e", "level": "error", "message": {"text": "Dangling fetch: PUT /projects/${id} (frontend/src/services/projectService.ts:120)"}, "properties": {"repobilityId": "a7ca4c9df9ca24e3", "scanner": "scanner-primary", "fingerprint": "0d19cc569c89556e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-1751f957fe3b9578", "level": "error", "message": {"text": "Dangling fetch: PATCH /projects/${id}/status (frontend/src/services/projectService.ts:135)"}, "properties": {"repobilityId": "3d6354ce865312c1", "scanner": "scanner-primary", "fingerprint": "1751f957fe3b9578", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-5530253b0d2b0cc2", "level": "error", "message": {"text": "Dangling fetch: POST /projects/${id}/close-observation (frontend/src/services/projectService.ts:158)"}, "properties": {"repobilityId": "92cc8071f02ac8c3", "scanner": "scanner-primary", "fingerprint": "5530253b0d2b0cc2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-400620285ad8e840", "level": "error", "message": {"text": "Dangling fetch: GET /discussions (frontend/src/services/discussionService.ts:160)"}, "properties": {"repobilityId": "bc9dbce935b90379", "scanner": "scanner-primary", "fingerprint": "400620285ad8e840", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-ba7c428c7b6148e4", "level": "error", "message": {"text": "Dangling fetch: GET /discussions/${id} (frontend/src/services/discussionService.ts:166)"}, "properties": {"repobilityId": "3c6cf8667a1d5d5e", "scanner": "scanner-primary", "fingerprint": "ba7c428c7b6148e4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-669653f341928b39", "level": "error", "message": {"text": "Dangling fetch: GET /domains/${domainId}/discussions (frontend/src/services/discussionService.ts:174)"}, "properties": {"repobilityId": "c3a13e2e07b6e280", "scanner": "scanner-primary", "fingerprint": "669653f341928b39", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-0da2ef6b951e5b8c", "level": "error", "message": {"text": "Dangling fetch: GET /projects/${projectId}/discussions (frontend/src/services/discussionService.ts:179)"}, "properties": {"repobilityId": "18915a07dfdc3800", "scanner": "scanner-primary", "fingerprint": "0da2ef6b951e5b8c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-380e9635e3171735", "level": "error", "message": {"text": "Dangling fetch: POST /discussions (frontend/src/services/discussionService.ts:186)"}, "properties": {"repobilityId": "d0809f69664986ce", "scanner": "scanner-primary", "fingerprint": "380e9635e3171735", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-30ef37d18f84bc6e", "level": "error", "message": {"text": "Dangling fetch: POST /discussions/${discussionId}/contributions (frontend/src/services/discussionService.ts:198)"}, "properties": {"repobilityId": "9c95e9a7c05add63", "scanner": "scanner-primary", "fingerprint": "30ef37d18f84bc6e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-829af54bd43094ab", "level": "error", "message": {"text": "Dangling fetch: POST /discussions/${id}/archive (frontend/src/services/discussionService.ts:228)"}, "properties": {"repobilityId": "06b11cbea94ea284", "scanner": "scanner-primary", "fingerprint": "829af54bd43094ab", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-1ceb6b1d8eb1ab49", "level": "error", "message": {"text": "Dangling fetch: POST /projects/${projectId}/ai/suggest-domain (frontend/src/services/aiService.ts:45)"}, "properties": {"repobilityId": "0c07e32ede440230", "scanner": "scanner-primary", "fingerprint": "1ceb6b1d8eb1ab49", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-1ce73987c3197a7f", "level": "error", "message": {"text": "Dangling fetch: POST /projects/${projectId}/ai/suggest-observations (frontend/src/services/aiService.ts:50)"}, "properties": {"repobilityId": "7fa2720f2c1b6d7d", "scanner": "scanner-primary", "fingerprint": "1ce73987c3197a7f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-d913c5642856e51a", "level": "error", "message": {"text": "Dangling fetch: POST /discussions/${discussionId}/ai/suggest-knowledge (frontend/src/services/aiService.ts:57)"}, "properties": {"repobilityId": "fbbe591a93817258", "scanner": "scanner-primary", "fingerprint": "d913c5642856e51a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c964c35d8ba02f80", "level": "error", "message": {"text": "Dangling fetch: POST /domains/${domainId}/ai/synthesize (frontend/src/services/aiService.ts:64)"}, "properties": {"repobilityId": "07e117f860ae2e9f", "scanner": "scanner-primary", "fingerprint": "c964c35d8ba02f80", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-1f2ff5270efa75cb", "level": "error", "message": {"text": "Dangling fetch: POST /ai/project-setup (frontend/src/services/aiService.ts:82)"}, "properties": {"repobilityId": "9e3c58abd7b89389", "scanner": "scanner-primary", "fingerprint": "1f2ff5270efa75cb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c3db24ee2cc9ea7a", "level": "error", "message": {"text": "Dangling fetch: GET /ai/stats (frontend/src/services/aiService.ts:110)"}, "properties": {"repobilityId": "86806d76e5015d6b", "scanner": "scanner-primary", "fingerprint": "c3db24ee2cc9ea7a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-9b3a08689286bc58", "level": "error", "message": {"text": "Dangling fetch: POST /auth/login (frontend/src/services/authService.ts:12)"}, "properties": {"repobilityId": "ec8caea98f0220f5", "scanner": "scanner-primary", "fingerprint": "9b3a08689286bc58", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-a2bd70783418da09", "level": "error", "message": {"text": "Dangling fetch: POST /auth/logout (frontend/src/services/authService.ts:33)"}, "properties": {"repobilityId": "d4f4a85de0771654", "scanner": "scanner-primary", "fingerprint": "a2bd70783418da09", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-a19cb5479749a51a", "level": "error", "message": {"text": "Dangling fetch: GET /auth/me (frontend/src/services/authService.ts:42)"}, "properties": {"repobilityId": "5a27d2e38ec4757d", "scanner": "scanner-primary", "fingerprint": "a19cb5479749a51a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-f1ab2f89cbbf78a7", "level": "error", "message": {"text": "Dangling fetch: GET /phenomena (frontend/src/services/phenomenonService.ts:49)"}, "properties": {"repobilityId": "978f8db2e1593057", "scanner": "scanner-primary", "fingerprint": "f1ab2f89cbbf78a7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-4a1ee9e8dfbeeb0f", "level": "error", "message": {"text": "Dangling fetch: GET /phenomena/${id} (frontend/src/services/phenomenonService.ts:55)"}, "properties": {"repobilityId": "e3b0f86103d04717", "scanner": "scanner-primary", "fingerprint": "4a1ee9e8dfbeeb0f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-33ca834a69336eb4", "level": "error", "message": {"text": "Dangling fetch: GET /projects/${projectId}/phenomena (frontend/src/services/phenomenonService.ts:63)"}, "properties": {"repobilityId": "9832fd18e1532222", "scanner": "scanner-primary", "fingerprint": "33ca834a69336eb4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-db43dadc1209c860", "level": "error", "message": {"text": "Dangling fetch: GET /domains/${domainId}/phenomena (frontend/src/services/phenomenonService.ts:68)"}, "properties": {"repobilityId": "dac30a830b4d6127", "scanner": "scanner-primary", "fingerprint": "db43dadc1209c860", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-efe16171c296306d", "level": "error", "message": {"text": "Dangling fetch: POST /phenomena (frontend/src/services/phenomenonService.ts:73)"}, "properties": {"repobilityId": "8e70bc531d2c3eee", "scanner": "scanner-primary", "fingerprint": "efe16171c296306d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-942ef9ed1ec23c72", "level": "error", "message": {"text": "Dangling fetch: PUT /phenomena/${id} (frontend/src/services/phenomenonService.ts:85)"}, "properties": {"repobilityId": "079512c441369c64", "scanner": "scanner-primary", "fingerprint": "942ef9ed1ec23c72", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c66ad4642a624ec8", "level": "error", "message": {"text": "Dangling fetch: GET /mpo/attributes (frontend/src/services/mpoAttributeService.ts:29)"}, "properties": {"repobilityId": "3152cff4d2662584", "scanner": "scanner-primary", "fingerprint": "c66ad4642a624ec8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-2429e3d211ced157", "level": "error", "message": {"text": "Dangling fetch: GET /mpo/categories (frontend/src/services/mpoAttributeService.ts:35)"}, "properties": {"repobilityId": "a0da19dc07cf8a21", "scanner": "scanner-primary", "fingerprint": "2429e3d211ced157", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-98b9ff0bc9416873", "level": "error", "message": {"text": "Dangling fetch: GET /domains (frontend/src/services/domainService.ts:6)"}, "properties": {"repobilityId": "9688af6ea58ee383", "scanner": "scanner-primary", "fingerprint": "98b9ff0bc9416873", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-65869e8763b73d9c", "level": "error", "message": {"text": "Dangling fetch: GET /domains/${id} (frontend/src/services/domainService.ts:12)"}, "properties": {"repobilityId": "9f0ba31d6f4e1391", "scanner": "scanner-primary", "fingerprint": "65869e8763b73d9c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-4f3663e4b2cc7eaf", "level": "error", "message": {"text": "Dangling fetch: GET /domains/slug/${slug} (frontend/src/services/domainService.ts:21)"}, "properties": {"repobilityId": "25fcbe5ee519726b", "scanner": "scanner-primary", "fingerprint": "4f3663e4b2cc7eaf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-b4d110c7fb706e7a", "level": "error", "message": {"text": "Dangling fetch: POST /domains (frontend/src/services/domainService.ts:29)"}, "properties": {"repobilityId": "fc25a0a78c79e39c", "scanner": "scanner-primary", "fingerprint": "b4d110c7fb706e7a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-21e982c48a582a3b", "level": "error", "message": {"text": "Dangling fetch: PUT /domains/${id} (frontend/src/services/domainService.ts:68)"}, "properties": {"repobilityId": "d95bcb70dbb1f7bc", "scanner": "scanner-primary", "fingerprint": "21e982c48a582a3b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-fc0dd716a17d80ff", "level": "error", "message": {"text": "Dangling fetch: GET /community (frontend/src/services/communityService.ts:22)"}, "properties": {"repobilityId": "47e8542720a52e92", "scanner": "scanner-primary", "fingerprint": "fc0dd716a17d80ff", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c6a3a066349efe6f", "level": "error", "message": {"text": "Dangling fetch: GET /community/domains/slug/${slug} (frontend/src/services/communityService.ts:38)"}, "properties": {"repobilityId": "267c71be77f820ee", "scanner": "scanner-primary", "fingerprint": "c6a3a066349efe6f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-64c731d9d627b46c", "level": "error", "message": {"text": "Dangling fetch: GET /community/domains/${domainId} (frontend/src/services/communityService.ts:60)"}, "properties": {"repobilityId": "2094066e51dc21e5", "scanner": "scanner-primary", "fingerprint": "64c731d9d627b46c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "66628e32de21d2d2", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-970eb92d6ec2bfaa", "level": "note", "message": {"text": "Unused endpoint: POST /generate"}, "properties": {"repobilityId": "4fd440a103e9d328", "scanner": "scanner-primary", "fingerprint": "970eb92d6ec2bfaa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-04a7ba60361cd075", "level": "note", "message": {"text": "Unused endpoint: GET /{synthesis_id}"}, "properties": {"repobilityId": "1ec1c3a652e329f2", "scanner": "scanner-primary", "fingerprint": "04a7ba60361cd075", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e0c19ca5aacf9c72", "level": "note", "message": {"text": "Unused endpoint: PATCH /{synthesis_id}"}, "properties": {"repobilityId": "9414fe3267f3fb14", "scanner": "scanner-primary", "fingerprint": "e0c19ca5aacf9c72", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-631dd507448fb06d", "level": "note", "message": {"text": "Unused endpoint: DELETE /{synthesis_id}"}, "properties": {"repobilityId": "3ed918e907e04578", "scanner": "scanner-primary", "fingerprint": "631dd507448fb06d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c9be1ce9b653b3c2", "level": "note", "message": {"text": "Unused endpoint: POST /{synthesis_id}/publish"}, "properties": {"repobilityId": "c48f61bc2a7a5e98", "scanner": "scanner-primary", "fingerprint": "c9be1ce9b653b3c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-618721b912bad1c2", "level": "note", "message": {"text": "Unused endpoint: POST /login"}, "properties": {"repobilityId": "5faa5c3b8ebf221e", "scanner": "scanner-primary", "fingerprint": "618721b912bad1c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "624f5f12faa7ae7b", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3f8670f2a29e2a18", "level": "note", "message": {"text": "Unused endpoint: GET /portfolio"}, "properties": {"repobilityId": "afe6022f89c38204", "scanner": "scanner-primary", "fingerprint": "3f8670f2a29e2a18", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "f4651f45ed6a2527", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-106f3e7fc5f65e4f", "level": "note", "message": {"text": "Unused endpoint: GET /{project_id}"}, "properties": {"repobilityId": "fb15b26cc6ebc24b", "scanner": "scanner-primary", "fingerprint": "106f3e7fc5f65e4f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a14db30d822db08d", "level": "note", "message": {"text": "Unused endpoint: GET /{project_id}/detail"}, "properties": {"repobilityId": "b033e54599123371", "scanner": "scanner-primary", "fingerprint": "a14db30d822db08d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-75726e5afbeebf0b", "level": "note", "message": {"text": "Unused endpoint: PATCH /{project_id}"}, "properties": {"repobilityId": "492bd7dfd5b4c713", "scanner": "scanner-primary", "fingerprint": "75726e5afbeebf0b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b9174fa868399f10", "level": "note", "message": {"text": "Unused endpoint: DELETE /{project_id}"}, "properties": {"repobilityId": "92da2b59d552bd78", "scanner": "scanner-primary", "fingerprint": "b9174fa868399f10", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fbf417892d6f5832", "level": "note", "message": {"text": "Unused endpoint: POST /{project_id}/clients"}, "properties": {"repobilityId": "2a89161f7107cc7c", "scanner": "scanner-primary", "fingerprint": "fbf417892d6f5832", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4cb73614b4fb642e", "level": "note", "message": {"text": "Unused endpoint: GET /db"}, "properties": {"repobilityId": "12da08d65eeb27e9", "scanner": "scanner-primary", "fingerprint": "4cb73614b4fb642e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-27cc2bb73ad635b3", "level": "note", "message": {"text": "Unused endpoint: POST /suggest"}, "properties": {"repobilityId": "1e233aebb780eddf", "scanner": "scanner-primary", "fingerprint": "27cc2bb73ad635b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5293719d857b5a90", "level": "note", "message": {"text": "Unused endpoint: GET /suggestions"}, "properties": {"repobilityId": "f2dcfa625a578afc", "scanner": "scanner-primary", "fingerprint": "5293719d857b5a90", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bc1d09ed53a52a18", "level": "note", "message": {"text": "Unused endpoint: POST /suggestions/{suggestion_id}/accept"}, "properties": {"repobilityId": "8279f65302426e3f", "scanner": "scanner-primary", "fingerprint": "bc1d09ed53a52a18", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a46dae1f3b7ca02c", "level": "note", "message": {"text": "Unused endpoint: GET /{draft_id}"}, "properties": {"repobilityId": "8c53cfa96bbbd499", "scanner": "scanner-primary", "fingerprint": "a46dae1f3b7ca02c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca4028d7dfab9150", "level": "note", "message": {"text": "Unused endpoint: PATCH /{draft_id}"}, "properties": {"repobilityId": "940ef60e0b073b61", "scanner": "scanner-primary", "fingerprint": "ca4028d7dfab9150", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2307002220b0c610", "level": "note", "message": {"text": "Unused endpoint: DELETE /{draft_id}"}, "properties": {"repobilityId": "c88c7ba7b9974e6d", "scanner": "scanner-primary", "fingerprint": "2307002220b0c610", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ff439cac602b7592", "level": "note", "message": {"text": "Unused endpoint: POST /{draft_id}/publish"}, "properties": {"repobilityId": "878d52650c615a21", "scanner": "scanner-primary", "fingerprint": "ff439cac602b7592", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-952355067560af40", "level": "note", "message": {"text": "Unused endpoint: GET /cockpit"}, "properties": {"repobilityId": "ccb280b692e9cf20", "scanner": "scanner-primary", "fingerprint": "952355067560af40", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d867635b02c2fa05", "level": "note", "message": {"text": "Unused endpoint: GET /cockpit/themes/{domain}"}, "properties": {"repobilityId": "8419e113a32590b8", "scanner": "scanner-primary", "fingerprint": "d867635b02c2fa05", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-85b644c90d989444", "level": "note", "message": {"text": "Unused endpoint: GET /coverage-matrix"}, "properties": {"repobilityId": "95c4ead599693642", "scanner": "scanner-primary", "fingerprint": "85b644c90d989444", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d8f7fcb06f19b788", "level": "note", "message": {"text": "Unused endpoint: PUT /categories/{category_key}"}, "properties": {"repobilityId": "10791e7423acd13e", "scanner": "scanner-primary", "fingerprint": "d8f7fcb06f19b788", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9f5188c921e956dc", "level": "note", "message": {"text": "Unused endpoint: PUT /attributes/{attribute_key}"}, "properties": {"repobilityId": "5da888064c3a77ba", "scanner": "scanner-primary", "fingerprint": "9f5188c921e956dc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-40ae164f64f9dd4e", "level": "note", "message": {"text": "Unused endpoint: DELETE /attributes/{attribute_key}"}, "properties": {"repobilityId": "e13781138006bec0", "scanner": "scanner-primary", "fingerprint": "40ae164f64f9dd4e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-67d28fa8cd6bb12f", "level": "note", "message": {"text": "Unused endpoint: PUT /"}, "properties": {"repobilityId": "00ff3f87a5e341d7", "scanner": "scanner-primary", "fingerprint": "67d28fa8cd6bb12f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-93e64087c77acacb", "level": "note", "message": {"text": "Unused endpoint: POST /consultoria"}, "properties": {"repobilityId": "5c7f852b0dfb7025", "scanner": "scanner-primary", "fingerprint": "93e64087c77acacb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c626c9f1365f67c6", "level": "note", "message": {"text": "Unused endpoint: POST /client"}, "properties": {"repobilityId": "ede8aec3a3a0d4cb", "scanner": "scanner-primary", "fingerprint": "c626c9f1365f67c6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8c6ae32b4b5f0d13", "level": "note", "message": {"text": "Unused endpoint: GET /responses"}, "properties": {"repobilityId": "b82b891c24bd33af", "scanner": "scanner-primary", "fingerprint": "8c6ae32b4b5f0d13", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e1b7bee247ffc801", "level": "note", "message": {"text": "Unused endpoint: GET /summary"}, "properties": {"repobilityId": "234ac5628a67db98", "scanner": "scanner-primary", "fingerprint": "e1b7bee247ffc801", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6fc0caa269292c44", "level": "note", "message": {"text": "Unused endpoint: GET /coverage"}, "properties": {"repobilityId": "701e5a8132bfada8", "scanner": "scanner-primary", "fingerprint": "6fc0caa269292c44", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c7d5ac9949f6add1", "level": "note", "message": {"text": "Unused endpoint: GET /evaluation"}, "properties": {"repobilityId": "3b007e822b44f979", "scanner": "scanner-primary", "fingerprint": "c7d5ac9949f6add1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-af6608de4c7fbf85", "level": "note", "message": {"text": "Unused endpoint: POST /manual"}, "properties": {"repobilityId": "af0b62830606b31e", "scanner": "scanner-primary", "fingerprint": "af6608de4c7fbf85", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-40684cece77e9131", "level": "note", "message": {"text": "Unused endpoint: PATCH /{comment_id}"}, "properties": {"repobilityId": "77b42d3cec7b4416", "scanner": "scanner-primary", "fingerprint": "40684cece77e9131", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f11060cc8edd5c0c", "level": "note", "message": {"text": "Unused endpoint: DELETE /{comment_id}"}, "properties": {"repobilityId": "836b809cdb99e81a", "scanner": "scanner-primary", "fingerprint": "f11060cc8edd5c0c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}