{"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-a84f44f87bb18417", "name": "Possibly dead Python function: draw_cover", "shortDescription": {"text": "Possibly dead Python function: draw_cover"}, "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-67a567739f73fa78", "name": "Possibly dead Python function: draw_footer", "shortDescription": {"text": "Possibly dead Python function: draw_footer"}, "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-c7b937b555504aea", "name": "Possibly dead Python function: wrap", "shortDescription": {"text": "Possibly dead Python function: wrap"}, "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-e6d6ad28a25b330a", "name": "Possibly dead Python function: draw", "shortDescription": {"text": "Possibly dead Python function: draw"}, "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-dbe99609c20f4aa9", "name": "Possibly dead Python function: m_login", "shortDescription": {"text": "Possibly dead Python function: m_login"}, "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-9d7d7f3effc47623", "name": "Possibly dead Python function: m_dashboard", "shortDescription": {"text": "Possibly dead Python function: m_dashboard"}, "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-32cf33eb50674ffa", "name": "Possibly dead Python function: m_nuevo_sujeto", "shortDescription": {"text": "Possibly dead Python function: m_nuevo_sujeto"}, "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-10658ae5ccb71e76", "name": "Possibly dead Python function: m_aml", "shortDescription": {"text": "Possibly dead Python function: m_aml"}, "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-eb54fc427ee70222", "name": "Possibly dead Python function: m_manual", "shortDescription": {"text": "Possibly dead Python function: m_manual"}, "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-7563652d3ca6f474", "name": "Possibly dead Python function: m_riesgo", "shortDescription": {"text": "Possibly dead Python function: m_riesgo"}, "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-b8b0c3e41fcb1624", "name": "Possibly dead Python function: m_usuarios", "shortDescription": {"text": "Possibly dead Python function: m_usuarios"}, "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-52a89db57949c2f6", "name": "Possibly dead Python function: m_importar", "shortDescription": {"text": "Possibly dead Python function: m_importar"}, "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-07cc716f13f7d0a9", "name": "Possibly dead Python function: m_invitacion", "shortDescription": {"text": "Possibly dead Python function: m_invitacion"}, "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-8773a7772c18593e", "name": "Possibly dead Python function: m_revision", "shortDescription": {"text": "Possibly dead Python function: m_revision"}, "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-2cb41c2bedb22dd8", "name": "Possibly dead Python function: m_informes", "shortDescription": {"text": "Possibly dead Python function: m_informes"}, "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-e8bb43941ededd0e", "name": "Possibly dead Python function: m_reportes", "shortDescription": {"text": "Possibly dead Python function: m_reportes"}, "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-6280ae1f211f0908", "name": "Possibly dead Python function: m_plantillas", "shortDescription": {"text": "Possibly dead Python function: m_plantillas"}, "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-596e9d44fc2a6d0a", "name": "Possibly dead Python function: m_papelera", "shortDescription": {"text": "Possibly dead Python function: m_papelera"}, "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-4acdb756e3965136", "name": "Possibly dead Python function: draw_cover", "shortDescription": {"text": "Possibly dead Python function: draw_cover"}, "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-383f505d28063fe1", "name": "Possibly dead Python function: draw_footer", "shortDescription": {"text": "Possibly dead Python function: draw_footer"}, "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-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b6af4eeac8b5137e", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-cribado.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-cribado.ts:37"}, "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-db76e28bc07a09e5", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-motor.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-motor.ts:10"}, "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-753f3084f7698197", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/(panel)/layout.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/(panel)/layout.tsx:71"}, "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-8019e4b526f946c0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/(panel)/usuarios/company-multi-picker.tsx:32", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/(panel)/usuarios/company-multi-picker.tsx:32"}, "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-e4a7a900467cb7ac", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/f/[token]/documentos/manager.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/f/[token]/documentos/manager.tsx:80"}, "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-2b4a202556cb9b55", "name": "Stray `console.log` in TS/JS \u2014 src/lib/email.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email.ts:48"}, "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-a4251511bb8667b9", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/cedula.ts:31", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/cedula.ts:31"}, "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-3c757d34fe42192f", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/aml/report-pdf.ts:124", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/aml/report-pdf.ts:124"}, "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-43dd96dba86ee995", "name": "Stray `console.log` in TS/JS \u2014 src/lib/aml/screenshot.ts:80", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/aml/screenshot.ts:80"}, "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-017f14b90f3b2124", "name": "Stray `console.log` in TS/JS \u2014 src/lib/aml/playwright-capture.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/aml/playwright-capture.ts:40"}, "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-aa0db097b117774a", "name": "Stray `console.log` in TS/JS \u2014 src/lib/aml/scrapingbee.ts:79", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/aml/scrapingbee.ts:79"}, "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-7d66f834279e1780", "name": "Stray `console.log` in TS/JS \u2014 prisma/seed.ts:61", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed.ts:61"}, "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-cf1f84a3a007048c", "name": "Privileged port 465 in use", "shortDescription": {"text": "Privileged port 465 in use"}, "fullDescription": {"text": "Port 465 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-f990d89cd46c0a8d", "name": "Possible secret in src/app/admin/(panel)/usuarios/actions.ts", "shortDescription": {"text": "Possible secret in src/app/admin/(panel)/usuarios/actions.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-cb639d9a10a47b23", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "7 test file(s) for 201 source file(s) (ratio 0.03). 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 32 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 35 placeholder/mock markers across 18 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-9c562eb3dca8c18d", "name": "Commented-code block (6 lines) in src/app/admin/(panel)/sujetos/[id]/actions.ts:98", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/admin/(panel)/sujetos/[id]/actions.ts:98"}, "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-49a3e84595fcddbb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/storage.ts:84", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/storage.ts:84"}, "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-6822cd83bc74f427", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sanctions-ingest.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sanctions-ingest.ts:27"}, "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-0cb0fc3264264f50", "name": "Commented-code block (6 lines) in src/lib/pdf-renderer.ts:695", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/pdf-renderer.ts:695"}, "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-c77df394071f9214", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/aml/captcha.ts:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/aml/captcha.ts:63"}, "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-022e6399d1ef2beb", "name": "12 env vars used in code but missing from .env.example", "shortDescription": {"text": "12 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANTHROPIC_API_KEY`, `APIFLASH_KEY`, `BLOB_READ_WRITE_TOKEN`, `ENABLE_PLAYWRIGHT_CAPTURE`, `OPENSANCTIONS_API_KEY`, `SCRAPINGBEE_API_KEY`, `SMTP_HOST`, `SMTP_PASS` + 4 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/build_manual_client_pdf.py:wrap, scripts/build_manual_client_pdf.py:wrap\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}}]}}, "automationDetails": {"id": "repobility/23949"}, "properties": {"repository": "AGGOSUITE/uafe-portal", "repoUrl": "https://github.com/AGGOSUITE/uafe-portal", "branch": "main"}, "results": [{"ruleId": "scanner-a84f44f87bb18417", "level": "note", "message": {"text": "Possibly dead Python function: draw_cover"}, "properties": {"repobilityId": "fa9abf406242bd4c", "scanner": "scanner-primary", "fingerprint": "a84f44f87bb18417", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_manual_pdf.py:185"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-67a567739f73fa78", "level": "note", "message": {"text": "Possibly dead Python function: draw_footer"}, "properties": {"repobilityId": "148d0c69ff48f624", "scanner": "scanner-primary", "fingerprint": "67a567739f73fa78", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_manual_pdf.py:217"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c7b937b555504aea", "level": "note", "message": {"text": "Possibly dead Python function: wrap"}, "properties": {"repobilityId": "67bfdfc1acedae4b", "scanner": "scanner-primary", "fingerprint": "c7b937b555504aea", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_manual_client_pdf.py:612"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e6d6ad28a25b330a", "level": "note", "message": {"text": "Possibly dead Python function: draw"}, "properties": {"repobilityId": "53ecb21dcbad2db9", "scanner": "scanner-primary", "fingerprint": "e6d6ad28a25b330a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_manual_client_pdf.py:613"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-dbe99609c20f4aa9", "level": "note", "message": {"text": "Possibly dead Python function: m_login"}, "properties": {"repobilityId": "32d97013b30d0da1", "scanner": "scanner-primary", "fingerprint": "dbe99609c20f4aa9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_manual_client_pdf.py:125"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9d7d7f3effc47623", "level": "note", "message": {"text": "Possibly dead Python function: m_dashboard"}, "properties": {"repobilityId": "a9d4d4c39cebde3c", "scanner": "scanner-primary", "fingerprint": "9d7d7f3effc47623", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_manual_client_pdf.py:141"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-32cf33eb50674ffa", "level": "note", "message": {"text": "Possibly dead Python function: m_nuevo_sujeto"}, "properties": {"repobilityId": "69965ccea8cceb73", "scanner": "scanner-primary", "fingerprint": "32cf33eb50674ffa", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_manual_client_pdf.py:174"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-10658ae5ccb71e76", "level": "note", "message": {"text": "Possibly dead Python function: m_aml"}, "properties": {"repobilityId": "60bcee528000aa3c", "scanner": "scanner-primary", "fingerprint": "10658ae5ccb71e76", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_manual_client_pdf.py:191"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-eb54fc427ee70222", "level": "note", "message": {"text": "Possibly dead Python function: m_manual"}, "properties": {"repobilityId": "2bef36c317ac3b27", "scanner": "scanner-primary", "fingerprint": "eb54fc427ee70222", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_manual_client_pdf.py:223"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7563652d3ca6f474", "level": "note", "message": {"text": "Possibly dead Python function: m_riesgo"}, "properties": {"repobilityId": "b6c2e1c436e0482e", "scanner": "scanner-primary", "fingerprint": "7563652d3ca6f474", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_manual_client_pdf.py:247"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b8b0c3e41fcb1624", "level": "note", "message": {"text": "Possibly dead Python function: m_usuarios"}, "properties": {"repobilityId": "a5b7f02e5a64b9f5", "scanner": "scanner-primary", "fingerprint": "b8b0c3e41fcb1624", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_manual_client_pdf.py:274"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-52a89db57949c2f6", "level": "note", "message": {"text": "Possibly dead Python function: m_importar"}, "properties": {"repobilityId": "ce5e831e9a8aa633", "scanner": "scanner-primary", "fingerprint": "52a89db57949c2f6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_manual_client_pdf.py:296"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-07cc716f13f7d0a9", "level": "note", "message": {"text": "Possibly dead Python function: m_invitacion"}, "properties": {"repobilityId": "be8d520f4333a935", "scanner": "scanner-primary", "fingerprint": "07cc716f13f7d0a9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_manual_client_pdf.py:326"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8773a7772c18593e", "level": "note", "message": {"text": "Possibly dead Python function: m_revision"}, "properties": {"repobilityId": "7626f0951b63a637", "scanner": "scanner-primary", "fingerprint": "8773a7772c18593e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_manual_client_pdf.py:351"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2cb41c2bedb22dd8", "level": "note", "message": {"text": "Possibly dead Python function: m_informes"}, "properties": {"repobilityId": "1cfffbc8e2cf0249", "scanner": "scanner-primary", "fingerprint": "2cb41c2bedb22dd8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_manual_client_pdf.py:372"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e8bb43941ededd0e", "level": "note", "message": {"text": "Possibly dead Python function: m_reportes"}, "properties": {"repobilityId": "beb16a4532d6fd89", "scanner": "scanner-primary", "fingerprint": "e8bb43941ededd0e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_manual_client_pdf.py:400"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6280ae1f211f0908", "level": "note", "message": {"text": "Possibly dead Python function: m_plantillas"}, "properties": {"repobilityId": "12d59d9ad2e07309", "scanner": "scanner-primary", "fingerprint": "6280ae1f211f0908", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_manual_client_pdf.py:420"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-596e9d44fc2a6d0a", "level": "note", "message": {"text": "Possibly dead Python function: m_papelera"}, "properties": {"repobilityId": "00c918efe55c66a8", "scanner": "scanner-primary", "fingerprint": "596e9d44fc2a6d0a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_manual_client_pdf.py:440"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4acdb756e3965136", "level": "note", "message": {"text": "Possibly dead Python function: draw_cover"}, "properties": {"repobilityId": "fa9abf406242bd4c", "scanner": "scanner-primary", "fingerprint": "4acdb756e3965136", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_manual_client_pdf.py:617"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-383f505d28063fe1", "level": "note", "message": {"text": "Possibly dead Python function: draw_footer"}, "properties": {"repobilityId": "148d0c69ff48f624", "scanner": "scanner-primary", "fingerprint": "383f505d28063fe1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build_manual_client_pdf.py:639"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-b6af4eeac8b5137e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-cribado.ts:37"}, "properties": {"repobilityId": "800ca5f9fc1b7b1f", "scanner": "scanner-primary", "fingerprint": "b6af4eeac8b5137e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-db76e28bc07a09e5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-motor.ts:10"}, "properties": {"repobilityId": "9b6f90dc9a73f52f", "scanner": "scanner-primary", "fingerprint": "db76e28bc07a09e5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-753f3084f7698197", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/(panel)/layout.tsx:71"}, "properties": {"repobilityId": "0248ae0b4edf87bf", "scanner": "scanner-primary", "fingerprint": "753f3084f7698197", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8019e4b526f946c0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/(panel)/usuarios/company-multi-picker.tsx:32"}, "properties": {"repobilityId": "b6df41a6274481b5", "scanner": "scanner-primary", "fingerprint": "8019e4b526f946c0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e4a7a900467cb7ac", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/f/[token]/documentos/manager.tsx:80"}, "properties": {"repobilityId": "11214579670a720f", "scanner": "scanner-primary", "fingerprint": "e4a7a900467cb7ac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2b4a202556cb9b55", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email.ts:48"}, "properties": {"repobilityId": "bdf73540c4990d36", "scanner": "scanner-primary", "fingerprint": "2b4a202556cb9b55", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a4251511bb8667b9", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/cedula.ts:31"}, "properties": {"repobilityId": "176a4a53aa1a2f55", "scanner": "scanner-primary", "fingerprint": "a4251511bb8667b9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-3c757d34fe42192f", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/aml/report-pdf.ts:124"}, "properties": {"repobilityId": "971fdd7ede532c3e", "scanner": "scanner-primary", "fingerprint": "3c757d34fe42192f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-43dd96dba86ee995", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/aml/screenshot.ts:80"}, "properties": {"repobilityId": "321071d3fe91007a", "scanner": "scanner-primary", "fingerprint": "43dd96dba86ee995", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-017f14b90f3b2124", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/aml/playwright-capture.ts:40"}, "properties": {"repobilityId": "b0308d5adc744ee2", "scanner": "scanner-primary", "fingerprint": "017f14b90f3b2124", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-aa0db097b117774a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/aml/scrapingbee.ts:79"}, "properties": {"repobilityId": "1b4011e2efc65bdb", "scanner": "scanner-primary", "fingerprint": "aa0db097b117774a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7d66f834279e1780", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 prisma/seed.ts:61"}, "properties": {"repobilityId": "f77d7e0fb34b08e2", "scanner": "scanner-primary", "fingerprint": "7d66f834279e1780", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cf1f84a3a007048c", "level": "warning", "message": {"text": "Privileged port 465 in use"}, "properties": {"repobilityId": "bcd1f06b60a2b6bc", "scanner": "scanner-primary", "fingerprint": "cf1f84a3a007048c", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/email.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f990d89cd46c0a8d", "level": "error", "message": {"text": "Possible secret in src/app/admin/(panel)/usuarios/actions.ts"}, "properties": {"repobilityId": "64446d5a0ab7ada9", "scanner": "scanner-primary", "fingerprint": "f990d89cd46c0a8d", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/admin/(panel)/usuarios/actions.ts"}, "region": {"startLine": 289}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "edeab51902066991", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-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": "a433249077b90869", "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": "2c9a1248b51c1569", "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": "f3d5197b8b1a17fe", "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": "c74d781d5afca39f", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "2641a61b348c5639", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "6421553fb4c383be", "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-9c562eb3dca8c18d", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/admin/(panel)/sujetos/[id]/actions.ts:98"}, "properties": {"repobilityId": "a16226fc14eb0ffc", "scanner": "scanner-primary", "fingerprint": "9c562eb3dca8c18d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-49a3e84595fcddbb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/storage.ts:84"}, "properties": {"repobilityId": "c51817a2c23c8a0e", "scanner": "scanner-primary", "fingerprint": "49a3e84595fcddbb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6822cd83bc74f427", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sanctions-ingest.ts:27"}, "properties": {"repobilityId": "6d5f8cf77aafb0be", "scanner": "scanner-primary", "fingerprint": "6822cd83bc74f427", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0cb0fc3264264f50", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/pdf-renderer.ts:695"}, "properties": {"repobilityId": "b8946c1b04638933", "scanner": "scanner-primary", "fingerprint": "0cb0fc3264264f50", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c77df394071f9214", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/aml/captcha.ts:63"}, "properties": {"repobilityId": "34d7b4478d145c8f", "scanner": "scanner-primary", "fingerprint": "c77df394071f9214", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-022e6399d1ef2beb", "level": "note", "message": {"text": "12 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "7bf4178327da75a2", "scanner": "scanner-primary", "fingerprint": "022e6399d1ef2beb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "f88c5f859163eb9e", "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": "cf9691d56f232dd2", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}