{"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": "foundry_unresolved_feedback", "name": "Foundry mined unresolved feedback: vitaomf/horus-rj", "shortDescription": {"text": "Foundry mined unresolved feedback: vitaomf/horus-rj"}, "fullDescription": {"text": "Graph query export: Human feedback without linked fix evidence\nQuery id: unresolved_feedback\nQuery type: motif_query\nIntent: Negative/unresolved examples that should not be hallucinated into fixes.\nMotif: unlinked_feedback_needs_evidence\nTraining usage: negative_or_unresolved\nGraph gold label: weak_supervision_needs_review\nRepo: vitaomf/horus-rj\nThread: vitaomf/horus-rj#3\nEvidence:\nGraph motif: Human feedback exists without a linked fix\nMotif id: unlinked_feedback_needs_evidence\nPolarity: bad\nTraining usage: negative_or_unresolved\nSeverity: medium\nRepo: vitaomf/horus-rj\nThread: vitaomf/horus-rj#3\nGraph gold label: weak_supervision_needs_review\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: vitaomf/horus-rj#3\nRepo: vitaomf/horus-rj\nIssue/PR number: 3\nGraph consistency label: weak_supervision_needs_review\nNodes: 22\nEdges: 41\nNode types: {'pr_file': 5, 'commit': 5, 'link_quality': 4, 'comment': 2, 'comment_chain': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome"}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "medium", "confidence": 0.7, "cwe": "", "owasp": ""}}, {"id": "foundry_assumption_check", "name": "Foundry mined assumption checks: vitaomf/horus-rj", "shortDescription": {"text": "Foundry mined assumption checks: vitaomf/horus-rj"}, "fullDescription": {"text": "Comment chain pattern product: assumption_checks\nRepo: vitaomf/horus-rj\nThread: vitaomf/horus-rj#3\nOutcome: claimed_resolved_unverified\nThread label: thread_has_human_issue_and_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_weak_supervision, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: vitaomf/horus-rj#3\nRepo: vitaomf/horus-rj\nThread label: thread_has_human_issue_and_fix_context\nOutcome: claimed_resolved_unverified\nComment count: 2\nLinked commit count: 5\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 5\nLabels: {'security_auth_secret': 1, 'deployment_env_gap': 1}\nPolarities: {'bad': 2}\nChanged file labels: {'source_or_other': 3, 'docs_or_claims': 1, 'ui_or_frontend': 1}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-080f646516396f81\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"security"}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "medium", "confidence": 0.62, "cwe": "", "owasp": ""}}, {"id": "foundry_auth_guardrail_gap", "name": "Foundry mined security auth guardrail gaps: vitaomf/horus-rj", "shortDescription": {"text": "Foundry mined security auth guardrail gaps: vitaomf/horus-rj"}, "fullDescription": {"text": "Graph query export: Security/auth changes without enough guardrails\nQuery id: security_auth_guardrail_gaps\nQuery type: motif_query\nIntent: Assumption-check security/auth examples requiring stronger tests or CI.\nMotif: security_auth_without_guardrails\nTraining usage: assumption_check\nGraph gold label: weak_supervision_needs_review\nRepo: vitaomf/horus-rj\nThread: vitaomf/horus-rj#3\nEvidence:\nGraph motif: Security/auth change without enough guardrails\nMotif id: security_auth_without_guardrails\nPolarity: bad\nTraining usage: assumption_check\nSeverity: critical\nRepo: vitaomf/horus-rj\nThread: vitaomf/horus-rj#3\nGraph gold label: weak_supervision_needs_review\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: vitaomf/horus-rj#3\nRepo: vitaomf/horus-rj\nIssue/PR number: 3\nGraph consistency label: weak_supervision_needs_review\nNodes: 22\nEdges: 41\nNode types: {'pr_file': 5, 'commit': 5, 'link_quality': 4, 'comment': 2, 'comment_chain': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_"}, "properties": {"scanner": "foundry_dataset", "category": "auth", "severity": "critical", "confidence": 0.78, "cwe": "", "owasp": ""}}, {"id": "scanner-d7a1ee7a85cb0ed5", "name": "Possibly dead Python function: coletar_ano_api", "shortDescription": {"text": "Possibly dead Python function: coletar_ano_api"}, "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-6599b83c37def82a", "name": "Possibly dead Python function: probe", "shortDescription": {"text": "Possibly dead Python function: probe"}, "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-6590e9d55d9c17d9", "name": "Possibly dead Python function: coletar_ano_api", "shortDescription": {"text": "Possibly dead Python function: coletar_ano_api"}, "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-a6feac2f812f47af", "name": "Possibly dead Python function: fetch_and_update", "shortDescription": {"text": "Possibly dead Python function: fetch_and_update"}, "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-ea04454c615435ce", "name": "Possibly dead Python function: coletar_contratos", "shortDescription": {"text": "Possibly dead Python function: coletar_contratos"}, "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-0a7baea03ff1cc33", "name": "Possibly dead Python function: coletar_tse", "shortDescription": {"text": "Possibly dead Python function: coletar_tse"}, "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-f34cae470648cddc", "name": "Possibly dead Python function: coletar_contratos", "shortDescription": {"text": "Possibly dead Python function: coletar_contratos"}, "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-bab65dd1a20c5b36", "name": "Possibly dead Python function: coletar_tse", "shortDescription": {"text": "Possibly dead Python function: coletar_tse"}, "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-6381c2736c5612f3", "name": "Possibly dead Python function: coletar_votacoes_camara", "shortDescription": {"text": "Possibly dead Python function: coletar_votacoes_camara"}, "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-18cf57d10507e426", "name": "Possibly dead Python function: backup_banco", "shortDescription": {"text": "Possibly dead Python function: backup_banco"}, "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-07479cdb34db7961", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PainelIndices.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PainelIndices.tsx:109"}, "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-7dbd999a1ff8c597", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/FeedbackButton.tsx:246", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/FeedbackButton.tsx:246"}, "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-a332356e5d9e967c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PainelCamara.tsx:151", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PainelCamara.tsx:151"}, "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-dcbd940056ca9fc0", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/FavoritosPanel.tsx:16", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/FavoritosPanel.tsx:16"}, "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-72df060c7f382ed2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PainelFluxo.tsx:75", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PainelFluxo.tsx:75"}, "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-7706f02514387197", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/SearchBar.tsx:316", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/SearchBar.tsx:316"}, "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-9ce47549e64ddf4a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/perfil/base/PerfilBaseEleitoral.tsx:62", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/perfil/base/PerfilBaseEleitoral.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-eae1be6906244830", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/perfil/base/PerfilStat.tsx:27", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/perfil/base/PerfilStat.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-4ecb83fbc20e62c9", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/perfil/blocos/BlocoEquipe.tsx:51", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/perfil/blocos/BlocoEquipe.tsx:51"}, "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-d4805ed3083647c2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/perfil/blocos/BlocoVetosDecretos.tsx:64", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/perfil/blocos/BlocoVetosDecretos.tsx:64"}, "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-d7768de3c0b1e916", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/perfil/blocos/BlocoProjetosLegislativos.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/perfil/blocos/BlocoProjetosLegislativos.tsx:69"}, "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-19895f0a52ce0a95", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/perfil/blocos/BlocoEmendas.tsx:60", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/perfil/blocos/BlocoEmendas.tsx:60"}, "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-d268db7ac8e20b68", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/CompararPage.tsx:119", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/CompararPage.tsx:119"}, "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-f801f203764eb472", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/HomePage.tsx:139", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/HomePage.tsx:139"}, "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-ac1430477ce84e85", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/BuscaAvancadaPage.tsx:226", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/BuscaAvancadaPage.tsx:226"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b28de8711e97bb67", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/EstadoPage.tsx:313", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/EstadoPage.tsx:313"}, "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-df00c9b84693f8f2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/RankingMunicipiosPage.tsx:181", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/RankingMunicipiosPage.tsx:181"}, "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-d21eb9bd76d1b79b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PoliticoPage.tsx:723", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PoliticoPage.tsx:723"}, "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-80ab34acfb12ba5d", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/EstatisticasPage.tsx:344", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/EstatisticasPage.tsx:344"}, "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-b4ecfe2acda209f8", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ParlamentaresListPage.tsx:195", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ParlamentaresListPage.tsx:195"}, "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-d1f9c0c44f31cd1f", "name": "Stray `console.log` in TS/JS \u2014 .claude/static-server.js:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/static-server.js:53"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2d6c5d780b9e4f08", "name": "`truncate` class without `title=` for hover reveal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/HomePag", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/HomePage.tsx:172"}, "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-0816664579ec4766", "name": "`truncate` class without `title=` for hover reveal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/BuscaAv", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/BuscaAvancadaPage.tsx:291"}, "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-f4577852989958f6", "name": "`truncate` class without `title=` for hover reveal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/Municip", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/MunicipiosListPage.tsx:134"}, "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-521ddfa5e75b0547", "name": "`truncate` class without `title=` for hover reveal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/Politic", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/PoliticosListPage.tsx:166"}, "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-1efe44779ad38324", "name": "`truncate` class without `title=` for hover reveal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/Politic", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/PoliticoPage.tsx:579"}, "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-d1570938f77f7b79", "name": "`truncate` class without `title=` for hover reveal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/Estatis", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/EstatisticasPage.tsx:255"}, "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-7a3eb5e344ea8f21", "name": "Stray `console.log` in TS/JS \u2014 .claude/worktrees/bold-lichterman-5ba06f/.claude/static-server.js:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/worktrees/bold-lichterman-5ba06f/.claude/static-server.js:53"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d63da3583b14afc0", "name": "Dockerfile runs as root: Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a35c6a00f751880f", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-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-e066691601852931", "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-1becb1b25c7057c6", "name": "Dockerfile runs as root: .claude/worktrees/bold-lichterman-5ba06f/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: .claude/worktrees/bold-lichterman-5ba06f/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-12d1cf9c1df54ea2", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-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-9befc2603bee2945", "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-d8afe128362ce0d0", "name": "Insecure pattern 'cors_wildcard' in CLAUDE.md:152", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in CLAUDE.md:152"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-106ce4299ec3aff5", "name": "Insecure pattern 'cors_wildcard' in .claude/static-server.js:44", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in .claude/static-server.js:44"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c2caf559805b859d", "name": "Insecure pattern 'cors_wildcard' in .claude/worktrees/bold-lichterman-5ba06f/CLAUDE.md:89", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in .claude/worktrees/bold-lichterman-5ba06f/CLAUDE.md:89"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b636359d52a2f80e", "name": "Insecure pattern 'cors_wildcard' in .claude/worktrees/bold-lichterman-5ba06f/.claude/static-server.js:44", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in .claude/worktrees/bold-lichterman-5ba06f/.claude/static-server.js:44"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8c713c44c9ed6de2", "name": "Very large file: frontend/src/pages/PoliticoPage.tsx (2065 lines)", "shortDescription": {"text": "Very large file: frontend/src/pages/PoliticoPage.tsx (2065 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-dcad618f12170b80", "name": "Very large file: .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/PoliticoPage.tsx (1047 lines)", "shortDescription": {"text": "Very large file: .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/PoliticoPage.tsx (1047 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-34d02c7610dfcfa9", "name": "Very large file: backend/api.py (3944 lines)", "shortDescription": {"text": "Very large file: backend/api.py (3944 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "3 test file(s) for 175 source file(s) (ratio 0.02). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 609 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 57 placeholder/mock markers across 19 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ecb0d2c55ed6875d", "name": "Agent authority lacks a verifier contract: .claude/settings.local.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.local.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-0a3d2fec8945f0ad", "name": "Legacy-named symbol `transparencia_rj_backup` in rebuild_db.py:6", "shortDescription": {"text": "Legacy-named symbol `transparencia_rj_backup` in rebuild_db.py:6"}, "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-68bfa629f304f740", "name": "`fetch()` without try/.catch or AbortSignal \u2014 vercel-proxy/api/proxy.js:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 vercel-proxy/api/proxy.js:21"}, "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-2fda5d20d93943cc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/BuscaAvancadaPage.tsx:126", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/BuscaAvancadaPage.tsx:126"}, "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-dac46484a1d48c96", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/PoliticosListPage.tsx:52", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/PoliticosListPage.tsx:52"}, "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-62085beec3a2e261", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/ParlamentaresListPage.tsx:93", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/ParlamentaresListPage.tsx:93"}, "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-ecf7633806176882", "name": "Commented-code block (5 lines) in scripts/coleta_tse_estadual.py:134", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/coleta_tse_estadual.py:134"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6f4035175ba061d2", "name": "Legacy-named symbol `rest_v1` in scripts/bio_wikipedia.py:7", "shortDescription": {"text": "Legacy-named symbol `rest_v1` in scripts/bio_wikipedia.py:7"}, "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-11d825a8de2b2743", "name": "Legacy-named symbol `rest_v1` in scripts/download_fotos_governadores.py:83", "shortDescription": {"text": "Legacy-named symbol `rest_v1` in scripts/download_fotos_governadores.py:83"}, "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-f8d54165fea8b1b4", "name": "Legacy-named symbol `transparencia_rj_backup` in .claude/worktrees/bold-lichterman-5ba06f/rebuild_db.py:6", "shortDescription": {"text": "Legacy-named symbol `transparencia_rj_backup` in .claude/worktrees/bold-lichterman-5ba06f/rebuild_db.py:6"}, "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-ab91bc2fdab70ee5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/worktrees/bold-lichterman-5ba06f/vercel-proxy/api/proxy.js:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/worktrees/bold-lichterman-5ba06f/vercel-proxy/api/proxy.js:21"}, "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-8a1b613894e056e4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/BuscaAvancadaP", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/BuscaAvancadaPage.tsx:123"}, "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-7498640c8f781cd6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/PoliticosListP", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/PoliticosListPage.tsx:44"}, "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-cfc2f26602a14a17", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/PoliticoPage.t", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/PoliticoPage.tsx:168"}, "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-5e3b956b32f4bcb1", "name": "Network/subprocess call without timeout or try/except \u2014 .claude/worktrees/bold-lichterman-5ba06f/scripts/legacy/check_re", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 .claude/worktrees/bold-lichterman-5ba06f/scripts/legacy/check_results.py:15"}, "fullDescription": {"text": "`urllib.request.urlopen(...)` 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-77a90b18fbf66f6e", "name": "Network/subprocess call without timeout or try/except \u2014 .claude/worktrees/bold-lichterman-5ba06f/scripts/legacy/debug_po", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 .claude/worktrees/bold-lichterman-5ba06f/scripts/legacy/debug_portal_contratos.py:17"}, "fullDescription": {"text": "`requests.get(...)` 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-19beb3465fddba36", "name": "Network/subprocess call without timeout or try/except \u2014 .claude/worktrees/bold-lichterman-5ba06f/scripts/legacy/debug_js", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 .claude/worktrees/bold-lichterman-5ba06f/scripts/legacy/debug_json.py:5"}, "fullDescription": {"text": "`requests.get(...)` 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-d0fa5fab749e00f1", "name": "Network/subprocess call without timeout or try/except \u2014 .claude/worktrees/bold-lichterman-5ba06f/scripts/legacy/debug_or", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 .claude/worktrees/bold-lichterman-5ba06f/scripts/legacy/debug_orgaos.py:10"}, "fullDescription": {"text": "`requests.get(...)` 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-f12b35caeece7fdc", "name": "Legacy-named symbol `rest_v1` in backend/api.py:2768", "shortDescription": {"text": "Legacy-named symbol `rest_v1` in backend/api.py:2768"}, "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-a1dd3738ec5ca90a", "name": "Commented-code block (5 lines) in backend/api.py:78", "shortDescription": {"text": "Commented-code block (5 lines) in backend/api.py:78"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\ncoleta_emendas.py:processar_valor, .claude/worktrees/bold-lichterman-5ba06f/coleta_emendas.py:processar_valor\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/fix_mandatos_legislaturas.py:main, scripts/migrate_votacoes_agg.py:main, scripts/coleta_indices_ibge.py:main\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-a448968251202297", "name": "Frontend route `/regiao/:slugRegiao` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/regiao/:slugRegiao` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f2eb2a75488911a0", "name": "Frontend route `/estado/:uf` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/estado/:uf` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-531041e9edb12f5d", "name": "Frontend route `/rj` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/rj` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-812ef60019ef714c", "name": "Frontend route `/municipios` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/municipios` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cb7c6cb0b61341a6", "name": "Frontend route `/municipios/:nome` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/municipios/:nome` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-248f5a8917a370a8", "name": "Frontend route `/politicos/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/politicos/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d46b644710991e42", "name": "FastAPI POST `enviar_feedback` without auth dependency \u2014 backend/api.py:3368", "shortDescription": {"text": "FastAPI POST `enviar_feedback` without auth dependency \u2014 backend/api.py:3368"}, "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-c9d7449c522752d0", "name": "Dangling fetch: GET /geo/brazil-states.topojson (frontend/src/components/MapaBrasil.tsx:39)", "shortDescription": {"text": "Dangling fetch: GET /geo/brazil-states.topojson (frontend/src/components/MapaBrasil.tsx:39)"}, "fullDescription": {"text": "`frontend/src/components/MapaBrasil.tsx:39` calls `GET /geo/brazil-states.topojson` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/geo/brazil-states.topojson`\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-551493be7c74db96", "name": "Dangling fetch: GET /geo/brazil-states.topojson (frontend/src/components/MapaAtuacaoParlamentar.tsx:139)", "shortDescription": {"text": "Dangling fetch: GET /geo/brazil-states.topojson (frontend/src/components/MapaAtuacaoParlamentar.tsx:139)"}, "fullDescription": {"text": "`frontend/src/components/MapaAtuacaoParlamentar.tsx:139` calls `GET /geo/brazil-states.topojson` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/geo/brazil-states.topojson`\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-038dbcef946f4ba6", "name": "Dangling fetch: GET /geo/mun/${view.uf.toLowerCase()}.json (frontend/src/components/MapaAtuacaoParlamentar.tsx:158)", "shortDescription": {"text": "Dangling fetch: GET /geo/mun/${view.uf.toLowerCase()}.json (frontend/src/components/MapaAtuacaoParlamentar.tsx:158)"}, "fullDescription": {"text": "`frontend/src/components/MapaAtuacaoParlamentar.tsx:158` calls `GET /geo/mun/${view.uf.toLowerCase()}.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/geo/mun/<p>.json`\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-34dc7f4a7fc3f155", "name": "Dangling fetch: GET /municipios-rj.json (.claude/worktrees/bold-lichterman-5ba06f/frontend/src/components/MapaRJ.tsx:85)", "shortDescription": {"text": "Dangling fetch: GET /municipios-rj.json (.claude/worktrees/bold-lichterman-5ba06f/frontend/src/components/MapaRJ.tsx:85)"}, "fullDescription": {"text": "`.claude/worktrees/bold-lichterman-5ba06f/frontend/src/components/MapaRJ.tsx:85` calls `GET /municipios-rj.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/municipios-rj.json`\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-b06a1bdc8cc511ae", "name": "Dangling fetch: GET https://dadosabertos.camara.leg.br/api/v2/deputados?nome=${encodeURIComponent(data.nome)}&itens=5 (.", "shortDescription": {"text": "Dangling fetch: GET https://dadosabertos.camara.leg.br/api/v2/deputados?nome=${encodeURIComponent(data.nome)}&itens=5 (.claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/PoliticoPage.tsx:168)"}, "fullDescription": {"text": "`.claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/PoliticoPage.tsx:168` calls `GET https://dadosabertos.camara.leg.br/api/v2/deputados?nome=${encodeURIComponent(data.nome)}&itens=5` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/dadosabertos.camara.leg.br/api/v2/deputados`\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-1558ac6d4d428f3f", "name": "Unused endpoint: GET /api/municipios/heatmap", "shortDescription": {"text": "Unused endpoint: GET /api/municipios/heatmap"}, "fullDescription": {"text": "`.claude/worktrees/bold-lichterman-5ba06f/backend/api.py` declares `GET /api/municipios/heatmap` 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-3f0a09ee78a8e983", "name": "Unused endpoint: GET /api/emendas/busca", "shortDescription": {"text": "Unused endpoint: GET /api/emendas/busca"}, "fullDescription": {"text": "`.claude/worktrees/bold-lichterman-5ba06f/backend/api.py` declares `GET /api/emendas/busca` 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-7e7d1b2dc3dd0043", "name": "Unused endpoint: GET /api/municipios", "shortDescription": {"text": "Unused endpoint: GET /api/municipios"}, "fullDescription": {"text": "`.claude/worktrees/bold-lichterman-5ba06f/backend/api.py` declares `GET /api/municipios` 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-407138673d6812f7", "name": "Unused endpoint: GET /api/municipios/{municipio_id}/problemas", "shortDescription": {"text": "Unused endpoint: GET /api/municipios/{municipio_id}/problemas"}, "fullDescription": {"text": "`.claude/worktrees/bold-lichterman-5ba06f/backend/api.py` declares `GET /api/municipios/{municipio_id}/problemas` 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-6fbba0b6146a7808", "name": "Unused endpoint: GET /api/municipios/{municipio_id}/emendas", "shortDescription": {"text": "Unused endpoint: GET /api/municipios/{municipio_id}/emendas"}, "fullDescription": {"text": "`.claude/worktrees/bold-lichterman-5ba06f/backend/api.py` declares `GET /api/municipios/{municipio_id}/emendas` 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-2f43e00eab115971", "name": "Unused endpoint: GET /api/emendas/total", "shortDescription": {"text": "Unused endpoint: GET /api/emendas/total"}, "fullDescription": {"text": "`.claude/worktrees/bold-lichterman-5ba06f/backend/api.py` declares `GET /api/emendas/total` 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-d778b4e6bce3188e", "name": "Unused endpoint: GET /api/politicos/total", "shortDescription": {"text": "Unused endpoint: GET /api/politicos/total"}, "fullDescription": {"text": "`.claude/worktrees/bold-lichterman-5ba06f/backend/api.py` declares `GET /api/politicos/total` 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-ed0ab998ae2061d9", "name": "Unused endpoint: GET /api/politicos", "shortDescription": {"text": "Unused endpoint: GET /api/politicos"}, "fullDescription": {"text": "`.claude/worktrees/bold-lichterman-5ba06f/backend/api.py` declares `GET /api/politicos` 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-fc71c8e1901cb2a0", "name": "Unused endpoint: GET /api/politicos/busca", "shortDescription": {"text": "Unused endpoint: GET /api/politicos/busca"}, "fullDescription": {"text": "`.claude/worktrees/bold-lichterman-5ba06f/backend/api.py` declares `GET /api/politicos/busca` 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-d1c69ff89c57b366", "name": "Unused endpoint: GET /api/municipios/{nome}/detalhes", "shortDescription": {"text": "Unused endpoint: GET /api/municipios/{nome}/detalhes"}, "fullDescription": {"text": "`.claude/worktrees/bold-lichterman-5ba06f/backend/api.py` declares `GET /api/municipios/{nome}/detalhes` 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-7f8252dffad31d95", "name": "Unused endpoint: GET /api/municipios/{nome}/contratos", "shortDescription": {"text": "Unused endpoint: GET /api/municipios/{nome}/contratos"}, "fullDescription": {"text": "`.claude/worktrees/bold-lichterman-5ba06f/backend/api.py` declares `GET /api/municipios/{nome}/contratos` 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-878189ebd5e59ced", "name": "Unused endpoint: GET /api/politicos/{politico_id}", "shortDescription": {"text": "Unused endpoint: GET /api/politicos/{politico_id}"}, "fullDescription": {"text": "`.claude/worktrees/bold-lichterman-5ba06f/backend/api.py` declares `GET /api/politicos/{politico_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-81b430118bcb05cf", "name": "Unused endpoint: GET /api/estatisticas", "shortDescription": {"text": "Unused endpoint: GET /api/estatisticas"}, "fullDescription": {"text": "`.claude/worktrees/bold-lichterman-5ba06f/backend/api.py` declares `GET /api/estatisticas` 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-7ad1f29b005c9caf", "name": "Unused endpoint: GET /api/politicos/{politico_id}/cruzamento", "shortDescription": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/cruzamento"}, "fullDescription": {"text": "`.claude/worktrees/bold-lichterman-5ba06f/backend/api.py` declares `GET /api/politicos/{politico_id}/cruzamento` 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-4756b4c4da7d2088", "name": "Unused endpoint: GET /api/health", "shortDescription": {"text": "Unused endpoint: GET /api/health"}, "fullDescription": {"text": "`.claude/worktrees/bold-lichterman-5ba06f/backend/api.py` declares `GET /api/health` 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-49511ad17dbba029", "name": "Unused endpoint: GET /{rest_of_path:path}", "shortDescription": {"text": "Unused endpoint: GET /{rest_of_path:path}"}, "fullDescription": {"text": "`.claude/worktrees/bold-lichterman-5ba06f/backend/api.py` declares `GET /{rest_of_path:path}` 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-7cdf9acef29a1e3c", "name": "Unused endpoint: GET /api/municipios/ranking", "shortDescription": {"text": "Unused endpoint: GET /api/municipios/ranking"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/municipios/ranking` 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-f6b3d7aedd89c65e", "name": "Unused endpoint: GET /api/estados/{uf}/stats", "shortDescription": {"text": "Unused endpoint: GET /api/estados/{uf}/stats"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/estados/{uf}/stats` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bdc418a7a60904c3", "name": "Unused endpoint: GET /api/eleitos/estadual", "shortDescription": {"text": "Unused endpoint: GET /api/eleitos/estadual"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/eleitos/estadual` 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-b2b249d3c0aaf7c0", "name": "Unused endpoint: GET /api/foto_tse/{kind}/{registro_id}", "shortDescription": {"text": "Unused endpoint: GET /api/foto_tse/{kind}/{registro_id}"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/foto_tse/{kind}/{registro_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-1259831261a2d341", "name": "Unused endpoint: GET /api/eleitos/municipal", "shortDescription": {"text": "Unused endpoint: GET /api/eleitos/municipal"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/eleitos/municipal` 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-9c3403520ddea667", "name": "Unused endpoint: GET /api/emendas/por_uf", "shortDescription": {"text": "Unused endpoint: GET /api/emendas/por_uf"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/emendas/por_uf` 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-f3a5a976c4d0ffe9", "name": "Unused endpoint: GET /api/foto/{politico_id}", "shortDescription": {"text": "Unused endpoint: GET /api/foto/{politico_id}"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/foto/{politico_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-23fd75ddad1ed7ab", "name": "Unused endpoint: GET /api/busca/global", "shortDescription": {"text": "Unused endpoint: GET /api/busca/global"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/busca/global` 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-a6a12aa5c0d30e06", "name": "Unused endpoint: GET /api/politicos/{politico_id}/distribuicao", "shortDescription": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/distribuicao"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/politicos/{politico_id}/distribuicao` 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-a2c7e3ceaa9dd1e2", "name": "Unused endpoint: GET /api/politicos/{politico_id}/distribuicao_municipios", "shortDescription": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/distribuicao_municipios"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/politicos/{politico_id}/distribuicao_municipios` 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-c5135acb5c5732d4", "name": "Unused endpoint: GET /api/politicos/{politico_id}/perfil_tipo", "shortDescription": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/perfil_tipo"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/politicos/{politico_id}/perfil_tipo` 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-5ada7df4735362a9", "name": "Unused endpoint: GET /api/politicos/{politico_id}/trajetoria", "shortDescription": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/trajetoria"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/politicos/{politico_id}/trajetoria` 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-02d65458e7487d2e", "name": "Unused endpoint: GET /api/politicos/{politico_id}/votos", "shortDescription": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/votos"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/politicos/{politico_id}/votos` 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-aa41f97ede69522e", "name": "Unused endpoint: GET /api/politicos/{politico_id}/votacoes_nominais", "shortDescription": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/votacoes_nominais"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/politicos/{politico_id}/votacoes_nominais` 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-a8171c09843c334a", "name": "Unused endpoint: GET /api/politicos/{politico_id}/scorecard_legislativo", "shortDescription": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/scorecard_legislativo"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/politicos/{politico_id}/scorecard_legislativo` 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-9ae3b06726753b75", "name": "Unused endpoint: GET /api/politicos/{politico_id}/emendas", "shortDescription": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/emendas"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/politicos/{politico_id}/emendas` 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-4f2dd27c1924e201", "name": "Unused endpoint: GET /api/camara/atividade", "shortDescription": {"text": "Unused endpoint: GET /api/camara/atividade"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/camara/atividade` 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-a6e2b55bf62983bd", "name": "Unused endpoint: GET /api/camara/bio", "shortDescription": {"text": "Unused endpoint: GET /api/camara/bio"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/camara/bio` 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-92fb19eadb6ed532", "name": "Unused endpoint: GET /api/politicos/{politico_id}/ranking", "shortDescription": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/ranking"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/politicos/{politico_id}/ranking` 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-9c4d3f308674a472", "name": "Unused endpoint: GET /api/politicos/{politico_id}/wikipedia", "shortDescription": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/wikipedia"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/politicos/{politico_id}/wikipedia` 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-0c69f40fad38bd6c", "name": "Unused endpoint: GET /api/status/coleta", "shortDescription": {"text": "Unused endpoint: GET /api/status/coleta"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/status/coleta` 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-d33003f20c14c4b3", "name": "Unused endpoint: GET /api/indices/municipio_por_nome", "shortDescription": {"text": "Unused endpoint: GET /api/indices/municipio_por_nome"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/indices/municipio_por_nome` 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-6cfa6d677a55c018", "name": "Unused endpoint: GET /api/indices/{nivel}/{territorio_id}", "shortDescription": {"text": "Unused endpoint: GET /api/indices/{nivel}/{territorio_id}"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/indices/{nivel}/{territorio_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-aaf1c7bb5937ff92", "name": "Unused endpoint: GET /api/inconsistencias", "shortDescription": {"text": "Unused endpoint: GET /api/inconsistencias"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/inconsistencias` 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-8eef9255ce375627", "name": "Unused endpoint: POST /api/feedback", "shortDescription": {"text": "Unused endpoint: POST /api/feedback"}, "fullDescription": {"text": "`backend/api.py` declares `POST /api/feedback` 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-48bb554d780882c9", "name": "Unused endpoint: GET /api/camara/agenda", "shortDescription": {"text": "Unused endpoint: GET /api/camara/agenda"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/camara/agenda` 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-261195abf076d5a7", "name": "Unused endpoint: GET /api/camara/votacoes-recentes", "shortDescription": {"text": "Unused endpoint: GET /api/camara/votacoes-recentes"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/camara/votacoes-recentes` 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-1afa3d7151508d0c", "name": "Unused endpoint: GET /api/camara/pauta/{evento_id}", "shortDescription": {"text": "Unused endpoint: GET /api/camara/pauta/{evento_id}"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/camara/pauta/{evento_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-210ac955e9921275", "name": "Unused endpoint: GET /api/sapl/casas", "shortDescription": {"text": "Unused endpoint: GET /api/sapl/casas"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/sapl/casas` 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-81019b34cee48c75", "name": "Unused endpoint: GET /api/sapl/resolver", "shortDescription": {"text": "Unused endpoint: GET /api/sapl/resolver"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/sapl/resolver` 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-d89ae3247accf9d7", "name": "Unused endpoint: GET /api/sapl/{casa}/agenda", "shortDescription": {"text": "Unused endpoint: GET /api/sapl/{casa}/agenda"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/sapl/{casa}/agenda` 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-a6e6ee91796f1fa5", "name": "Unused endpoint: GET /api/sapl/{casa}/materias", "shortDescription": {"text": "Unused endpoint: GET /api/sapl/{casa}/materias"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/sapl/{casa}/materias` 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-9c2dbb5f3242dbfd", "name": "Unused endpoint: GET /api/sapl/{casa}/votacoes", "shortDescription": {"text": "Unused endpoint: GET /api/sapl/{casa}/votacoes"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/sapl/{casa}/votacoes` 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-6be7d288614a2bf4", "name": "Unused endpoint: GET /api/assembleia/casas", "shortDescription": {"text": "Unused endpoint: GET /api/assembleia/casas"}, "fullDescription": {"text": "`backend/api.py` declares `GET /api/assembleia/casas` 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/22339"}, "properties": {"repository": "vitaomf/horus-rj", "repoUrl": "https://github.com/vitaomf/horus-rj", "branch": "main"}, "results": [{"ruleId": "foundry_unresolved_feedback", "level": "warning", "message": {"text": "Foundry mined unresolved feedback: vitaomf/horus-rj"}, "properties": {"repobilityId": 431040, "scanner": "foundry_dataset", "fingerprint": "7aef1a21c7e45f75ba6006c87cae2c4a44fe51f5c9a45a4eb8e64c61019d6eff", "category": "practices", "severity": "medium", "confidence": 0.7, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Human feedback without linked fix evidence", "intent": "Negative/unresolved examples that should not be hallucinated into fixes.", "labels": {"bug_fix": 5, "docs_or_claims": 1, "ui_or_frontend": 1, "source_or_other": 3, "deployment_env_gap": 1, "security_auth_secret": 1, "claimed_resolved_unverified": 3, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 1, "human_reported_issue_no_linked_fix": 1, "human_reported_issue_then_fix_attempt": 1, "thread_has_human_issue_and_fix_context": 2}, "source": "graph_query_export", "motif_id": "unlinked_feedback_needs_evidence", "outcomes": {"claimed_resolved_unverified": 6, "not_resolved_or_not_observed": 2}, "polarity": "bad", "query_id": "unresolved_feedback", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 41, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 2, "thread_touches_file": 5, "chain_has_link_quality": 4, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 5, "thread_has_comment_chain": 2, "comment_chain_links_commit": 5, "comment_chain_touches_file": 10, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 2}, "node_count": 22, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 2, "pr_file": 5, "fix_outcome": 1, "issue_chain": 1, "link_quality": 4, "comment_chain": 2}, "query_type": "motif_query", "thread_key": "vitaomf/horus-rj#3", "issue_number": "3", "quality_tiers": {"unresolved": 1, "weak_supervision": 3}, "repo_full_name": "vitaomf/horus-rj", "training_usage": "negative_or_unresolved", "source_motif_id": "graph-pattern-motif-thread-8e582bbc46f7c85d", "graph_gold_label": "weak_supervision_needs_review", "changed_file_labels": {"docs_or_claims": 5, "ui_or_frontend": 5, "source_or_other": 15}}, "text": "Graph query export: Human feedback without linked fix evidence\nQuery id: unresolved_feedback\nQuery type: motif_query\nIntent: Negative/unresolved examples that should not be hallucinated into fixes.\nMotif: unlinked_feedback_needs_evidence\nTraining usage: negative_or_unresolved\nGraph gold label: weak_supervision_needs_review\nRepo: vitaomf/horus-rj\nThread: vitaomf/horus-rj#3\nEvidence:\nGraph motif: Human feedback exists without a linked fix\nMotif id: unlinked_feedback_needs_evidence\nPolarity: bad\nTraining usage: negative_or_unresolved\nSeverity: medium\nRepo: vitaomf/horus-rj\nThread: vitaomf/horus-rj#3\nGraph gold label: weak_supervision_needs_review\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: vitaomf/horus-rj#3\nRepo: vitaomf/horus-rj\nIssue/PR number: 3\nGraph consistency label: weak_supervision_needs_review\nNodes: 22\nEdges: 41\nNode types: {'pr_file': 5, 'commit': 5, 'link_quality': 4, 'comment': 2, 'comment_chain': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'comment_chain_touches_file': 10, 'thread_touches_file': 5, 'comment_chain_links_commit': 5, 'issue_chain_touches_file': 5, 'chain_has_link_quality': 4, 'thread_has_comment': 2, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'issue_chain_has_comment_chain': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'bug_fix': 5, 'source_or_other': 3, 'claimed_resolved_unverified': 3, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'security_auth_secret': 1, 'deployment_env_gap': 1, 'docs_or_claims': 1, 'ui_or_frontend': 1, 'human_reported_issue_then_fix_attempt': 1, 'human_reported_issue_no_linked_fix': 1, 'not_resolved_or_not_observed': 1}\nOutcomes: {'claimed_resolved_unverified': 6, 'not_resolved_or_not_observed': 2}\nQuality tiers: {'weak_supervision': 3, 'unresolved': 1}\nCI labels: {}\nCurriculum targets:\n- Teach models to preserve unresolved human feedback instead of hallucinating fixes.\n- Build issue-to-regression examples where no accepted fix exists yet.\nAssumption checks:\n- Can a commit be linked by issue number, SHA, changed path, or time window?\n- If no link exists, is this explicitly labelled unresolved?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/vitaomf/horus-rj", "source_id": "graph-query-motif_query-6cf83bb76850d31a", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/unresolved_feedback/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "vitaomf/horus-rj", "source_dataset": "graph_queries/unresolved_feedback", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_assumption_check", "level": "warning", "message": {"text": "Foundry mined assumption checks: vitaomf/horus-rj"}, "properties": {"repobilityId": 383791, "scanner": "foundry_dataset", "fingerprint": "838861fc7555597bb4ac374a36ea5ed0c5475fd1b5b51d66a2d8d0f5af018bc7", "category": "practices", "severity": "medium", "confidence": 0.62, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "comment_chain_pattern_product", "source": "comment_chain_pattern_miner", "product": "assumption_checks", "synthetic": false, "thread_key": "vitaomf/horus-rj#3", "human_labels": ["deployment_env_gap", "docs_or_claims", "security_auth_secret", "source_or_other", "ui_or_frontend"], "issue_number": "3", "thread_label": "thread_has_human_issue_and_fix_context", "outcome_label": "claimed_resolved_unverified", "source_backed": true, "max_confidence": 0.65, "repo_full_name": "vitaomf/horus-rj", "training_usage": "weak_supervision", "confidence_tier": "weak_supervision", "source_chain_id": "evidence-chain-issue_chain-d5342cad59547b4e", "helicopter_views": {"graphs": 2}, "artifact_families": {"ci": 2, "docs": 6}, "source_chain_kind": "issue_chain", "changed_file_count": 5, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"docs_or_claims": 1, "ui_or_frontend": 1, "source_or_other": 3}, "linked_commit_count": 5, "helicopter_view_count": 2, "source_artifact_count": 8, "classification_reasons": ["source_graph_has_real_artifacts", "source_graph_has_verification_artifacts", "repo_has_isolated_helicopter_views", "link_quality_weak_supervision", "high_risk_human_feedback_label"], "linked_ci_commit_count": 0, "verification_artifact_count": 2, "design_schema_api_artifact_count": 0}, "text": "Comment chain pattern product: assumption_checks\nRepo: vitaomf/horus-rj\nThread: vitaomf/horus-rj#3\nOutcome: claimed_resolved_unverified\nThread label: thread_has_human_issue_and_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_weak_supervision, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: vitaomf/horus-rj#3\nRepo: vitaomf/horus-rj\nThread label: thread_has_human_issue_and_fix_context\nOutcome: claimed_resolved_unverified\nComment count: 2\nLinked commit count: 5\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 5\nLabels: {'security_auth_secret': 1, 'deployment_env_gap': 1}\nPolarities: {'bad': 2}\nChanged file labels: {'source_or_other': 3, 'docs_or_claims': 1, 'ui_or_frontend': 1}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-080f646516396f81\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"security_auth_secret\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/vitaomf/horus-rj/pull/3\",\n    \"text\": \"GitHub feedback: security_auth_secret\\nPolarity: bad\\nKind: pull_request_body\\nRepo: vitaomf/horus-rj\\nAuthor: vitaomf (User)\\nURL: https://github.com/vitaomf/horus-rj/pull/3\\nTitle: feat: dossi\u00ea pol\u00edtico redesign \u2014 hero, trajet\u00f3ria, atividade legislativa (2025/2026)\\nBody:\\n## Resumo\\n\\nRedesign completo do dossi\u00ea de cada parlamentar federal, transformando-o de um painel de dados em uma pe\u00e7a jornal\u00edstica completa. Novos endpoints na C\u00e2mara API para dados em tempo real de 2025/2026.\\n\\n## O que mudou\\n\\n### Dossi\u00ea Pol\u00edtico \u2014 Hero redesenhado\\n- Foto portrait grande (208\u00d7272px) buscada automaticamente da C\u00e2mara dos Deputados API com proxy no backend (sem CORS)\\n- **152/154 deputados agora t\u00eam foto** no banco (enriquecimento executado nesta sess\u00e3o)\\n- Nome em Bebas text-8xl vis\u00edvel imediatamente ao entrar\\n- Bio real autom\u00e1tica: cidade de nascimento, escolaridade, profiss\u00e3o \u2014 dados oficiais da C\u00e2mara\\n- Bio ir\u00f4nica de gastos (algoritmo pr\u00f3prio que identifica padr\u00f5es eleitoreiros, clientelistas, etc.)\\n\\n### Trajet\u00f3ria Pol\u00edtica (linha do tempo vertical)\\n- Eventos cronol\u00f3gicos: nascimento \u2192 legislaturas \u2192 campanha \u2192 mandato atual\\n- Mudan\u00e7as partid\u00e1rias rastreadas (PR \u2192 PMDB \u2192 PL etc.) com chips coloridos\\n-\"\n  },\n  {\n    \"id\": \"github-feedback-comment-de2fd7b3bbe356c7\",\n    \"kind\": \"issue_comment\",\n    \"label\": \"deployment_env_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/vitaomf/horus-rj/pull/3#issuecomment-4424144320\",\n    \"text\": \"GitHub feedback: deployment_env_gap\\nPolarity: bad\\nKind: issue_comment\\nRepo: vitaomf/horus-rj\\nAuthor: vercel[bot] (Bot)\\nURL: https://github.com/vitaomf/horus-rj/pull/3#issuecomment-4424144320\\nTitle: \\nBody:\\n[vc]: #p9Iie9L4r2lysXhNNMIm6xCy+xYwXXZBsyTH5hSr0l8=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJob3J1cy1yaiIsInByb2plY3RJZCI6InByal9PV0xIeENUa0ZCS\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/vitaomf/horus-rj", "source_id": "comment-chain-pattern-assumption_checks-f799b3a181afd29c", "synthetic": false, "gold_label": "", "graph_label": "source_backed_multi_signal_graph", "source_path": "/data/distillate/foundry_data/comment_chain_patterns/assumption_checks/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "vitaomf/horus-rj", "source_dataset": "comment_chain_patterns/assumption_checks", "training_usage": "weak_supervision"}}}, {"ruleId": "foundry_assumption_check", "level": "warning", "message": {"text": "Foundry mined assumption checks: vitaomf/horus-rj"}, "properties": {"repobilityId": 383790, "scanner": "foundry_dataset", "fingerprint": "64086a2dbe2e4a39a4bbafcc46b933995b47df994c4708ee242871824d5a8590", "category": "practices", "severity": "medium", "confidence": 0.62, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "comment_chain_pattern_product", "source": "comment_chain_pattern_miner", "product": "assumption_checks", "synthetic": false, "thread_key": "vitaomf/horus-rj#2", "human_labels": ["deployment_env_gap", "security_auth_secret", "source_or_other"], "issue_number": "2", "thread_label": "thread_has_human_issue_and_fix_context", "outcome_label": "claimed_resolved_unverified", "source_backed": true, "max_confidence": 0.787, "repo_full_name": "vitaomf/horus-rj", "training_usage": "weak_supervision", "confidence_tier": "weak_supervision", "source_chain_id": "evidence-chain-issue_chain-8f0cf3041edd2022", "helicopter_views": {"graphs": 2}, "artifact_families": {"ci": 2, "docs": 6}, "source_chain_kind": "issue_chain", "changed_file_count": 5, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"source_or_other": 5}, "linked_commit_count": 8, "helicopter_view_count": 2, "source_artifact_count": 8, "classification_reasons": ["source_graph_has_real_artifacts", "source_graph_has_verification_artifacts", "repo_has_isolated_helicopter_views", "link_quality_weak_supervision", "high_risk_human_feedback_label"], "linked_ci_commit_count": 0, "verification_artifact_count": 2, "design_schema_api_artifact_count": 0}, "text": "Comment chain pattern product: assumption_checks\nRepo: vitaomf/horus-rj\nThread: vitaomf/horus-rj#2\nOutcome: claimed_resolved_unverified\nThread label: thread_has_human_issue_and_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_weak_supervision, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: vitaomf/horus-rj#2\nRepo: vitaomf/horus-rj\nThread label: thread_has_human_issue_and_fix_context\nOutcome: claimed_resolved_unverified\nComment count: 2\nLinked commit count: 8\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 5\nLabels: {'security_auth_secret': 1, 'deployment_env_gap': 1}\nPolarities: {'bad': 2}\nChanged file labels: {'source_or_other': 5}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-033b2f31bc097e14\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"security_auth_secret\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/vitaomf/horus-rj/pull/2\",\n    \"text\": \"GitHub feedback: security_auth_secret\\nPolarity: bad\\nKind: pull_request_body\\nRepo: vitaomf/horus-rj\\nAuthor: vitaomf (User)\\nURL: https://github.com/vitaomf/horus-rj/pull/2\\nTitle: fix(infra): watchdog resiliente \u2014 ngrok + scheduler + autostart no login\\nBody:\\n## O que mudou\\n\\n### `watchdog.ps1` \u2014 reescrito e expandido\\n- **Reverte Cloudflare Tunnel \u2192 ngrok**: o Vercel proxy (`vercel.json` + `vercel-proxy/api/proxy.js`) aponta para o dom\u00ednio ngrok fixo `synergistic-hemathermal-myesha.ngrok-free.dev`. O watchdog anterior havia sido migrado para Cloudflare Tunnel (URL aleat\u00f3ria), quebrando a cadeia \u2014 esse PR corrige o alinhamento.\\n- **Adiciona monitoramento do scheduler**: o `scheduler.py` (APScheduler) agora \u00e9 monitorado e reiniciado automaticamente se morrer, assim como o backend.\\n- **Corrige bug de redirecionamento**: `Start-Process` n\u00e3o aceita o mesmo arquivo em `-RedirectStandardOutput` e `-RedirectStandardError` simultaneamente \u2014 isso matava o watchdog silenciosamente. Separados em `scheduler_stdout.log` e `scheduler_stderr.log`.\\n\\n### `setup_autostart.ps1` \u2014 novo arquivo\\n- Registra o watchdog no `HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run` (n\u00e3o precisa de admin).\\n- Garante que\"\n  },\n  {\n    \"id\": \"github-feedback-comment-371957b5be87a250\",\n    \"kind\": \"issue_comment\",\n    \"label\": \"deployment_env_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/vitaomf/horus-rj/pull/2#issuecomment-4411298121\",\n    \"text\": \"GitHub feedback: deployment_env_gap\\nPolarity: bad\\nKind: issue_comment\\nRepo: vitaomf/horus-rj\\nAuthor: vercel[bot] (Bot)\\nURL: https://github.com/vitaomf/horus-rj/pull/2#issuecomment-4411298121\\nTitle: \\nBody:\\n[vc]: #irQ4FbKXxplZziHJM2d/0EVky63cXMHtpWLR7LAnT80=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJob3J1cy1yaiIsInByb2plY3RJZCI6InByal9PV0xIeENUa0ZCSEhvckppclRJaENZZ1NkZUJ4IiwibGl2ZUZlZWRiYWNrI\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/vitaomf/horus-rj", "source_id": "comment-chain-pattern-assumption_checks-1d5f679ebed4d0e0", "synthetic": false, "gold_label": "", "graph_label": "source_backed_multi_signal_graph", "source_path": "/data/distillate/foundry_data/comment_chain_patterns/assumption_checks/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "vitaomf/horus-rj", "source_dataset": "comment_chain_patterns/assumption_checks", "training_usage": "weak_supervision"}}}, {"ruleId": "foundry_assumption_check", "level": "warning", "message": {"text": "Foundry mined assumption checks: vitaomf/horus-rj"}, "properties": {"repobilityId": 383789, "scanner": "foundry_dataset", "fingerprint": "94ded8499715ea4f22f5e3051e7f7aaa46817fb4f9c29bd0840c47388089faba", "category": "practices", "severity": "medium", "confidence": 0.62, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "comment_chain_pattern_product", "source": "comment_chain_pattern_miner", "product": "assumption_checks", "synthetic": false, "thread_key": "vitaomf/horus-rj#1", "human_labels": ["api_or_backend", "dependency_or_build", "deployment_env_gap", "docs_or_claims", "source_or_other", "test_or_ci", "ui_or_frontend"], "issue_number": "1", "thread_label": "thread_has_human_issue_and_fix_context", "outcome_label": "claimed_resolved_unverified", "source_backed": true, "max_confidence": 0.77, "repo_full_name": "vitaomf/horus-rj", "training_usage": "weak_supervision", "confidence_tier": "weak_supervision", "source_chain_id": "evidence-chain-issue_chain-20199a83db0cd216", "helicopter_views": {"graphs": 2}, "artifact_families": {"ci": 2, "docs": 6}, "source_chain_kind": "issue_chain", "changed_file_count": 15, "source_graph_label": "source_backed_multi_signal_graph", "changed_file_labels": {"test_or_ci": 1, "api_or_backend": 1, "docs_or_claims": 1, "ui_or_frontend": 7, "source_or_other": 3, "dependency_or_build": 2}, "linked_commit_count": 2, "helicopter_view_count": 2, "source_artifact_count": 8, "classification_reasons": ["source_graph_has_real_artifacts", "source_graph_has_verification_artifacts", "repo_has_isolated_helicopter_views", "link_quality_weak_supervision", "high_risk_human_feedback_label"], "linked_ci_commit_count": 0, "verification_artifact_count": 2, "design_schema_api_artifact_count": 0}, "text": "Comment chain pattern product: assumption_checks\nRepo: vitaomf/horus-rj\nThread: vitaomf/horus-rj#1\nOutcome: claimed_resolved_unverified\nThread label: thread_has_human_issue_and_fix_context\nSource graph label: source_backed_multi_signal_graph\nReasons: source_graph_has_real_artifacts, source_graph_has_verification_artifacts, repo_has_isolated_helicopter_views, link_quality_weak_supervision, high_risk_human_feedback_label\nChain evidence:\nIssue/PR evidence chain: vitaomf/horus-rj#1\nRepo: vitaomf/horus-rj\nThread label: thread_has_human_issue_and_fix_context\nOutcome: claimed_resolved_unverified\nComment count: 2\nLinked commit count: 2\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 15\nLabels: {'deployment_env_gap': 2}\nPolarities: {'bad': 2}\nChanged file labels: {'docs_or_claims': 1, 'api_or_backend': 1, 'source_or_other': 3, 'dependency_or_build': 2, 'ui_or_frontend': 7, 'test_or_ci': 1}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-006b06d876f2c35f\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"deployment_env_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/vitaomf/horus-rj/pull/1\",\n    \"text\": \"GitHub feedback: deployment_env_gap\\nPolarity: bad\\nKind: pull_request_body\\nRepo: vitaomf/horus-rj\\nAuthor: vitaomf (User)\\nURL: https://github.com/vitaomf/horus-rj/pull/1\\nTitle: Beta completo: dossie politico, cruzamento, cards de emendas, refatoracao\\nBody:\\nSessoes beta completas com hardening, refatoracao, dossie politico e cruzamento investigativo. Todas as melhorias estao listadas nos commits. Vercel auto-build pode falhar porque detecta FastAPI no root - o deploy real usa o subdir vercel-proxy/ ja em producao em horus-rj.vercel.app.\"\n  },\n  {\n    \"id\": \"github-feedback-comment-c4a818c1a58274a2\",\n    \"kind\": \"issue_comment\",\n    \"label\": \"deployment_env_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/vitaomf/horus-rj/pull/1#issuecomment-4407872295\",\n    \"text\": \"GitHub feedback: deployment_env_gap\\nPolarity: bad\\nKind: issue_comment\\nRepo: vitaomf/horus-rj\\nAuthor: vercel[bot] (Bot)\\nURL: https://github.com/vitaomf/horus-rj/pull/1#issuecomment-4407872295\\nTitle: \\nBody:\\n[vc]: #v0ciLxPjqydW6+Z3vM7KNoQHn8o24vr5d1MYTslOsCA=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJob3J1cy1yaiIsInByb2plY3RJZCI6InByal9PV0xIeENUa0ZCSEhvckppclRJaENZZ1NkZUJ4IiwibGl2ZUZlZWRiYWNrIjp7InJlc29sdmVkIjowLCJ1bnJlc29sdmVkIjowLCJ0b3RhbCI6MCwibGluayI6IiJ9LCJpbnNwZWN0b3JVcmwiOiJodHRwczovL3ZlcmNlbC5jb20vdml0YW9tZnMtcHJvamVjdHMvaG9ydXMtcmovcDFqTnIydVFhd0puS21YN2dmRlY4a2JVcFlxSCIsInByZXZpZXdVcmwiOiIiLCJuZXh0Q29tbWl0U3RhdHVzIjoiRkFJTEVEIiwicm9vdERpcmVjdG9yeSI6bnVsbH1dfQ==\\nThe latest updates on your projects. Learn more about [Vercel for GitHub](https://vercel.link/github-learn-more).\\n\\n| Project | Deployment | Actions | Updated (UTC) |\\n| :--- | :----- | :------ | :------ |\\n| [horus-rj](https://vercel.com/vitaomfs-projects/horus-rj) | ![Error](https://vercel.com/static/status/\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/vitaomf/horus-rj", "source_id": "comment-chain-pattern-assumption_checks-5285f7b5561826ab", "synthetic": false, "gold_label": "", "graph_label": "source_backed_multi_signal_graph", "source_path": "/data/distillate/foundry_data/comment_chain_patterns/assumption_checks/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "vitaomf/horus-rj", "source_dataset": "comment_chain_patterns/assumption_checks", "training_usage": "weak_supervision"}}}, {"ruleId": "foundry_auth_guardrail_gap", "level": "error", "message": {"text": "Foundry mined security auth guardrail gaps: vitaomf/horus-rj"}, "properties": {"repobilityId": 415029, "scanner": "foundry_dataset", "fingerprint": "0771b3789a63c8b8918a705714ae59b9a92c806056808bf70b70a33404f6f088", "category": "auth", "severity": "critical", "confidence": 0.78, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Security/auth changes without enough guardrails", "intent": "Assumption-check security/auth examples requiring stronger tests or CI.", "labels": {"bug_fix": 5, "docs_or_claims": 1, "ui_or_frontend": 1, "source_or_other": 3, "deployment_env_gap": 1, "security_auth_secret": 1, "claimed_resolved_unverified": 3, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 1, "human_reported_issue_no_linked_fix": 1, "human_reported_issue_then_fix_attempt": 1, "thread_has_human_issue_and_fix_context": 2}, "source": "graph_query_export", "motif_id": "security_auth_without_guardrails", "outcomes": {"claimed_resolved_unverified": 6, "not_resolved_or_not_observed": 2}, "polarity": "bad", "query_id": "security_auth_guardrail_gaps", "severity": "critical", "ci_labels": {}, "synthetic": false, "edge_count": 41, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 2, "thread_touches_file": 5, "chain_has_link_quality": 4, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 5, "thread_has_comment_chain": 2, "comment_chain_links_commit": 5, "comment_chain_touches_file": 10, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 2}, "node_count": 22, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 2, "pr_file": 5, "fix_outcome": 1, "issue_chain": 1, "link_quality": 4, "comment_chain": 2}, "query_type": "motif_query", "thread_key": "vitaomf/horus-rj#3", "issue_number": "3", "quality_tiers": {"unresolved": 1, "weak_supervision": 3}, "repo_full_name": "vitaomf/horus-rj", "training_usage": "assumption_check", "source_motif_id": "graph-pattern-motif-thread-4a6913156e57fba4", "graph_gold_label": "weak_supervision_needs_review", "changed_file_labels": {"docs_or_claims": 5, "ui_or_frontend": 5, "source_or_other": 15}}, "text": "Graph query export: Security/auth changes without enough guardrails\nQuery id: security_auth_guardrail_gaps\nQuery type: motif_query\nIntent: Assumption-check security/auth examples requiring stronger tests or CI.\nMotif: security_auth_without_guardrails\nTraining usage: assumption_check\nGraph gold label: weak_supervision_needs_review\nRepo: vitaomf/horus-rj\nThread: vitaomf/horus-rj#3\nEvidence:\nGraph motif: Security/auth change without enough guardrails\nMotif id: security_auth_without_guardrails\nPolarity: bad\nTraining usage: assumption_check\nSeverity: critical\nRepo: vitaomf/horus-rj\nThread: vitaomf/horus-rj#3\nGraph gold label: weak_supervision_needs_review\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: vitaomf/horus-rj#3\nRepo: vitaomf/horus-rj\nIssue/PR number: 3\nGraph consistency label: weak_supervision_needs_review\nNodes: 22\nEdges: 41\nNode types: {'pr_file': 5, 'commit': 5, 'link_quality': 4, 'comment': 2, 'comment_chain': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'comment_chain_touches_file': 10, 'thread_touches_file': 5, 'comment_chain_links_commit': 5, 'issue_chain_touches_file': 5, 'chain_has_link_quality': 4, 'thread_has_comment': 2, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'issue_chain_has_comment_chain': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'bug_fix': 5, 'source_or_other': 3, 'claimed_resolved_unverified': 3, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'security_auth_secret': 1, 'deployment_env_gap': 1, 'docs_or_claims': 1, 'ui_or_frontend': 1, 'human_reported_issue_then_fix_attempt': 1, 'human_reported_issue_no_linked_fix': 1, 'not_resolved_or_not_observed': 1}\nOutcomes: {'claimed_resolved_unverified': 6, 'not_resolved_or_not_observed': 2}\nQuality tiers: {'weak_supervision': 3, 'unresolved': 1}\nCI labels: {}\nCurriculum targets:\n- Train auth boundary repair with tests, permission matrices, and secret-handling checks.\n- Keep risky auth changes separate from ordinary bug-fix examples.\nAssumption checks:\n- Are auth/permission paths covered by tests?\n- Are secrets, CORS, or access rules verified rather than summarized?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/vitaomf/horus-rj", "source_id": "graph-query-motif_query-850a519fba0f6181", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/security_auth_guardrail_gaps/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "vitaomf/horus-rj", "source_dataset": "graph_queries/security_auth_guardrail_gaps", "training_usage": "assumption_check"}}}, {"ruleId": "foundry_auth_guardrail_gap", "level": "error", "message": {"text": "Foundry mined security auth guardrail gaps: vitaomf/horus-rj"}, "properties": {"repobilityId": 415028, "scanner": "foundry_dataset", "fingerprint": "4e3615c97998aa6f15d37700a5541d8ab3e1cc93f9a7a5aed34fd7ae609eb2df", "category": "auth", "severity": "critical", "confidence": 0.78, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Security/auth changes without enough guardrails", "intent": "Assumption-check security/auth examples requiring stronger tests or CI.", "labels": {"bug_fix": 3, "source_or_other": 5, "deployment_env_gap": 1, "generated_provenance": 2, "security_auth_secret": 1, "claimed_resolved_unverified": 4, "issue_or_pull_request_thread": 1, "human_reported_issue_then_fix_attempt": 2, "thread_has_human_issue_and_fix_context": 2}, "source": "graph_query_export", "motif_id": "security_auth_without_guardrails", "outcomes": {"claimed_resolved_unverified": 8}, "polarity": "bad", "query_id": "security_auth_guardrail_gaps", "severity": "critical", "ci_labels": {}, "synthetic": false, "edge_count": 44, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 2, "thread_has_comment": 2, "thread_touches_file": 5, "chain_has_link_quality": 4, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 5, "thread_has_comment_chain": 2, "comment_chain_links_commit": 8, "comment_chain_touches_file": 10, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 2}, "node_count": 22, "node_types": {"repo": 1, "commit": 5, "thread": 1, "comment": 2, "pr_file": 5, "fix_outcome": 1, "issue_chain": 1, "link_quality": 4, "comment_chain": 2}, "query_type": "motif_query", "thread_key": "vitaomf/horus-rj#2", "issue_number": "2", "quality_tiers": {"weak_supervision": 4}, "repo_full_name": "vitaomf/horus-rj", "training_usage": "assumption_check", "source_motif_id": "graph-pattern-motif-thread-74b77b30640243ee", "graph_gold_label": "weak_supervision_needs_review", "changed_file_labels": {"source_or_other": 25}}, "text": "Graph query export: Security/auth changes without enough guardrails\nQuery id: security_auth_guardrail_gaps\nQuery type: motif_query\nIntent: Assumption-check security/auth examples requiring stronger tests or CI.\nMotif: security_auth_without_guardrails\nTraining usage: assumption_check\nGraph gold label: weak_supervision_needs_review\nRepo: vitaomf/horus-rj\nThread: vitaomf/horus-rj#2\nEvidence:\nGraph motif: Security/auth change without enough guardrails\nMotif id: security_auth_without_guardrails\nPolarity: bad\nTraining usage: assumption_check\nSeverity: critical\nRepo: vitaomf/horus-rj\nThread: vitaomf/horus-rj#2\nGraph gold label: weak_supervision_needs_review\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: vitaomf/horus-rj#2\nRepo: vitaomf/horus-rj\nIssue/PR number: 2\nGraph consistency label: weak_supervision_needs_review\nNodes: 22\nEdges: 44\nNode types: {'pr_file': 5, 'commit': 5, 'link_quality': 4, 'comment': 2, 'comment_chain': 2, 'thread': 1, 'repo': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'comment_chain_touches_file': 10, 'comment_chain_links_commit': 8, 'thread_touches_file': 5, 'issue_chain_touches_file': 5, 'chain_has_link_quality': 4, 'thread_has_comment': 2, 'thread_has_comment_chain': 2, 'comment_has_chain': 2, 'issue_chain_has_comment_chain': 2, 'repo_has_thread': 1, 'thread_has_issue_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'source_or_other': 5, 'claimed_resolved_unverified': 4, 'bug_fix': 3, 'human_reported_issue_then_fix_attempt': 2, 'generated_provenance': 2, 'thread_has_human_issue_and_fix_context': 2, 'issue_or_pull_request_thread': 1, 'security_auth_secret': 1, 'deployment_env_gap': 1}\nOutcomes: {'claimed_resolved_unverified': 8}\nQuality tiers: {'weak_supervision': 4}\nCI labels: {}\nCurriculum targets:\n- Train auth boundary repair with tests, permission matrices, and secret-handling checks.\n- Keep risky auth changes separate from ordinary bug-fix examples.\nAssumption checks:\n- Are auth/permission paths covered by tests?\n- Are secrets, CORS, or access rules verified rather than summarized?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/vitaomf/horus-rj", "source_id": "graph-query-motif_query-308993e68bb42d00", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/security_auth_guardrail_gaps/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "vitaomf/horus-rj", "source_dataset": "graph_queries/security_auth_guardrail_gaps", "training_usage": "assumption_check"}}}, {"ruleId": "scanner-d7a1ee7a85cb0ed5", "level": "note", "message": {"text": "Possibly dead Python function: coletar_ano_api"}, "properties": {"repobilityId": "1995b9187a1822e8", "scanner": "scanner-primary", "fingerprint": "d7a1ee7a85cb0ed5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "coleta_emendas.py:255"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6599b83c37def82a", "level": "note", "message": {"text": "Possibly dead Python function: probe"}, "properties": {"repobilityId": "90ebf24a9b031ee2", "scanner": "scanner-primary", "fingerprint": "6599b83c37def82a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/varre_sapl.py:55"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6590e9d55d9c17d9", "level": "note", "message": {"text": "Possibly dead Python function: coletar_ano_api"}, "properties": {"repobilityId": "1995b9187a1822e8", "scanner": "scanner-primary", "fingerprint": "6590e9d55d9c17d9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/worktrees/bold-lichterman-5ba06f/coleta_emendas.py:201"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a6feac2f812f47af", "level": "note", "message": {"text": "Possibly dead Python function: fetch_and_update"}, "properties": {"repobilityId": "8fe7b8ac133b2d32", "scanner": "scanner-primary", "fingerprint": "a6feac2f812f47af", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/worktrees/bold-lichterman-5ba06f/scripts/legacy/fix_politico_id.py:24"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ea04454c615435ce", "level": "note", "message": {"text": "Possibly dead Python function: coletar_contratos"}, "properties": {"repobilityId": "cc4fd9e921be8ec7", "scanner": "scanner-primary", "fingerprint": "ea04454c615435ce", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/worktrees/bold-lichterman-5ba06f/scheduler/scheduler.py:77"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0a7baea03ff1cc33", "level": "note", "message": {"text": "Possibly dead Python function: coletar_tse"}, "properties": {"repobilityId": "cc904cf608539eb8", "scanner": "scanner-primary", "fingerprint": "0a7baea03ff1cc33", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/worktrees/bold-lichterman-5ba06f/scheduler/scheduler.py:80"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f34cae470648cddc", "level": "note", "message": {"text": "Possibly dead Python function: coletar_contratos"}, "properties": {"repobilityId": "cc4fd9e921be8ec7", "scanner": "scanner-primary", "fingerprint": "f34cae470648cddc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scheduler/scheduler.py:80"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bab65dd1a20c5b36", "level": "note", "message": {"text": "Possibly dead Python function: coletar_tse"}, "properties": {"repobilityId": "cc904cf608539eb8", "scanner": "scanner-primary", "fingerprint": "bab65dd1a20c5b36", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scheduler/scheduler.py:83"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6381c2736c5612f3", "level": "note", "message": {"text": "Possibly dead Python function: coletar_votacoes_camara"}, "properties": {"repobilityId": "8bbe4f994ee76696", "scanner": "scanner-primary", "fingerprint": "6381c2736c5612f3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scheduler/scheduler.py:86"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-18cf57d10507e426", "level": "note", "message": {"text": "Possibly dead Python function: backup_banco"}, "properties": {"repobilityId": "63892f3ea1dfef92", "scanner": "scanner-primary", "fingerprint": "18cf57d10507e426", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scheduler/scheduler.py:92"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-07479cdb34db7961", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PainelIndices.tsx:109"}, "properties": {"repobilityId": "a606e3f9a8e41ac5", "scanner": "scanner-primary", "fingerprint": "07479cdb34db7961", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7dbd999a1ff8c597", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/FeedbackButton.tsx:246"}, "properties": {"repobilityId": "a9c361df13c1ed10", "scanner": "scanner-primary", "fingerprint": "7dbd999a1ff8c597", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a332356e5d9e967c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PainelCamara.tsx:151"}, "properties": {"repobilityId": "db0feef1b83c8e09", "scanner": "scanner-primary", "fingerprint": "a332356e5d9e967c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dcbd940056ca9fc0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/FavoritosPanel.tsx:16"}, "properties": {"repobilityId": "5ac12bf7403368c6", "scanner": "scanner-primary", "fingerprint": "dcbd940056ca9fc0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-72df060c7f382ed2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/PainelFluxo.tsx:75"}, "properties": {"repobilityId": "c9c62bbdaf499713", "scanner": "scanner-primary", "fingerprint": "72df060c7f382ed2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7706f02514387197", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/SearchBar.tsx:316"}, "properties": {"repobilityId": "d9fd84e2e801b24d", "scanner": "scanner-primary", "fingerprint": "7706f02514387197", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9ce47549e64ddf4a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/perfil/base/PerfilBaseEleitoral.tsx:62"}, "properties": {"repobilityId": "06fce79714117136", "scanner": "scanner-primary", "fingerprint": "9ce47549e64ddf4a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eae1be6906244830", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/perfil/base/PerfilStat.tsx:27"}, "properties": {"repobilityId": "dcb9ad61bce9eb15", "scanner": "scanner-primary", "fingerprint": "eae1be6906244830", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4ecb83fbc20e62c9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/perfil/blocos/BlocoEquipe.tsx:51"}, "properties": {"repobilityId": "1dc895224435b51f", "scanner": "scanner-primary", "fingerprint": "4ecb83fbc20e62c9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4805ed3083647c2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/perfil/blocos/BlocoVetosDecretos.tsx:64"}, "properties": {"repobilityId": "399d2ccca00c33ea", "scanner": "scanner-primary", "fingerprint": "d4805ed3083647c2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d7768de3c0b1e916", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/perfil/blocos/BlocoProjetosLegislativos.tsx:69"}, "properties": {"repobilityId": "f8baa76ae1155a62", "scanner": "scanner-primary", "fingerprint": "d7768de3c0b1e916", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-19895f0a52ce0a95", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/perfil/blocos/BlocoEmendas.tsx:60"}, "properties": {"repobilityId": "177c09168542c178", "scanner": "scanner-primary", "fingerprint": "19895f0a52ce0a95", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d268db7ac8e20b68", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/CompararPage.tsx:119"}, "properties": {"repobilityId": "cabbb082bbe31b9a", "scanner": "scanner-primary", "fingerprint": "d268db7ac8e20b68", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f801f203764eb472", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/HomePage.tsx:139"}, "properties": {"repobilityId": "d82ac598b425c3e0", "scanner": "scanner-primary", "fingerprint": "f801f203764eb472", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ac1430477ce84e85", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/BuscaAvancadaPage.tsx:226"}, "properties": {"repobilityId": "9aead2808d0b07c4", "scanner": "scanner-primary", "fingerprint": "ac1430477ce84e85", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b28de8711e97bb67", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/EstadoPage.tsx:313"}, "properties": {"repobilityId": "3fc5b99cda161637", "scanner": "scanner-primary", "fingerprint": "b28de8711e97bb67", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-df00c9b84693f8f2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/RankingMunicipiosPage.tsx:181"}, "properties": {"repobilityId": "3b1adcbf244adb7c", "scanner": "scanner-primary", "fingerprint": "df00c9b84693f8f2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d21eb9bd76d1b79b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/PoliticoPage.tsx:723"}, "properties": {"repobilityId": "fbb08f3433d0263c", "scanner": "scanner-primary", "fingerprint": "d21eb9bd76d1b79b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-80ab34acfb12ba5d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/EstatisticasPage.tsx:344"}, "properties": {"repobilityId": "0238c325e0da5d45", "scanner": "scanner-primary", "fingerprint": "80ab34acfb12ba5d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b4ecfe2acda209f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ParlamentaresListPage.tsx:195"}, "properties": {"repobilityId": "6ad213f0a9936f8a", "scanner": "scanner-primary", "fingerprint": "b4ecfe2acda209f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d1f9c0c44f31cd1f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/static-server.js:53"}, "properties": {"repobilityId": "7d061d15ad88c5db", "scanner": "scanner-primary", "fingerprint": "d1f9c0c44f31cd1f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2d6c5d780b9e4f08", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/HomePage.tsx:172"}, "properties": {"repobilityId": "4bb4e9bfbdd882e2", "scanner": "scanner-primary", "fingerprint": "2d6c5d780b9e4f08", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0816664579ec4766", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/BuscaAvancadaPage.tsx:291"}, "properties": {"repobilityId": "b20be4dc0d712acc", "scanner": "scanner-primary", "fingerprint": "0816664579ec4766", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4577852989958f6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/MunicipiosListPage.tsx:134"}, "properties": {"repobilityId": "21c21f4ff380cf3b", "scanner": "scanner-primary", "fingerprint": "f4577852989958f6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-521ddfa5e75b0547", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/PoliticosListPage.tsx:166"}, "properties": {"repobilityId": "be5b900433052bca", "scanner": "scanner-primary", "fingerprint": "521ddfa5e75b0547", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1efe44779ad38324", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/PoliticoPage.tsx:579"}, "properties": {"repobilityId": "21d3176181399fcd", "scanner": "scanner-primary", "fingerprint": "1efe44779ad38324", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d1570938f77f7b79", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/EstatisticasPage.tsx:255"}, "properties": {"repobilityId": "309bada63e58e982", "scanner": "scanner-primary", "fingerprint": "d1570938f77f7b79", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7a3eb5e344ea8f21", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/worktrees/bold-lichterman-5ba06f/.claude/static-server.js:53"}, "properties": {"repobilityId": "0ded4d01ba195318", "scanner": "scanner-primary", "fingerprint": "7a3eb5e344ea8f21", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d63da3583b14afc0", "level": "warning", "message": {"text": "Dockerfile runs as root: Dockerfile"}, "properties": {"repobilityId": "a2ed1bd120e507db", "scanner": "scanner-primary", "fingerprint": "d63da3583b14afc0", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-a35c6a00f751880f", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-slim"}, "properties": {"repobilityId": "4ce879d01f3cd059", "scanner": "scanner-primary", "fingerprint": "a35c6a00f751880f", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-e066691601852931", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "properties": {"repobilityId": "8e72531032bc5a08", "scanner": "scanner-primary", "fingerprint": "e066691601852931", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-1becb1b25c7057c6", "level": "warning", "message": {"text": "Dockerfile runs as root: .claude/worktrees/bold-lichterman-5ba06f/Dockerfile"}, "properties": {"repobilityId": "11788e152798ddaa", "scanner": "scanner-primary", "fingerprint": "1becb1b25c7057c6", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-12d1cf9c1df54ea2", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-slim"}, "properties": {"repobilityId": "47a7fb3a873d06a1", "scanner": "scanner-primary", "fingerprint": "12d1cf9c1df54ea2", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/worktrees/bold-lichterman-5ba06f/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-9befc2603bee2945", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.11-slim"}, "properties": {"repobilityId": "838bf7bbd4b84841", "scanner": "scanner-primary", "fingerprint": "9befc2603bee2945", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/worktrees/bold-lichterman-5ba06f/Dockerfile"}, "region": {"startLine": 10}}}]}, {"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-d8afe128362ce0d0", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in CLAUDE.md:152"}, "properties": {"repobilityId": "357ad155aeba7b11", "scanner": "scanner-primary", "fingerprint": "d8afe128362ce0d0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 152}}}]}, {"ruleId": "scanner-106ce4299ec3aff5", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in .claude/static-server.js:44"}, "properties": {"repobilityId": "852403d029901f04", "scanner": "scanner-primary", "fingerprint": "106ce4299ec3aff5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/static-server.js"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-c2caf559805b859d", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in .claude/worktrees/bold-lichterman-5ba06f/CLAUDE.md:89"}, "properties": {"repobilityId": "98d4879541e5aefb", "scanner": "scanner-primary", "fingerprint": "c2caf559805b859d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/worktrees/bold-lichterman-5ba06f/CLAUDE.md"}, "region": {"startLine": 89}}}]}, {"ruleId": "scanner-b636359d52a2f80e", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in .claude/worktrees/bold-lichterman-5ba06f/.claude/static-server.js:44"}, "properties": {"repobilityId": "1e71d42ecdf468c4", "scanner": "scanner-primary", "fingerprint": "b636359d52a2f80e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/worktrees/bold-lichterman-5ba06f/.claude/static-server.js"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-8c713c44c9ed6de2", "level": "note", "message": {"text": "Very large file: frontend/src/pages/PoliticoPage.tsx (2065 lines)"}, "properties": {"repobilityId": "1bc58704038c06af", "scanner": "scanner-primary", "fingerprint": "8c713c44c9ed6de2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-dcad618f12170b80", "level": "note", "message": {"text": "Very large file: .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/PoliticoPage.tsx (1047 lines)"}, "properties": {"repobilityId": "2577c588a49941b1", "scanner": "scanner-primary", "fingerprint": "dcad618f12170b80", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-34d02c7610dfcfa9", "level": "note", "message": {"text": "Very large file: backend/api.py (3944 lines)"}, "properties": {"repobilityId": "88bade38451fcd93", "scanner": "scanner-primary", "fingerprint": "34d02c7610dfcfa9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "fbed10c28b33dd6c", "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": "0e53e2fee1b1034a", "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": "bbf6ca8a2273b026", "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": "67ed33a0bddbddc0", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "b7622888319b9404", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "f69b427ccec61997", "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": "75f964972cbd2182", "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": "8b7d1d3691cc4cf9", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-ecb0d2c55ed6875d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.local.json"}, "properties": {"repobilityId": "d8bae33a6d517bf0", "scanner": "scanner-primary", "fingerprint": "ecb0d2c55ed6875d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.local.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0a3d2fec8945f0ad", "level": "note", "message": {"text": "Legacy-named symbol `transparencia_rj_backup` in rebuild_db.py:6"}, "properties": {"repobilityId": "e6f300d23e997f44", "scanner": "scanner-primary", "fingerprint": "0a3d2fec8945f0ad", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-68bfa629f304f740", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 vercel-proxy/api/proxy.js:21"}, "properties": {"repobilityId": "c570de86febed4c1", "scanner": "scanner-primary", "fingerprint": "68bfa629f304f740", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2fda5d20d93943cc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/BuscaAvancadaPage.tsx:126"}, "properties": {"repobilityId": "336eb2594742ce82", "scanner": "scanner-primary", "fingerprint": "2fda5d20d93943cc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dac46484a1d48c96", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/PoliticosListPage.tsx:52"}, "properties": {"repobilityId": "3c96babcf9806589", "scanner": "scanner-primary", "fingerprint": "dac46484a1d48c96", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-62085beec3a2e261", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/pages/ParlamentaresListPage.tsx:93"}, "properties": {"repobilityId": "7c2ac2811251d733", "scanner": "scanner-primary", "fingerprint": "62085beec3a2e261", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ecf7633806176882", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/coleta_tse_estadual.py:134"}, "properties": {"repobilityId": "90941080c22b3188", "scanner": "scanner-primary", "fingerprint": "ecf7633806176882", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6f4035175ba061d2", "level": "note", "message": {"text": "Legacy-named symbol `rest_v1` in scripts/bio_wikipedia.py:7"}, "properties": {"repobilityId": "a80034113772ea81", "scanner": "scanner-primary", "fingerprint": "6f4035175ba061d2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-11d825a8de2b2743", "level": "note", "message": {"text": "Legacy-named symbol `rest_v1` in scripts/download_fotos_governadores.py:83"}, "properties": {"repobilityId": "b06d5f83c7baad58", "scanner": "scanner-primary", "fingerprint": "11d825a8de2b2743", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f8d54165fea8b1b4", "level": "note", "message": {"text": "Legacy-named symbol `transparencia_rj_backup` in .claude/worktrees/bold-lichterman-5ba06f/rebuild_db.py:6"}, "properties": {"repobilityId": "ee12299838cdf9e7", "scanner": "scanner-primary", "fingerprint": "f8d54165fea8b1b4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ab91bc2fdab70ee5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/worktrees/bold-lichterman-5ba06f/vercel-proxy/api/proxy.js:21"}, "properties": {"repobilityId": "358ba825e35cc15e", "scanner": "scanner-primary", "fingerprint": "ab91bc2fdab70ee5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8a1b613894e056e4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/BuscaAvancadaPage.tsx:123"}, "properties": {"repobilityId": "30802285353b31bf", "scanner": "scanner-primary", "fingerprint": "8a1b613894e056e4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7498640c8f781cd6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/PoliticosListPage.tsx:44"}, "properties": {"repobilityId": "5d21f8b760be16a7", "scanner": "scanner-primary", "fingerprint": "7498640c8f781cd6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cfc2f26602a14a17", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/PoliticoPage.tsx:168"}, "properties": {"repobilityId": "f0894d43474cc27f", "scanner": "scanner-primary", "fingerprint": "cfc2f26602a14a17", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5e3b956b32f4bcb1", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 .claude/worktrees/bold-lichterman-5ba06f/scripts/legacy/check_results.py:15"}, "properties": {"repobilityId": "baa1697417f28340", "scanner": "scanner-primary", "fingerprint": "5e3b956b32f4bcb1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-77a90b18fbf66f6e", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 .claude/worktrees/bold-lichterman-5ba06f/scripts/legacy/debug_portal_contratos.py:17"}, "properties": {"repobilityId": "80a7fd841d29a6f5", "scanner": "scanner-primary", "fingerprint": "77a90b18fbf66f6e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-19beb3465fddba36", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 .claude/worktrees/bold-lichterman-5ba06f/scripts/legacy/debug_json.py:5"}, "properties": {"repobilityId": "9ea424a7281a86df", "scanner": "scanner-primary", "fingerprint": "19beb3465fddba36", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d0fa5fab749e00f1", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 .claude/worktrees/bold-lichterman-5ba06f/scripts/legacy/debug_orgaos.py:10"}, "properties": {"repobilityId": "8f7901440f2680d4", "scanner": "scanner-primary", "fingerprint": "d0fa5fab749e00f1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f12b35caeece7fdc", "level": "note", "message": {"text": "Legacy-named symbol `rest_v1` in backend/api.py:2768"}, "properties": {"repobilityId": "a1ab433933e69385", "scanner": "scanner-primary", "fingerprint": "f12b35caeece7fdc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a1dd3738ec5ca90a", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/api.py:78"}, "properties": {"repobilityId": "936a6c40732b2ea2", "scanner": "scanner-primary", "fingerprint": "a1dd3738ec5ca90a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "06fddb4ecd01929c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "727fc9082dc29395", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "f11d2e4b4321b195", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "2e2d4db37a9b74c3", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "e533d55dfe57bc20", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "37790c9e53e5b57f", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "15cec6f62811bc2d", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "15154f6be0c02b87", "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": "20ebb450deca8f77", "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": "35c7ccccdd0c68f4", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "c288141f0f5302ad", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "98500fa687c5fcf7", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "f4181a2737d55a36", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "628007b35192faf3", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "31a369b9664509df", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "37f81e8a53818533", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "f61265d48e254268", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "384ff65a9734a91a", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "1a9ef86b4365f5d4", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "2f7706c403e4eaba", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-a448968251202297", "level": "warning", "message": {"text": "Frontend route `/regiao/:slugRegiao` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "7d7f5b69afdbc4a8", "scanner": "scanner-primary", "fingerprint": "a448968251202297", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f2eb2a75488911a0", "level": "warning", "message": {"text": "Frontend route `/estado/:uf` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "3c9a6d571e5ae241", "scanner": "scanner-primary", "fingerprint": "f2eb2a75488911a0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-531041e9edb12f5d", "level": "warning", "message": {"text": "Frontend route `/rj` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "bf30760409ecd2a5", "scanner": "scanner-primary", "fingerprint": "531041e9edb12f5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-812ef60019ef714c", "level": "warning", "message": {"text": "Frontend route `/municipios` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "307efb994e74c515", "scanner": "scanner-primary", "fingerprint": "812ef60019ef714c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cb7c6cb0b61341a6", "level": "warning", "message": {"text": "Frontend route `/municipios/:nome` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "f23a2082a277d920", "scanner": "scanner-primary", "fingerprint": "cb7c6cb0b61341a6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-248f5a8917a370a8", "level": "warning", "message": {"text": "Frontend route `/politicos/:id` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "a85b2b815492f041", "scanner": "scanner-primary", "fingerprint": "248f5a8917a370a8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d46b644710991e42", "level": "error", "message": {"text": "FastAPI POST `enviar_feedback` without auth dependency \u2014 backend/api.py:3368"}, "properties": {"repobilityId": "bf408aac0d92b3b4", "scanner": "scanner-primary", "fingerprint": "d46b644710991e42", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/api.py"}, "region": {"startLine": 3368}}}]}, {"ruleId": "scanner-c9d7449c522752d0", "level": "error", "message": {"text": "Dangling fetch: GET /geo/brazil-states.topojson (frontend/src/components/MapaBrasil.tsx:39)"}, "properties": {"repobilityId": "5f5a2e1d4e8e45f8", "scanner": "scanner-primary", "fingerprint": "c9d7449c522752d0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-551493be7c74db96", "level": "error", "message": {"text": "Dangling fetch: GET /geo/brazil-states.topojson (frontend/src/components/MapaAtuacaoParlamentar.tsx:139)"}, "properties": {"repobilityId": "80b171c7e891baf3", "scanner": "scanner-primary", "fingerprint": "551493be7c74db96", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-038dbcef946f4ba6", "level": "error", "message": {"text": "Dangling fetch: GET /geo/mun/${view.uf.toLowerCase()}.json (frontend/src/components/MapaAtuacaoParlamentar.tsx:158)"}, "properties": {"repobilityId": "73a58f41f7f2f6f5", "scanner": "scanner-primary", "fingerprint": "038dbcef946f4ba6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-34dc7f4a7fc3f155", "level": "error", "message": {"text": "Dangling fetch: GET /municipios-rj.json (.claude/worktrees/bold-lichterman-5ba06f/frontend/src/components/MapaRJ.tsx:85)"}, "properties": {"repobilityId": "3a0873ee48e76778", "scanner": "scanner-primary", "fingerprint": "34dc7f4a7fc3f155", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b06a1bdc8cc511ae", "level": "error", "message": {"text": "Dangling fetch: GET https://dadosabertos.camara.leg.br/api/v2/deputados?nome=${encodeURIComponent(data.nome)}&itens=5 (.claude/worktrees/bold-lichterman-5ba06f/frontend/src/pages/PoliticoPage.tsx:168)"}, "properties": {"repobilityId": "c4a590da951300c3", "scanner": "scanner-primary", "fingerprint": "b06a1bdc8cc511ae", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1558ac6d4d428f3f", "level": "note", "message": {"text": "Unused endpoint: GET /api/municipios/heatmap"}, "properties": {"repobilityId": "baf355b93d10ce2c", "scanner": "scanner-primary", "fingerprint": "1558ac6d4d428f3f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3f0a09ee78a8e983", "level": "note", "message": {"text": "Unused endpoint: GET /api/emendas/busca"}, "properties": {"repobilityId": "a8aeefbb7a1c0ae0", "scanner": "scanner-primary", "fingerprint": "3f0a09ee78a8e983", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7e7d1b2dc3dd0043", "level": "note", "message": {"text": "Unused endpoint: GET /api/municipios"}, "properties": {"repobilityId": "1f6e95fa03c897c7", "scanner": "scanner-primary", "fingerprint": "7e7d1b2dc3dd0043", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-407138673d6812f7", "level": "note", "message": {"text": "Unused endpoint: GET /api/municipios/{municipio_id}/problemas"}, "properties": {"repobilityId": "bc8848cb4a3e6c88", "scanner": "scanner-primary", "fingerprint": "407138673d6812f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6fbba0b6146a7808", "level": "note", "message": {"text": "Unused endpoint: GET /api/municipios/{municipio_id}/emendas"}, "properties": {"repobilityId": "74c1023b84c6c4f8", "scanner": "scanner-primary", "fingerprint": "6fbba0b6146a7808", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2f43e00eab115971", "level": "note", "message": {"text": "Unused endpoint: GET /api/emendas/total"}, "properties": {"repobilityId": "caf3bd3feae882e9", "scanner": "scanner-primary", "fingerprint": "2f43e00eab115971", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d778b4e6bce3188e", "level": "note", "message": {"text": "Unused endpoint: GET /api/politicos/total"}, "properties": {"repobilityId": "82a200576b87c13f", "scanner": "scanner-primary", "fingerprint": "d778b4e6bce3188e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ed0ab998ae2061d9", "level": "note", "message": {"text": "Unused endpoint: GET /api/politicos"}, "properties": {"repobilityId": "06b30289c47cf8c7", "scanner": "scanner-primary", "fingerprint": "ed0ab998ae2061d9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fc71c8e1901cb2a0", "level": "note", "message": {"text": "Unused endpoint: GET /api/politicos/busca"}, "properties": {"repobilityId": "deea65eeff49d2f2", "scanner": "scanner-primary", "fingerprint": "fc71c8e1901cb2a0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d1c69ff89c57b366", "level": "note", "message": {"text": "Unused endpoint: GET /api/municipios/{nome}/detalhes"}, "properties": {"repobilityId": "2aa3dfbb68f1ac8a", "scanner": "scanner-primary", "fingerprint": "d1c69ff89c57b366", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7f8252dffad31d95", "level": "note", "message": {"text": "Unused endpoint: GET /api/municipios/{nome}/contratos"}, "properties": {"repobilityId": "45ad7e6d96082cc9", "scanner": "scanner-primary", "fingerprint": "7f8252dffad31d95", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-878189ebd5e59ced", "level": "note", "message": {"text": "Unused endpoint: GET /api/politicos/{politico_id}"}, "properties": {"repobilityId": "a96dc0e03ca3d554", "scanner": "scanner-primary", "fingerprint": "878189ebd5e59ced", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-81b430118bcb05cf", "level": "note", "message": {"text": "Unused endpoint: GET /api/estatisticas"}, "properties": {"repobilityId": "91d9b785c95b3bc5", "scanner": "scanner-primary", "fingerprint": "81b430118bcb05cf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7ad1f29b005c9caf", "level": "note", "message": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/cruzamento"}, "properties": {"repobilityId": "de82f2a3d7571ace", "scanner": "scanner-primary", "fingerprint": "7ad1f29b005c9caf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4756b4c4da7d2088", "level": "note", "message": {"text": "Unused endpoint: GET /api/health"}, "properties": {"repobilityId": "cf38a184e903525f", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-49511ad17dbba029", "level": "note", "message": {"text": "Unused endpoint: GET /{rest_of_path:path}"}, "properties": {"repobilityId": "e2e830f322ce469c", "scanner": "scanner-primary", "fingerprint": "49511ad17dbba029", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7cdf9acef29a1e3c", "level": "note", "message": {"text": "Unused endpoint: GET /api/municipios/ranking"}, "properties": {"repobilityId": "3047eda9820f935c", "scanner": "scanner-primary", "fingerprint": "7cdf9acef29a1e3c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f6b3d7aedd89c65e", "level": "note", "message": {"text": "Unused endpoint: GET /api/estados/{uf}/stats"}, "properties": {"repobilityId": "8cdb3899a9111ec5", "scanner": "scanner-primary", "fingerprint": "f6b3d7aedd89c65e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bdc418a7a60904c3", "level": "note", "message": {"text": "Unused endpoint: GET /api/eleitos/estadual"}, "properties": {"repobilityId": "45a6ecd999bc3b02", "scanner": "scanner-primary", "fingerprint": "bdc418a7a60904c3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b2b249d3c0aaf7c0", "level": "note", "message": {"text": "Unused endpoint: GET /api/foto_tse/{kind}/{registro_id}"}, "properties": {"repobilityId": "78689b4090a51015", "scanner": "scanner-primary", "fingerprint": "b2b249d3c0aaf7c0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1259831261a2d341", "level": "note", "message": {"text": "Unused endpoint: GET /api/eleitos/municipal"}, "properties": {"repobilityId": "03b026bf21471c26", "scanner": "scanner-primary", "fingerprint": "1259831261a2d341", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9c3403520ddea667", "level": "note", "message": {"text": "Unused endpoint: GET /api/emendas/por_uf"}, "properties": {"repobilityId": "4b272637eeaff130", "scanner": "scanner-primary", "fingerprint": "9c3403520ddea667", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f3a5a976c4d0ffe9", "level": "note", "message": {"text": "Unused endpoint: GET /api/foto/{politico_id}"}, "properties": {"repobilityId": "024dd13b8c319e35", "scanner": "scanner-primary", "fingerprint": "f3a5a976c4d0ffe9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-23fd75ddad1ed7ab", "level": "note", "message": {"text": "Unused endpoint: GET /api/busca/global"}, "properties": {"repobilityId": "9bbe7ef4792319b2", "scanner": "scanner-primary", "fingerprint": "23fd75ddad1ed7ab", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a6a12aa5c0d30e06", "level": "note", "message": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/distribuicao"}, "properties": {"repobilityId": "c81277978314bdb4", "scanner": "scanner-primary", "fingerprint": "a6a12aa5c0d30e06", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a2c7e3ceaa9dd1e2", "level": "note", "message": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/distribuicao_municipios"}, "properties": {"repobilityId": "50d4ad2ba6dc5c9d", "scanner": "scanner-primary", "fingerprint": "a2c7e3ceaa9dd1e2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c5135acb5c5732d4", "level": "note", "message": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/perfil_tipo"}, "properties": {"repobilityId": "eb0a3982b2a45580", "scanner": "scanner-primary", "fingerprint": "c5135acb5c5732d4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5ada7df4735362a9", "level": "note", "message": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/trajetoria"}, "properties": {"repobilityId": "09d04b2b944c096e", "scanner": "scanner-primary", "fingerprint": "5ada7df4735362a9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-02d65458e7487d2e", "level": "note", "message": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/votos"}, "properties": {"repobilityId": "e269cac158e4c246", "scanner": "scanner-primary", "fingerprint": "02d65458e7487d2e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aa41f97ede69522e", "level": "note", "message": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/votacoes_nominais"}, "properties": {"repobilityId": "4899287d88babc84", "scanner": "scanner-primary", "fingerprint": "aa41f97ede69522e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a8171c09843c334a", "level": "note", "message": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/scorecard_legislativo"}, "properties": {"repobilityId": "5aa7b4db5c1496c7", "scanner": "scanner-primary", "fingerprint": "a8171c09843c334a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9ae3b06726753b75", "level": "note", "message": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/emendas"}, "properties": {"repobilityId": "5833aa5a57a15372", "scanner": "scanner-primary", "fingerprint": "9ae3b06726753b75", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4f2dd27c1924e201", "level": "note", "message": {"text": "Unused endpoint: GET /api/camara/atividade"}, "properties": {"repobilityId": "7147156e2fa8f39d", "scanner": "scanner-primary", "fingerprint": "4f2dd27c1924e201", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a6e2b55bf62983bd", "level": "note", "message": {"text": "Unused endpoint: GET /api/camara/bio"}, "properties": {"repobilityId": "8b1c6b1087336cd7", "scanner": "scanner-primary", "fingerprint": "a6e2b55bf62983bd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-92fb19eadb6ed532", "level": "note", "message": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/ranking"}, "properties": {"repobilityId": "d3848d2ecb8d4449", "scanner": "scanner-primary", "fingerprint": "92fb19eadb6ed532", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9c4d3f308674a472", "level": "note", "message": {"text": "Unused endpoint: GET /api/politicos/{politico_id}/wikipedia"}, "properties": {"repobilityId": "4f594df1b02acde0", "scanner": "scanner-primary", "fingerprint": "9c4d3f308674a472", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0c69f40fad38bd6c", "level": "note", "message": {"text": "Unused endpoint: GET /api/status/coleta"}, "properties": {"repobilityId": "7ab8af51ded032b8", "scanner": "scanner-primary", "fingerprint": "0c69f40fad38bd6c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d33003f20c14c4b3", "level": "note", "message": {"text": "Unused endpoint: GET /api/indices/municipio_por_nome"}, "properties": {"repobilityId": "b2d149feb9280783", "scanner": "scanner-primary", "fingerprint": "d33003f20c14c4b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6cfa6d677a55c018", "level": "note", "message": {"text": "Unused endpoint: GET /api/indices/{nivel}/{territorio_id}"}, "properties": {"repobilityId": "d3fea4722e5e8053", "scanner": "scanner-primary", "fingerprint": "6cfa6d677a55c018", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aaf1c7bb5937ff92", "level": "note", "message": {"text": "Unused endpoint: GET /api/inconsistencias"}, "properties": {"repobilityId": "db551934a503f2ac", "scanner": "scanner-primary", "fingerprint": "aaf1c7bb5937ff92", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8eef9255ce375627", "level": "note", "message": {"text": "Unused endpoint: POST /api/feedback"}, "properties": {"repobilityId": "125d8f6e7365787c", "scanner": "scanner-primary", "fingerprint": "8eef9255ce375627", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-48bb554d780882c9", "level": "note", "message": {"text": "Unused endpoint: GET /api/camara/agenda"}, "properties": {"repobilityId": "3f52af95e86502ed", "scanner": "scanner-primary", "fingerprint": "48bb554d780882c9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-261195abf076d5a7", "level": "note", "message": {"text": "Unused endpoint: GET /api/camara/votacoes-recentes"}, "properties": {"repobilityId": "14c05a8c1da871ea", "scanner": "scanner-primary", "fingerprint": "261195abf076d5a7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1afa3d7151508d0c", "level": "note", "message": {"text": "Unused endpoint: GET /api/camara/pauta/{evento_id}"}, "properties": {"repobilityId": "fd123a9df6e46bba", "scanner": "scanner-primary", "fingerprint": "1afa3d7151508d0c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-210ac955e9921275", "level": "note", "message": {"text": "Unused endpoint: GET /api/sapl/casas"}, "properties": {"repobilityId": "d982616129278fcc", "scanner": "scanner-primary", "fingerprint": "210ac955e9921275", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-81019b34cee48c75", "level": "note", "message": {"text": "Unused endpoint: GET /api/sapl/resolver"}, "properties": {"repobilityId": "c3def65391d7cc75", "scanner": "scanner-primary", "fingerprint": "81019b34cee48c75", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d89ae3247accf9d7", "level": "note", "message": {"text": "Unused endpoint: GET /api/sapl/{casa}/agenda"}, "properties": {"repobilityId": "22a8dab20eb03b3b", "scanner": "scanner-primary", "fingerprint": "d89ae3247accf9d7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a6e6ee91796f1fa5", "level": "note", "message": {"text": "Unused endpoint: GET /api/sapl/{casa}/materias"}, "properties": {"repobilityId": "c0e63430715c158e", "scanner": "scanner-primary", "fingerprint": "a6e6ee91796f1fa5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9c2dbb5f3242dbfd", "level": "note", "message": {"text": "Unused endpoint: GET /api/sapl/{casa}/votacoes"}, "properties": {"repobilityId": "9a561cecacf06202", "scanner": "scanner-primary", "fingerprint": "9c2dbb5f3242dbfd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6be7d288614a2bf4", "level": "note", "message": {"text": "Unused endpoint: GET /api/assembleia/casas"}, "properties": {"repobilityId": "9a2cabdc565752b4", "scanner": "scanner-primary", "fingerprint": "6be7d288614a2bf4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}