{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-7f48b32d7b928caf", "name": "Possibly dead Python function: tarefa", "shortDescription": {"text": "Possibly dead Python function: tarefa"}, "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-eab5e30fcb903d50", "name": "Possibly dead Python function: pct", "shortDescription": {"text": "Possibly dead Python function: pct"}, "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-05e6445bb41ac5c1", "name": "Possibly dead Python function: rank", "shortDescription": {"text": "Possibly dead Python function: rank"}, "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-bfb07735e7e4a6a3", "name": "Stray `console.log` in TS/JS \u2014 server.js:118", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server.js:118"}, "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-e10e366f29cf676d", "name": "Stray `console.log` in TS/JS \u2014 app/api/pipefy/route.ts:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/pipefy/route.ts:89"}, "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-467df0987746007d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/carteira-paralela/carteira-paralela-client.tsx:164", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/carteira-paralela/carteira-paralela-client.tsx:164"}, "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-59ae6714c6389901", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/dashboard/dashboard-client.tsx:62", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/dashboard/dashboard-client.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-a2e877885aa80994", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/visitas/visitas-client.tsx:144", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/visitas/visitas-client.tsx:144"}, "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-def4aa013dcf0648", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/analitico/funil-inquilinos/funil-inquilinos-client.tsx:12", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/analitico/funil-inquilinos/funil-inquilinos-client.tsx:129"}, "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-3c2086fa400cd356", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/analitico/funil/funil-client.tsx:208", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/analitico/funil/funil-client.tsx:208"}, "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-8ceea277d967b860", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/pregao/pregao-client.tsx:221", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/pregao/pregao-client.tsx:221"}, "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-35041a48396031ea", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/in-loco/in-loco-client.tsx:274", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/in-loco/in-loco-client.tsx:274"}, "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-1447964c9feedf2e", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/in-loco/revisar/revisar-client.tsx:144", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/in-loco/revisar/revisar-client.tsx:144"}, "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-bbf6be97fa421cdf", "name": "Icon-only button without accessible name \u2014 app/(app)/triagem/triagem-client.tsx:174", "shortDescription": {"text": "Icon-only button without accessible name \u2014 app/(app)/triagem/triagem-client.tsx:174"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-00fef7c98bbd5941", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/triagem/triagem-client.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/triagem/triagem-client.tsx:171"}, "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-ec62fcb23d3660bd", "name": "Icon-only button without accessible name \u2014 app/(app)/triagem/matricula-modal.tsx:115", "shortDescription": {"text": "Icon-only button without accessible name \u2014 app/(app)/triagem/matricula-modal.tsx:115"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-84b55363a4075ea7", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/triagem/matricula-modal.tsx:121", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/triagem/matricula-modal.tsx:121"}, "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-862cd1a486140031", "name": "Icon-only button without accessible name \u2014 app/(app)/scrapers/scrapers-client.tsx:75", "shortDescription": {"text": "Icon-only button without accessible name \u2014 app/(app)/scrapers/scrapers-client.tsx:75"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-289059a1f74147d2", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/scrapers/scrapers-client.tsx:189", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/scrapers/scrapers-client.tsx:189"}, "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-2d008f5155c9e470", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/relatorio/relatorio-client.tsx:197", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/relatorio/relatorio-client.tsx:197"}, "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-718bf8c54bf3783a", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/captacao/captacao-client.tsx:211", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/captacao/captacao-client.tsx:211"}, "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-00d728546b9f50b2", "name": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/geoportal/geoportal-client.tsx:155", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/geoportal/geoportal-client.tsx:155"}, "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-b4d403f6f81c496e", "name": "TODO/FIXME marker in shipping code \u2014 scripts/enriquecer_qualificacao.ts:112", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 scripts/enriquecer_qualificacao.ts:112"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ba973f144bc64f73", "name": "Stray `console.log` in TS/JS \u2014 scripts/enriquecer_qualificacao.ts:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/enriquecer_qualificacao.ts:89"}, "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-13469684aadc2d5f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/data-source-bar.tsx:37", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/data-source-bar.tsx:37"}, "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-a291974048c84a3b", "name": "`truncate` class without `title=` for hover reveal \u2014 components/topbar.tsx:108", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/topbar.tsx:108"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8ac6f821a002fe0b", "name": "`truncate` class without `title=` for hover reveal \u2014 components/navbar.tsx:322", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/navbar.tsx:322"}, "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-400d75c404c42d8f", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/stat-tile.tsx:24", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/stat-tile.tsx:24"}, "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-e78085d138e2717e", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ui/page-header.tsx:12", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/page-header.tsx:12"}, "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-ce551e90428a8a8e", "name": "Privileged port 14 in use", "shortDescription": {"text": "Privileged port 14 in use"}, "fullDescription": {"text": "Port 14 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f184902cbd4e7471", "name": "Insecure pattern 'node_child_process' in server.js:4", "shortDescription": {"text": "Insecure pattern 'node_child_process' in server.js:4"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a1b6204e675b40ec", "name": "Insecure pattern 'node_child_process' in app/api/pipefy/preencher/route.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in app/api/pipefy/preencher/route.ts:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dc61337420b59c8f", "name": "Insecure pattern 'node_child_process' in app/api/scrapers/run/route.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in app/api/scrapers/run/route.ts:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aa2190e4014cffc5", "name": "Very large file: app/(app)/triagem/triagem-client.tsx (1228 lines)", "shortDescription": {"text": "Very large file: app/(app)/triagem/triagem-client.tsx (1228 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": "2 test file(s) for 190 source file(s) (ratio 0.01). 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 190 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 38 placeholder/mock markers across 16 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a866736eaff9886f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server.js:186", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server.js:186"}, "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-7fb1833294da3e22", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/geocodificar/route.ts:12", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/geocodificar/route.ts:12"}, "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-36dac60bf9479f16", "name": "Commented-code block (5 lines) in app/api/cartorio/inbound/route.ts:10", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/cartorio/inbound/route.ts:10"}, "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-2e3970b95329eb66", "name": "Commented-code block (5 lines) in app/api/onus/inbound/route.ts:13", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/onus/inbound/route.ts:13"}, "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-3becb8c496e64e5e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/visitas/visitas-client.tsx:321", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/visitas/visitas-client.tsx:321"}, "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-486f55c4bf476f0c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/analitico/funil/funil-client.tsx:317", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/analitico/funil/funil-client.tsx:317"}, "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-f661ea19a393dbde", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/triagem/triagem-client.tsx:265", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/triagem/triagem-client.tsx:265"}, "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-694213ab5f62a8bf", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/sync_corretor_captacoes.py:211", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/sync_corretor_captacoes.py:211"}, "fullDescription": {"text": "`requests.post(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-eb8a4c9fc60e9a44", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/enriquecer_qualificacao.ts:51", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/enriquecer_qualificacao.ts:51"}, "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-e6244c4560d468d5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/_discover_onus_pipe.mjs:12", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/_discover_onus_pipe.mjs:12"}, "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-cb5f9822a72f1c62", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/pipefy_portal_fill.py:145", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/pipefy_portal_fill.py:145"}, "fullDescription": {"text": "`requests.post(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-73132cddc3c942e8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/_discover_oportunidades_fields.mjs:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/_discover_oportunidades_fields.mjs:9"}, "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-ad7695e79a6c2116", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/_register_pipefy_webhook.mjs:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/_register_pipefy_webhook.mjs:16"}, "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-baf78713b5580252", "name": "Commented-code block (6 lines) in lib/cartorio-auto.ts:9", "shortDescription": {"text": "Commented-code block (6 lines) in lib/cartorio-auto.ts:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-86213d1c65058920", "name": "Commented-code block (5 lines) in lib/cartorio.ts:73", "shortDescription": {"text": "Commented-code block (5 lines) in lib/cartorio.ts:73"}, "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-0aa5cd64da787362", "name": "Commented-code block (5 lines) in lib/geoportal-candidates.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in lib/geoportal-candidates.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-961a4da66038c36a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/pipefy-sync.ts:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/pipefy-sync.ts:71"}, "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-fff3e439e12ae9ed", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/wfs-idedf.ts:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/wfs-idedf.ts:75"}, "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-f574810af04f6799", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/cpf-lookup.ts:94", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/cpf-lookup.ts:94"}, "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-17a06b37ac7a0a9f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/pipefy.ts:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/pipefy.ts:53"}, "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-6e00ca1d3c149a4d", "name": "Commented-code block (5 lines) in lib/onus-gate.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in lib/onus-gate.ts:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-56ccea866acf365f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/pipefy-update.ts:12", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/pipefy-update.ts:12"}, "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-f808a4ef3e1071fb", "name": "14 env vars used in code but missing from .env.example", "shortDescription": {"text": "14 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `DW_DATABASE_URL`, `DW_TRK_URL`, `GCHAT_WEBHOOK_URL`, `GITHUB_OUTPUT`, `GIT_DIR`, `NEXT_PUBLIC_SITE_URL`, `NODE_ENV`, `PIPEFY_SESSION_B64` + 6 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-33a6b62e30ce7ab4", "name": "Near-duplicate function bodies in 6 places", "shortDescription": {"text": "Near-duplicate function bodies in 6 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/paulo_octavio_sync.py:get, scripts/greenhouse_sync.py:get, scripts/direcional_sync.py:get, scripts/chaves_sync.py:get\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/paulo_octavio_sync.py:scrape, scripts/elar_sync.py:scrape\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-02525d39071dd2c7", "name": "Near-duplicate function bodies in 5 places", "shortDescription": {"text": "Near-duplicate function bodies in 5 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/paulo_octavio_sync.py:upsert, scripts/greenhouse_sync.py:upsert, scripts/direcional_sync.py:upsert, scripts/riva_sync.py:upsert\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-d09de9f3f905fa99", "name": "Dangling fetch: POST https://api.pipefy.com/graphql (scripts/_discover_onus_pipe.mjs:12)", "shortDescription": {"text": "Dangling fetch: POST https://api.pipefy.com/graphql (scripts/_discover_onus_pipe.mjs:12)"}, "fullDescription": {"text": "`scripts/_discover_onus_pipe.mjs:12` calls `POST https://api.pipefy.com/graphql` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.pipefy.com/graphql`\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-a6949cb5c588609f", "name": "Dangling fetch: POST https://api.pipefy.com/graphql (scripts/_discover_oportunidades_fields.mjs:9)", "shortDescription": {"text": "Dangling fetch: POST https://api.pipefy.com/graphql (scripts/_discover_oportunidades_fields.mjs:9)"}, "fullDescription": {"text": "`scripts/_discover_oportunidades_fields.mjs:9` calls `POST https://api.pipefy.com/graphql` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.pipefy.com/graphql`\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-5ef05ec6f771b860", "name": "Dangling fetch: POST https://api.pipefy.com/graphql (scripts/_register_pipefy_webhook.mjs:16)", "shortDescription": {"text": "Dangling fetch: POST https://api.pipefy.com/graphql (scripts/_register_pipefy_webhook.mjs:16)"}, "fullDescription": {"text": "`scripts/_register_pipefy_webhook.mjs:16` calls `POST https://api.pipefy.com/graphql` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.pipefy.com/graphql`\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-fee6a7f00175a777", "name": "Dangling fetch: GET https://nominatim.openstreetmap.org/reverse?lat=${lat}&lon=${lng}&format=json (app/api/in-loco/geo/r", "shortDescription": {"text": "Dangling fetch: GET https://nominatim.openstreetmap.org/reverse?lat=${lat}&lon=${lng}&format=json (app/api/in-loco/geo/route.ts:51)"}, "fullDescription": {"text": "`app/api/in-loco/geo/route.ts:51` calls `GET https://nominatim.openstreetmap.org/reverse?lat=${lat}&lon=${lng}&format=json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/nominatim.openstreetmap.org/reverse`\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-c1da4401c3e07a5a", "name": "Dangling fetch: GET https://nominatim.openstreetmap.org/reverse?lat=${lat}&lon=${lng}&format=json (app/api/resolve-maps/", "shortDescription": {"text": "Dangling fetch: GET https://nominatim.openstreetmap.org/reverse?lat=${lat}&lon=${lng}&format=json (app/api/resolve-maps/route.ts:28)"}, "fullDescription": {"text": "`app/api/resolve-maps/route.ts:28` calls `GET https://nominatim.openstreetmap.org/reverse?lat=${lat}&lon=${lng}&format=json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/nominatim.openstreetmap.org/reverse`\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-63d56290d9688817", "name": "Dangling fetch: GET /api/visitas (app/(app)/visitas/visitas-client.tsx:251)", "shortDescription": {"text": "Dangling fetch: GET /api/visitas (app/(app)/visitas/visitas-client.tsx:251)"}, "fullDescription": {"text": "`app/(app)/visitas/visitas-client.tsx:251` calls `GET /api/visitas` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/visitas`\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-2e07733fbd8206bf", "name": "Dangling fetch: PATCH /api/visitas (app/(app)/visitas/visitas-client.tsx:291)", "shortDescription": {"text": "Dangling fetch: PATCH /api/visitas (app/(app)/visitas/visitas-client.tsx:291)"}, "fullDescription": {"text": "`app/(app)/visitas/visitas-client.tsx:291` calls `PATCH /api/visitas` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/visitas`\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-d80385cd8f3b33af", "name": "Dangling fetch: GET /api/analitico/funil-inquilinos?${p} (app/(app)/analitico/funil-inquilinos/funil-inquilinos-client.t", "shortDescription": {"text": "Dangling fetch: GET /api/analitico/funil-inquilinos?${p} (app/(app)/analitico/funil-inquilinos/funil-inquilinos-client.tsx:166)"}, "fullDescription": {"text": "`app/(app)/analitico/funil-inquilinos/funil-inquilinos-client.tsx:166` calls `GET /api/analitico/funil-inquilinos?${p}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/analitico/funil-inquilinos`\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-41e581b87c05908f", "name": "Dangling fetch: GET /api/pipefy/funil?${p} (app/(app)/analitico/funil/funil-client.tsx:317)", "shortDescription": {"text": "Dangling fetch: GET /api/pipefy/funil?${p} (app/(app)/analitico/funil/funil-client.tsx:317)"}, "fullDescription": {"text": "`app/(app)/analitico/funil/funil-client.tsx:317` calls `GET /api/pipefy/funil?${p}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pipefy/funil`\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-812249c062cff5fe", "name": "Dangling fetch: GET /api/pregao (app/(app)/pregao/pregao-client.tsx:35)", "shortDescription": {"text": "Dangling fetch: GET /api/pregao (app/(app)/pregao/pregao-client.tsx:35)"}, "fullDescription": {"text": "`app/(app)/pregao/pregao-client.tsx:35` calls `GET /api/pregao` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pregao`\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-471875ce09395740", "name": "Dangling fetch: POST /api/in-loco/geo (app/(app)/in-loco/in-loco-client.tsx:183)", "shortDescription": {"text": "Dangling fetch: POST /api/in-loco/geo (app/(app)/in-loco/in-loco-client.tsx:183)"}, "fullDescription": {"text": "`app/(app)/in-loco/in-loco-client.tsx:183` calls `POST /api/in-loco/geo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/in-loco/geo`\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-b0b633e9cc088972", "name": "Dangling fetch: POST /api/in-loco/geo (app/(app)/in-loco/revisar/revisar-client.tsx:122)", "shortDescription": {"text": "Dangling fetch: POST /api/in-loco/geo (app/(app)/in-loco/revisar/revisar-client.tsx:122)"}, "fullDescription": {"text": "`app/(app)/in-loco/revisar/revisar-client.tsx:122` calls `POST /api/in-loco/geo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/in-loco/geo`\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-31b07639c68866c1", "name": "Dangling fetch: POST /api/busca-pessoa (app/(app)/busca-pessoa/busca-client.tsx:135)", "shortDescription": {"text": "Dangling fetch: POST /api/busca-pessoa (app/(app)/busca-pessoa/busca-client.tsx:135)"}, "fullDescription": {"text": "`app/(app)/busca-pessoa/busca-client.tsx:135` calls `POST /api/busca-pessoa` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/busca-pessoa`\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-1c4aceb2072f6eaa", "name": "Dangling fetch: POST /api/resolve-maps (app/(app)/triagem/triagem-client.tsx:233)", "shortDescription": {"text": "Dangling fetch: POST /api/resolve-maps (app/(app)/triagem/triagem-client.tsx:233)"}, "fullDescription": {"text": "`app/(app)/triagem/triagem-client.tsx:233` calls `POST /api/resolve-maps` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/resolve-maps`\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-04c8e271fbe78d36", "name": "Dangling fetch: GET /api/triagem/detalhe?link=${encodeURIComponent(item.link)} (app/(app)/triagem/triagem-client.tsx:253", "shortDescription": {"text": "Dangling fetch: GET /api/triagem/detalhe?link=${encodeURIComponent(item.link)} (app/(app)/triagem/triagem-client.tsx:253)"}, "fullDescription": {"text": "`app/(app)/triagem/triagem-client.tsx:253` calls `GET /api/triagem/detalhe?link=${encodeURIComponent(item.link)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/triagem/detalhe`\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-d4877e99efc9da6f", "name": "Dangling fetch: POST /api/geoportal/candidatos (app/(app)/triagem/triagem-client.tsx:265)", "shortDescription": {"text": "Dangling fetch: POST /api/geoportal/candidatos (app/(app)/triagem/triagem-client.tsx:265)"}, "fullDescription": {"text": "`app/(app)/triagem/triagem-client.tsx:265` calls `POST /api/geoportal/candidatos` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/geoportal/candidatos`\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-0916c126f43b83cd", "name": "Dangling fetch: GET /api/triagem (app/(app)/triagem/triagem-client.tsx:803)", "shortDescription": {"text": "Dangling fetch: GET /api/triagem (app/(app)/triagem/triagem-client.tsx:803)"}, "fullDescription": {"text": "`app/(app)/triagem/triagem-client.tsx:803` calls `GET /api/triagem` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/triagem`\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-ef91f3e199a0583b", "name": "Dangling fetch: PATCH /api/triagem (app/(app)/triagem/triagem-client.tsx:884)", "shortDescription": {"text": "Dangling fetch: PATCH /api/triagem (app/(app)/triagem/triagem-client.tsx:884)"}, "fullDescription": {"text": "`app/(app)/triagem/triagem-client.tsx:884` calls `PATCH /api/triagem` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/triagem`\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-477fc042a8b3335a", "name": "Dangling fetch: POST /api/pipefy/card (app/(app)/triagem/triagem-client.tsx:910)", "shortDescription": {"text": "Dangling fetch: POST /api/pipefy/card (app/(app)/triagem/triagem-client.tsx:910)"}, "fullDescription": {"text": "`app/(app)/triagem/triagem-client.tsx:910` calls `POST /api/pipefy/card` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pipefy/card`\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-040f36ad40832a36", "name": "Dangling fetch: PATCH /api/triagem (app/(app)/triagem/triagem-client.tsx:958)", "shortDescription": {"text": "Dangling fetch: PATCH /api/triagem (app/(app)/triagem/triagem-client.tsx:958)"}, "fullDescription": {"text": "`app/(app)/triagem/triagem-client.tsx:958` calls `PATCH /api/triagem` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/triagem`\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-5264790f7cb93e5a", "name": "Dangling fetch: GET /api/scrapers/stats?portal=${portal.key} (app/(app)/scrapers/scrapers-client.tsx:130)", "shortDescription": {"text": "Dangling fetch: GET /api/scrapers/stats?portal=${portal.key} (app/(app)/scrapers/scrapers-client.tsx:130)"}, "fullDescription": {"text": "`app/(app)/scrapers/scrapers-client.tsx:130` calls `GET /api/scrapers/stats?portal=${portal.key}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/scrapers/stats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8b15e33f4a470db3", "name": "Dangling fetch: GET /api/scrapers/logs?portal=${portal.key} (app/(app)/scrapers/scrapers-client.tsx:143)", "shortDescription": {"text": "Dangling fetch: GET /api/scrapers/logs?portal=${portal.key} (app/(app)/scrapers/scrapers-client.tsx:143)"}, "fullDescription": {"text": "`app/(app)/scrapers/scrapers-client.tsx:143` calls `GET /api/scrapers/logs?portal=${portal.key}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/scrapers/logs`\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-cff3ca5cf730e755", "name": "Dangling fetch: GET /api/empreendimentos (app/(app)/scrapers/scrapers-client.tsx:485)", "shortDescription": {"text": "Dangling fetch: GET /api/empreendimentos (app/(app)/scrapers/scrapers-client.tsx:485)"}, "fullDescription": {"text": "`app/(app)/scrapers/scrapers-client.tsx:485` calls `GET /api/empreendimentos` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/empreendimentos`\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-0f0dbbd0a9d8e7f8", "name": "Dangling fetch: POST /api/cartorio/enviar-email (app/(app)/relatorio/relatorio-client.tsx:357)", "shortDescription": {"text": "Dangling fetch: POST /api/cartorio/enviar-email (app/(app)/relatorio/relatorio-client.tsx:357)"}, "fullDescription": {"text": "`app/(app)/relatorio/relatorio-client.tsx:357` calls `POST /api/cartorio/enviar-email` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cartorio/enviar-email`\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-91d083163fd334c5", "name": "Dangling fetch: GET /api/relatorio (app/(app)/relatorio/relatorio-client.tsx:490)", "shortDescription": {"text": "Dangling fetch: GET /api/relatorio (app/(app)/relatorio/relatorio-client.tsx:490)"}, "fullDescription": {"text": "`app/(app)/relatorio/relatorio-client.tsx:490` calls `GET /api/relatorio` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/relatorio`\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-89f7d0e5de363b50", "name": "Dangling fetch: PATCH /api/relatorio (app/(app)/relatorio/relatorio-client.tsx:520)", "shortDescription": {"text": "Dangling fetch: PATCH /api/relatorio (app/(app)/relatorio/relatorio-client.tsx:520)"}, "fullDescription": {"text": "`app/(app)/relatorio/relatorio-client.tsx:520` calls `PATCH /api/relatorio` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/relatorio`\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-1f693a1b60ea528f", "name": "Dangling fetch: PATCH /api/relatorio (app/(app)/relatorio/relatorio-client.tsx:600)", "shortDescription": {"text": "Dangling fetch: PATCH /api/relatorio (app/(app)/relatorio/relatorio-client.tsx:600)"}, "fullDescription": {"text": "`app/(app)/relatorio/relatorio-client.tsx:600` calls `PATCH /api/relatorio` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/relatorio`\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-bd201129c2b0992a", "name": "Dangling fetch: PATCH /api/relatorio (app/(app)/relatorio/relatorio-client.tsx:625)", "shortDescription": {"text": "Dangling fetch: PATCH /api/relatorio (app/(app)/relatorio/relatorio-client.tsx:625)"}, "fullDescription": {"text": "`app/(app)/relatorio/relatorio-client.tsx:625` calls `PATCH /api/relatorio` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/relatorio`\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-c984097d1c9a59a4", "name": "Dangling fetch: PATCH /api/relatorio (app/(app)/relatorio/relatorio-client.tsx:641)", "shortDescription": {"text": "Dangling fetch: PATCH /api/relatorio (app/(app)/relatorio/relatorio-client.tsx:641)"}, "fullDescription": {"text": "`app/(app)/relatorio/relatorio-client.tsx:641` calls `PATCH /api/relatorio` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/relatorio`\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-799b2682daebbb4a", "name": "Dangling fetch: POST /api/pipefy/preencher (app/(app)/relatorio/relatorio-client.tsx:665)", "shortDescription": {"text": "Dangling fetch: POST /api/pipefy/preencher (app/(app)/relatorio/relatorio-client.tsx:665)"}, "fullDescription": {"text": "`app/(app)/relatorio/relatorio-client.tsx:665` calls `POST /api/pipefy/preencher` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pipefy/preencher`\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-a911041205c3825f", "name": "Dangling fetch: DELETE /api/relatorio (app/(app)/relatorio/relatorio-client.tsx:692)", "shortDescription": {"text": "Dangling fetch: DELETE /api/relatorio (app/(app)/relatorio/relatorio-client.tsx:692)"}, "fullDescription": {"text": "`app/(app)/relatorio/relatorio-client.tsx:692` calls `DELETE /api/relatorio` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/relatorio`\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-1bdf2a86a76760cf", "name": "Dangling fetch: GET /api/empreendimentos?${params} (app/(app)/lancamentos/lancamentos-client.tsx:223)", "shortDescription": {"text": "Dangling fetch: GET /api/empreendimentos?${params} (app/(app)/lancamentos/lancamentos-client.tsx:223)"}, "fullDescription": {"text": "`app/(app)/lancamentos/lancamentos-client.tsx:223` calls `GET /api/empreendimentos?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/empreendimentos`\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-596209d590d042f0", "name": "Dangling fetch: POST /api/captacao/curadoria (app/(app)/captacao/captacao-client.tsx:144)", "shortDescription": {"text": "Dangling fetch: POST /api/captacao/curadoria (app/(app)/captacao/captacao-client.tsx:144)"}, "fullDescription": {"text": "`app/(app)/captacao/captacao-client.tsx:144` calls `POST /api/captacao/curadoria` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/captacao/curadoria`\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-3091f1d61a49ea63", "name": "Dangling fetch: POST /api/geoportal/candidatos (app/(app)/geoportal/geoportal-client.tsx:70)", "shortDescription": {"text": "Dangling fetch: POST /api/geoportal/candidatos (app/(app)/geoportal/geoportal-client.tsx:70)"}, "fullDescription": {"text": "`app/(app)/geoportal/geoportal-client.tsx:70` calls `POST /api/geoportal/candidatos` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/geoportal/candidatos`\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-d8225c8681a481d1", "name": "Dangling fetch: GET /api/empreendimentos?stats=1 (components/topbar.tsx:55)", "shortDescription": {"text": "Dangling fetch: GET /api/empreendimentos?stats=1 (components/topbar.tsx:55)"}, "fullDescription": {"text": "`components/topbar.tsx:55` calls `GET /api/empreendimentos?stats=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/empreendimentos`\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-831851b597385e0d", "name": "Unused endpoint: USE /fotos", "shortDescription": {"text": "Unused endpoint: USE /fotos"}, "fullDescription": {"text": "`server.js` declares `USE /fotos` 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": "`server.js` 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-17026373b7b0c941", "name": "Unused endpoint: GET /api/scrapers/run", "shortDescription": {"text": "Unused endpoint: GET /api/scrapers/run"}, "fullDescription": {"text": "`server.js` declares `GET /api/scrapers/run` 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-718e35721f5aaf5b", "name": "Unused endpoint: POST /api/extrair-pistas", "shortDescription": {"text": "Unused endpoint: POST /api/extrair-pistas"}, "fullDescription": {"text": "`server.js` declares `POST /api/extrair-pistas` 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-e1b66c9da3fde592", "name": "Unused endpoint: POST /api/analisar-imagens", "shortDescription": {"text": "Unused endpoint: POST /api/analisar-imagens"}, "fullDescription": {"text": "`server.js` declares `POST /api/analisar-imagens` 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/25281"}, "properties": {"repository": "Davi-Guedes-TRK/Scraper", "repoUrl": "https://github.com/Davi-Guedes-TRK/Scraper", "branch": "main"}, "results": [{"ruleId": "scanner-7f48b32d7b928caf", "level": "note", "message": {"text": "Possibly dead Python function: tarefa"}, "properties": {"repobilityId": "13cd236fd5be02f8", "scanner": "scanner-primary", "fingerprint": "7f48b32d7b928caf", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/validar_links.py:145"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-eab5e30fcb903d50", "level": "note", "message": {"text": "Possibly dead Python function: pct"}, "properties": {"repobilityId": "fd7e1088bce92f18", "scanner": "scanner-primary", "fingerprint": "eab5e30fcb903d50", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/lotus_sync.py:45"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-05e6445bb41ac5c1", "level": "note", "message": {"text": "Possibly dead Python function: rank"}, "properties": {"repobilityId": "1a1f31887e459ef3", "scanner": "scanner-primary", "fingerprint": "05e6445bb41ac5c1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/dedup_phash.py:186"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bfb07735e7e4a6a3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server.js:118"}, "properties": {"repobilityId": "a9deebb5fdc93edc", "scanner": "scanner-primary", "fingerprint": "bfb07735e7e4a6a3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e10e366f29cf676d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/pipefy/route.ts:89"}, "properties": {"repobilityId": "fa8071b22c34b6eb", "scanner": "scanner-primary", "fingerprint": "e10e366f29cf676d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-467df0987746007d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/carteira-paralela/carteira-paralela-client.tsx:164"}, "properties": {"repobilityId": "ffd2d638d01558c1", "scanner": "scanner-primary", "fingerprint": "467df0987746007d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-59ae6714c6389901", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/dashboard/dashboard-client.tsx:62"}, "properties": {"repobilityId": "0e187939065aedf8", "scanner": "scanner-primary", "fingerprint": "59ae6714c6389901", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a2e877885aa80994", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/visitas/visitas-client.tsx:144"}, "properties": {"repobilityId": "b4d90806a39321d3", "scanner": "scanner-primary", "fingerprint": "a2e877885aa80994", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-def4aa013dcf0648", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/analitico/funil-inquilinos/funil-inquilinos-client.tsx:129"}, "properties": {"repobilityId": "f3acaa45bf463040", "scanner": "scanner-primary", "fingerprint": "def4aa013dcf0648", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3c2086fa400cd356", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/analitico/funil/funil-client.tsx:208"}, "properties": {"repobilityId": "744754d3b3a674c2", "scanner": "scanner-primary", "fingerprint": "3c2086fa400cd356", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8ceea277d967b860", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/pregao/pregao-client.tsx:221"}, "properties": {"repobilityId": "4a2e2241d449c347", "scanner": "scanner-primary", "fingerprint": "8ceea277d967b860", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-35041a48396031ea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/in-loco/in-loco-client.tsx:274"}, "properties": {"repobilityId": "f9e1a9bb3ae459df", "scanner": "scanner-primary", "fingerprint": "35041a48396031ea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1447964c9feedf2e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/in-loco/revisar/revisar-client.tsx:144"}, "properties": {"repobilityId": "0e5ff427bde30eb4", "scanner": "scanner-primary", "fingerprint": "1447964c9feedf2e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bbf6be97fa421cdf", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 app/(app)/triagem/triagem-client.tsx:174"}, "properties": {"repobilityId": "813f8bbd613ced15", "scanner": "scanner-primary", "fingerprint": "bbf6be97fa421cdf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-00fef7c98bbd5941", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/triagem/triagem-client.tsx:171"}, "properties": {"repobilityId": "288eeb831af8b1d6", "scanner": "scanner-primary", "fingerprint": "00fef7c98bbd5941", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec62fcb23d3660bd", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 app/(app)/triagem/matricula-modal.tsx:115"}, "properties": {"repobilityId": "2f72dd563f3cfbd1", "scanner": "scanner-primary", "fingerprint": "ec62fcb23d3660bd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-84b55363a4075ea7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/triagem/matricula-modal.tsx:121"}, "properties": {"repobilityId": "00e7055ed33dd4c8", "scanner": "scanner-primary", "fingerprint": "84b55363a4075ea7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-862cd1a486140031", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 app/(app)/scrapers/scrapers-client.tsx:75"}, "properties": {"repobilityId": "6d0a75eaf26298d8", "scanner": "scanner-primary", "fingerprint": "862cd1a486140031", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-289059a1f74147d2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/scrapers/scrapers-client.tsx:189"}, "properties": {"repobilityId": "26c5a7b388b1ba25", "scanner": "scanner-primary", "fingerprint": "289059a1f74147d2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2d008f5155c9e470", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/relatorio/relatorio-client.tsx:197"}, "properties": {"repobilityId": "b72cd2392042434d", "scanner": "scanner-primary", "fingerprint": "2d008f5155c9e470", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-718bf8c54bf3783a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/captacao/captacao-client.tsx:211"}, "properties": {"repobilityId": "19420c69b4f6abd0", "scanner": "scanner-primary", "fingerprint": "718bf8c54bf3783a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-00d728546b9f50b2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/(app)/geoportal/geoportal-client.tsx:155"}, "properties": {"repobilityId": "81fb19a5d44fa7fd", "scanner": "scanner-primary", "fingerprint": "00d728546b9f50b2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b4d403f6f81c496e", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 scripts/enriquecer_qualificacao.ts:112"}, "properties": {"repobilityId": "8f8635bcfe60869c", "scanner": "scanner-primary", "fingerprint": "b4d403f6f81c496e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-ba973f144bc64f73", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/enriquecer_qualificacao.ts:89"}, "properties": {"repobilityId": "372348e8824e4c17", "scanner": "scanner-primary", "fingerprint": "ba973f144bc64f73", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-13469684aadc2d5f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/data-source-bar.tsx:37"}, "properties": {"repobilityId": "936a95b23a6be1d2", "scanner": "scanner-primary", "fingerprint": "13469684aadc2d5f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a291974048c84a3b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/topbar.tsx:108"}, "properties": {"repobilityId": "e86686cfe126da63", "scanner": "scanner-primary", "fingerprint": "a291974048c84a3b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8ac6f821a002fe0b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/navbar.tsx:322"}, "properties": {"repobilityId": "557b77b682f36934", "scanner": "scanner-primary", "fingerprint": "8ac6f821a002fe0b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-400d75c404c42d8f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/stat-tile.tsx:24"}, "properties": {"repobilityId": "28a373544c44255d", "scanner": "scanner-primary", "fingerprint": "400d75c404c42d8f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e78085d138e2717e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ui/page-header.tsx:12"}, "properties": {"repobilityId": "9daaede21056217e", "scanner": "scanner-primary", "fingerprint": "e78085d138e2717e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce551e90428a8a8e", "level": "warning", "message": {"text": "Privileged port 14 in use"}, "properties": {"repobilityId": "2dbd4b719a1412ff", "scanner": "scanner-primary", "fingerprint": "ce551e90428a8a8e", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/auto-cartorio-2oficio.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f184902cbd4e7471", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in server.js:4"}, "properties": {"repobilityId": "23f3ba0b6e438ed3", "scanner": "scanner-primary", "fingerprint": "f184902cbd4e7471", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server.js"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-a1b6204e675b40ec", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in app/api/pipefy/preencher/route.ts:2"}, "properties": {"repobilityId": "d709685a681a59bc", "scanner": "scanner-primary", "fingerprint": "a1b6204e675b40ec", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/pipefy/preencher/route.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-dc61337420b59c8f", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in app/api/scrapers/run/route.ts:2"}, "properties": {"repobilityId": "ce627eb6e5a9d306", "scanner": "scanner-primary", "fingerprint": "dc61337420b59c8f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/scrapers/run/route.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-aa2190e4014cffc5", "level": "note", "message": {"text": "Very large file: app/(app)/triagem/triagem-client.tsx (1228 lines)"}, "properties": {"repobilityId": "55f31a1b30df4783", "scanner": "scanner-primary", "fingerprint": "aa2190e4014cffc5", "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": "0f8429434c9f0c66", "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": "1989824ebf6bf647", "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": "8122736b530b6f33", "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": "e945be8ef60e66aa", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "19cf2f88ee8530a8", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-a866736eaff9886f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server.js:186"}, "properties": {"repobilityId": "179378dcabc0d889", "scanner": "scanner-primary", "fingerprint": "a866736eaff9886f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7fb1833294da3e22", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/geocodificar/route.ts:12"}, "properties": {"repobilityId": "a236c5d8f0b5703c", "scanner": "scanner-primary", "fingerprint": "7fb1833294da3e22", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-36dac60bf9479f16", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/cartorio/inbound/route.ts:10"}, "properties": {"repobilityId": "eba39d38334b6018", "scanner": "scanner-primary", "fingerprint": "36dac60bf9479f16", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2e3970b95329eb66", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/onus/inbound/route.ts:13"}, "properties": {"repobilityId": "a5498ad41a4a8ce7", "scanner": "scanner-primary", "fingerprint": "2e3970b95329eb66", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3becb8c496e64e5e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/visitas/visitas-client.tsx:321"}, "properties": {"repobilityId": "ef2bfafb81e1542e", "scanner": "scanner-primary", "fingerprint": "3becb8c496e64e5e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-486f55c4bf476f0c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/analitico/funil/funil-client.tsx:317"}, "properties": {"repobilityId": "e386693b19c9e3e1", "scanner": "scanner-primary", "fingerprint": "486f55c4bf476f0c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f661ea19a393dbde", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/(app)/triagem/triagem-client.tsx:265"}, "properties": {"repobilityId": "6d620744ebaa9abf", "scanner": "scanner-primary", "fingerprint": "f661ea19a393dbde", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-694213ab5f62a8bf", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/sync_corretor_captacoes.py:211"}, "properties": {"repobilityId": "4627eae2f7560a30", "scanner": "scanner-primary", "fingerprint": "694213ab5f62a8bf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eb8a4c9fc60e9a44", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/enriquecer_qualificacao.ts:51"}, "properties": {"repobilityId": "d249244204c4f284", "scanner": "scanner-primary", "fingerprint": "eb8a4c9fc60e9a44", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e6244c4560d468d5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/_discover_onus_pipe.mjs:12"}, "properties": {"repobilityId": "020c257ff32e1c5b", "scanner": "scanner-primary", "fingerprint": "e6244c4560d468d5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cb5f9822a72f1c62", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/pipefy_portal_fill.py:145"}, "properties": {"repobilityId": "858cedcaa6dce39c", "scanner": "scanner-primary", "fingerprint": "cb5f9822a72f1c62", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-73132cddc3c942e8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/_discover_oportunidades_fields.mjs:9"}, "properties": {"repobilityId": "f5ecc37d582a9e2d", "scanner": "scanner-primary", "fingerprint": "73132cddc3c942e8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ad7695e79a6c2116", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/_register_pipefy_webhook.mjs:16"}, "properties": {"repobilityId": "a3e44d7d9717d3e3", "scanner": "scanner-primary", "fingerprint": "ad7695e79a6c2116", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-baf78713b5580252", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/cartorio-auto.ts:9"}, "properties": {"repobilityId": "d8f261dd8aef59e2", "scanner": "scanner-primary", "fingerprint": "baf78713b5580252", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-86213d1c65058920", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/cartorio.ts:73"}, "properties": {"repobilityId": "fc7f47145fa6a1c5", "scanner": "scanner-primary", "fingerprint": "86213d1c65058920", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0aa5cd64da787362", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/geoportal-candidates.ts:1"}, "properties": {"repobilityId": "54a0c2bcd84037d7", "scanner": "scanner-primary", "fingerprint": "0aa5cd64da787362", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-961a4da66038c36a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/pipefy-sync.ts:71"}, "properties": {"repobilityId": "1ae071566d64b56c", "scanner": "scanner-primary", "fingerprint": "961a4da66038c36a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fff3e439e12ae9ed", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/wfs-idedf.ts:75"}, "properties": {"repobilityId": "c684c37b7d5923b0", "scanner": "scanner-primary", "fingerprint": "fff3e439e12ae9ed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f574810af04f6799", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/cpf-lookup.ts:94"}, "properties": {"repobilityId": "5a402548c351419a", "scanner": "scanner-primary", "fingerprint": "f574810af04f6799", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-17a06b37ac7a0a9f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/pipefy.ts:53"}, "properties": {"repobilityId": "3c277b58e50b103b", "scanner": "scanner-primary", "fingerprint": "17a06b37ac7a0a9f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6e00ca1d3c149a4d", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/onus-gate.ts:1"}, "properties": {"repobilityId": "c96c2945cdbc56f4", "scanner": "scanner-primary", "fingerprint": "6e00ca1d3c149a4d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-56ccea866acf365f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/pipefy-update.ts:12"}, "properties": {"repobilityId": "5fd57713a49d1906", "scanner": "scanner-primary", "fingerprint": "56ccea866acf365f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f808a4ef3e1071fb", "level": "note", "message": {"text": "14 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "ce6b2ec4be4ec75a", "scanner": "scanner-primary", "fingerprint": "f808a4ef3e1071fb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-33a6b62e30ce7ab4", "level": "note", "message": {"text": "Near-duplicate function bodies in 6 places"}, "properties": {"repobilityId": "664234029ee83eb6", "scanner": "scanner-primary", "fingerprint": "33a6b62e30ce7ab4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-33a6b62e30ce7ab4", "level": "note", "message": {"text": "Near-duplicate function bodies in 6 places"}, "properties": {"repobilityId": "147fcae161ef5513", "scanner": "scanner-primary", "fingerprint": "33a6b62e30ce7ab4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-33a6b62e30ce7ab4", "level": "note", "message": {"text": "Near-duplicate function bodies in 6 places"}, "properties": {"repobilityId": "1eb1cb684d86bbcd", "scanner": "scanner-primary", "fingerprint": "33a6b62e30ce7ab4", "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": "23f41c71d4677267", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "4de6a3913959d447", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "f29f847a6b6d6840", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "90dd8057fb7018ed", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "e3a820fad35f8079", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "05b56aab210d8ee8", "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": "17dd52283af9a8cb", "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": "a4de69d386177a00", "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": "5c6cc5067c165ecf", "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": "5a0dc68c2685b0e8", "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": "b614af565877210a", "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": "111b713117894a97", "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": "9f86af722bfd75e1", "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": "6c336f9bd8f915df", "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": "b6286f9620b99e43", "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": "fc43db3cf6121d98", "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": "7f462daf0e8c5310", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-d09de9f3f905fa99", "level": "error", "message": {"text": "Dangling fetch: POST https://api.pipefy.com/graphql (scripts/_discover_onus_pipe.mjs:12)"}, "properties": {"repobilityId": "3f9c701b505d9a20", "scanner": "scanner-primary", "fingerprint": "d09de9f3f905fa99", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a6949cb5c588609f", "level": "error", "message": {"text": "Dangling fetch: POST https://api.pipefy.com/graphql (scripts/_discover_oportunidades_fields.mjs:9)"}, "properties": {"repobilityId": "4e452ad48f13a63a", "scanner": "scanner-primary", "fingerprint": "a6949cb5c588609f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5ef05ec6f771b860", "level": "error", "message": {"text": "Dangling fetch: POST https://api.pipefy.com/graphql (scripts/_register_pipefy_webhook.mjs:16)"}, "properties": {"repobilityId": "d03a71fb45589d8a", "scanner": "scanner-primary", "fingerprint": "5ef05ec6f771b860", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fee6a7f00175a777", "level": "error", "message": {"text": "Dangling fetch: GET https://nominatim.openstreetmap.org/reverse?lat=${lat}&lon=${lng}&format=json (app/api/in-loco/geo/route.ts:51)"}, "properties": {"repobilityId": "a5ee0de20a8e86b3", "scanner": "scanner-primary", "fingerprint": "fee6a7f00175a777", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c1da4401c3e07a5a", "level": "error", "message": {"text": "Dangling fetch: GET https://nominatim.openstreetmap.org/reverse?lat=${lat}&lon=${lng}&format=json (app/api/resolve-maps/route.ts:28)"}, "properties": {"repobilityId": "7f412ce79864282a", "scanner": "scanner-primary", "fingerprint": "c1da4401c3e07a5a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-63d56290d9688817", "level": "error", "message": {"text": "Dangling fetch: GET /api/visitas (app/(app)/visitas/visitas-client.tsx:251)"}, "properties": {"repobilityId": "675f87d6381895a2", "scanner": "scanner-primary", "fingerprint": "63d56290d9688817", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2e07733fbd8206bf", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/visitas (app/(app)/visitas/visitas-client.tsx:291)"}, "properties": {"repobilityId": "b6d36ac58616cd00", "scanner": "scanner-primary", "fingerprint": "2e07733fbd8206bf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d80385cd8f3b33af", "level": "error", "message": {"text": "Dangling fetch: GET /api/analitico/funil-inquilinos?${p} (app/(app)/analitico/funil-inquilinos/funil-inquilinos-client.tsx:166)"}, "properties": {"repobilityId": "27c8604aabd12d22", "scanner": "scanner-primary", "fingerprint": "d80385cd8f3b33af", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-41e581b87c05908f", "level": "error", "message": {"text": "Dangling fetch: GET /api/pipefy/funil?${p} (app/(app)/analitico/funil/funil-client.tsx:317)"}, "properties": {"repobilityId": "f7fa7ce9c4d0c2a9", "scanner": "scanner-primary", "fingerprint": "41e581b87c05908f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-812249c062cff5fe", "level": "error", "message": {"text": "Dangling fetch: GET /api/pregao (app/(app)/pregao/pregao-client.tsx:35)"}, "properties": {"repobilityId": "cde604194c2f97d2", "scanner": "scanner-primary", "fingerprint": "812249c062cff5fe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-471875ce09395740", "level": "error", "message": {"text": "Dangling fetch: POST /api/in-loco/geo (app/(app)/in-loco/in-loco-client.tsx:183)"}, "properties": {"repobilityId": "d5c9deb38f72dee2", "scanner": "scanner-primary", "fingerprint": "471875ce09395740", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b0b633e9cc088972", "level": "error", "message": {"text": "Dangling fetch: POST /api/in-loco/geo (app/(app)/in-loco/revisar/revisar-client.tsx:122)"}, "properties": {"repobilityId": "4141a4708ebd7ce9", "scanner": "scanner-primary", "fingerprint": "b0b633e9cc088972", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-31b07639c68866c1", "level": "error", "message": {"text": "Dangling fetch: POST /api/busca-pessoa (app/(app)/busca-pessoa/busca-client.tsx:135)"}, "properties": {"repobilityId": "1cdea74e705b291e", "scanner": "scanner-primary", "fingerprint": "31b07639c68866c1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1c4aceb2072f6eaa", "level": "error", "message": {"text": "Dangling fetch: POST /api/resolve-maps (app/(app)/triagem/triagem-client.tsx:233)"}, "properties": {"repobilityId": "0f0163d366fdc666", "scanner": "scanner-primary", "fingerprint": "1c4aceb2072f6eaa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-04c8e271fbe78d36", "level": "error", "message": {"text": "Dangling fetch: GET /api/triagem/detalhe?link=${encodeURIComponent(item.link)} (app/(app)/triagem/triagem-client.tsx:253)"}, "properties": {"repobilityId": "d31f0b4669ecfbc7", "scanner": "scanner-primary", "fingerprint": "04c8e271fbe78d36", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d4877e99efc9da6f", "level": "error", "message": {"text": "Dangling fetch: POST /api/geoportal/candidatos (app/(app)/triagem/triagem-client.tsx:265)"}, "properties": {"repobilityId": "811f73bcfb4dd3ae", "scanner": "scanner-primary", "fingerprint": "d4877e99efc9da6f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0916c126f43b83cd", "level": "error", "message": {"text": "Dangling fetch: GET /api/triagem (app/(app)/triagem/triagem-client.tsx:803)"}, "properties": {"repobilityId": "1ca046db13f491e1", "scanner": "scanner-primary", "fingerprint": "0916c126f43b83cd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ef91f3e199a0583b", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/triagem (app/(app)/triagem/triagem-client.tsx:884)"}, "properties": {"repobilityId": "19a2fff51e57ebd4", "scanner": "scanner-primary", "fingerprint": "ef91f3e199a0583b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-477fc042a8b3335a", "level": "error", "message": {"text": "Dangling fetch: POST /api/pipefy/card (app/(app)/triagem/triagem-client.tsx:910)"}, "properties": {"repobilityId": "5fdbae3d9cbccf5c", "scanner": "scanner-primary", "fingerprint": "477fc042a8b3335a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-040f36ad40832a36", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/triagem (app/(app)/triagem/triagem-client.tsx:958)"}, "properties": {"repobilityId": "21dab424f9f6a971", "scanner": "scanner-primary", "fingerprint": "040f36ad40832a36", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5264790f7cb93e5a", "level": "error", "message": {"text": "Dangling fetch: GET /api/scrapers/stats?portal=${portal.key} (app/(app)/scrapers/scrapers-client.tsx:130)"}, "properties": {"repobilityId": "bb2d73e9e6353c85", "scanner": "scanner-primary", "fingerprint": "5264790f7cb93e5a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8b15e33f4a470db3", "level": "error", "message": {"text": "Dangling fetch: GET /api/scrapers/logs?portal=${portal.key} (app/(app)/scrapers/scrapers-client.tsx:143)"}, "properties": {"repobilityId": "5db0b8896292c718", "scanner": "scanner-primary", "fingerprint": "8b15e33f4a470db3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cff3ca5cf730e755", "level": "error", "message": {"text": "Dangling fetch: GET /api/empreendimentos (app/(app)/scrapers/scrapers-client.tsx:485)"}, "properties": {"repobilityId": "bc0d811c4a6ff5c7", "scanner": "scanner-primary", "fingerprint": "cff3ca5cf730e755", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0f0dbbd0a9d8e7f8", "level": "error", "message": {"text": "Dangling fetch: POST /api/cartorio/enviar-email (app/(app)/relatorio/relatorio-client.tsx:357)"}, "properties": {"repobilityId": "1c8f573a18dca6cc", "scanner": "scanner-primary", "fingerprint": "0f0dbbd0a9d8e7f8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-91d083163fd334c5", "level": "error", "message": {"text": "Dangling fetch: GET /api/relatorio (app/(app)/relatorio/relatorio-client.tsx:490)"}, "properties": {"repobilityId": "23bf6b0501952eff", "scanner": "scanner-primary", "fingerprint": "91d083163fd334c5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-89f7d0e5de363b50", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/relatorio (app/(app)/relatorio/relatorio-client.tsx:520)"}, "properties": {"repobilityId": "e3d2c31d3b097c10", "scanner": "scanner-primary", "fingerprint": "89f7d0e5de363b50", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1f693a1b60ea528f", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/relatorio (app/(app)/relatorio/relatorio-client.tsx:600)"}, "properties": {"repobilityId": "f216d22e1de67d5b", "scanner": "scanner-primary", "fingerprint": "1f693a1b60ea528f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bd201129c2b0992a", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/relatorio (app/(app)/relatorio/relatorio-client.tsx:625)"}, "properties": {"repobilityId": "25fd644a0314d08d", "scanner": "scanner-primary", "fingerprint": "bd201129c2b0992a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c984097d1c9a59a4", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/relatorio (app/(app)/relatorio/relatorio-client.tsx:641)"}, "properties": {"repobilityId": "6c8eaaa9ecaf43cb", "scanner": "scanner-primary", "fingerprint": "c984097d1c9a59a4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-799b2682daebbb4a", "level": "error", "message": {"text": "Dangling fetch: POST /api/pipefy/preencher (app/(app)/relatorio/relatorio-client.tsx:665)"}, "properties": {"repobilityId": "b004268b12c5ad97", "scanner": "scanner-primary", "fingerprint": "799b2682daebbb4a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a911041205c3825f", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/relatorio (app/(app)/relatorio/relatorio-client.tsx:692)"}, "properties": {"repobilityId": "06db4ff1ffbddf04", "scanner": "scanner-primary", "fingerprint": "a911041205c3825f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1bdf2a86a76760cf", "level": "error", "message": {"text": "Dangling fetch: GET /api/empreendimentos?${params} (app/(app)/lancamentos/lancamentos-client.tsx:223)"}, "properties": {"repobilityId": "15a2e6837d1bd151", "scanner": "scanner-primary", "fingerprint": "1bdf2a86a76760cf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-596209d590d042f0", "level": "error", "message": {"text": "Dangling fetch: POST /api/captacao/curadoria (app/(app)/captacao/captacao-client.tsx:144)"}, "properties": {"repobilityId": "07516f82d427bca0", "scanner": "scanner-primary", "fingerprint": "596209d590d042f0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3091f1d61a49ea63", "level": "error", "message": {"text": "Dangling fetch: POST /api/geoportal/candidatos (app/(app)/geoportal/geoportal-client.tsx:70)"}, "properties": {"repobilityId": "348a359b5cfeb79a", "scanner": "scanner-primary", "fingerprint": "3091f1d61a49ea63", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d8225c8681a481d1", "level": "error", "message": {"text": "Dangling fetch: GET /api/empreendimentos?stats=1 (components/topbar.tsx:55)"}, "properties": {"repobilityId": "3343ef4ef4ad7c57", "scanner": "scanner-primary", "fingerprint": "d8225c8681a481d1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-831851b597385e0d", "level": "note", "message": {"text": "Unused endpoint: USE /fotos"}, "properties": {"repobilityId": "f12a9d184ba28f0a", "scanner": "scanner-primary", "fingerprint": "831851b597385e0d", "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": "98e09bb8fcd7909b", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-17026373b7b0c941", "level": "note", "message": {"text": "Unused endpoint: GET /api/scrapers/run"}, "properties": {"repobilityId": "7618941ee5a2f251", "scanner": "scanner-primary", "fingerprint": "17026373b7b0c941", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-718e35721f5aaf5b", "level": "note", "message": {"text": "Unused endpoint: POST /api/extrair-pistas"}, "properties": {"repobilityId": "74a17fbb942bdfc4", "scanner": "scanner-primary", "fingerprint": "718e35721f5aaf5b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e1b66c9da3fde592", "level": "note", "message": {"text": "Unused endpoint: POST /api/analisar-imagens"}, "properties": {"repobilityId": "916d3a5829338103", "scanner": "scanner-primary", "fingerprint": "e1b66c9da3fde592", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}